技术 思绪 摘录 旅行
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。这篇文章记录一下,在Windows Docker环境下,将ASP.NET Core程序打包成镜像,并推送到DockerHub上。

基础知识准备:

    1、安装Docker。

    2、镜像和容器有基本的认识,知道是什么东西。

    3、知道Docker的大概原理。

    4、熟悉Docker容器和镜像操作的基本命令。


一、创建一个ASP.NET Core Web的项目,命名为[DockerDemo1],目的是为了看效果。所以得选择有默认结构的。

image.png

直接运行一下,能看到界面,没啥问题。

image.png

为了方便演示,我需要指定一下启动端口,修改Program.cs,设置成5000,不然默认就是80。

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder
                    .UseUrls("http://*:5000")
                    .UseStartup<Startup>();
                });

二、在项目根目录下,编写Dockerfile文件,这个文件没有后缀名,可以先创建txt文件,再删除后缀名。

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "DockerDemo1.dll"]

    FROM:通常情况下,你要创建的镜像是依赖或者基于另外一个镜像的,这就需要使用FROM,当然也可以完全从头开始。

    MAINTAINER:该镜像的维护人。

    RUN:定义一些需要运行的命令,例如 npm install,dotnet restore等。

    COPY:开发的时候,可以把源码放在Volumes里面,而在生产环境下,经常需要把代码复制到容器里面,使用COPY就可以做到。

    ENTRYPOINT:它可以定义容器的入口,把容器配置成像exe一样的运行文件,通常是一些例如dotnet命令、Node命令等。

    CMD:设置容器运行的默认命令和参数。当容器运行的时候,这个可以在命令行覆盖。

    WORKDIR:设定容器运行的工作目录。

    EXPOSE:暴露端口。

    ENV:设定环境变量。

    VOLUME:定义volume,并控制如何在宿主中进行存储。

image.png

三、打包镜像,将我们的ASP.NET Core项目打包成Docker镜像。

>cd [项目根目录]  //docker文件就在根目录
>docker build -t 1140067636/mycoreweb .

    11400676是我的Docker账户名,mycoreweb是自定义的镜像名称,这是我命名方法,当然你也可以随意命名,也可以加上tag,比如:Nginx:5.6

    小数点代表本次执行的上下文路径,打包的时候,代表这个目录下所有的文件。

image.png

四、打包过程会依次拉取依赖的所有镜像,等待打包成功。

    查询本地镜像,就可以看到名为[1140067636/mycoreweb]的镜像了。

    此时,镜像已经打包到我们本地Docker服务了,本地可以使用。

docker run -d --name mycore -p 8080:5000 -v ${PWD}:/app/out 1140067636/mycoreweb

    -d:后台运行的方式来运行,不然ASP.NET Core的宿主程序的日志会霸占控制台的界面,不好操作啊。

    -p:端口设置,将容器的5000端口映射到宿主服务器的8080端口,因为程序的用的5000端口。

    ${PWD}:代表了当前路径,在Windows PowerShell中、Linux中通用,但是Windows如果使用CMD来操作的话,你得换成 %cd%

    /app/out:是docker文件中,对应的COPY --from=build-env /app/out,相当于打包后的文件位置。

    --name:给我的运行的容器示例,取个名字。

image.png

五、查看容器,已经创建成功了。

    浏览器访问一下:http://localhost:8080

六、发布镜像,镜像不可能永远在本机嘛,分布式部署还需要部署到其他服务器去。

    这时,我们需要把刚刚的镜像,推送到Docker Hub上,然后其他服务器就可以pull下来,直接创建容器了。

>docker login  //需要登录Docker
>docker push 1140067636/mycoreweb    //推送本地镜像

image.png

七、模拟另一台服务器部署。

docker stop mycore    //停止容器
docker rm mycore    //删除容器
docker rmi 1140067636/mycoreweb    //删除本地镜像
docker pull 1140067636/mycoreweb   //拉取远程镜像
docker run -d   -p 8080:5000 --name mycoreweb 1140067636/mycoreweb  //创建新的容器

到这里就结束了,往往我们的项目不只是一个服务,可能有很多服务需要部署,比如mysql、订单、产品、用户中心等,这时候需要我们使用Docker Compose和容器网络来实现,将我们整个项目所需的服务一起运行,而容器网络,可以让Docker容器的隔离环境实现通信。


CarsonIT 微信扫码关注公众号 策略、创意、技术

留下您的脚步

 

最近评论

查看更多>>

热点推荐

友情打赏

请打开您的微信,扫一扫