使用docker部署Asp.net core web应用程序

 

执行以下命令拉取aspnetcore2.2镜像:

[root@localhost ~]# docker pull mcr.microsoft.com/dotnet/core/aspnet:2.2

拉取成功后执行docker images命令,如果能看到aspnetcore镜像,则表示拉取成功。

[root@localhost ~]# docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE

 

mcr.microsoft.com/dotnet/core/aspnet    2.2              521411f3b61d        3 days ago          261 MB

 

制作自己的应用镜像

1.创建Dockerfile文件

我们先在临时目录创建Dockerfile,待会我们的asp.net core web应用也会放在临时目录。

[root@localhost ~]# cd /tmp
[root@localhost tmp]# vi Dockerfile

将下面代码拷贝进去,保存并退出。

FROM docker.io/microsoft/aspnetcore
WORKDIR /app
COPY ./songlou .
EXPOSE 8080
CMD ["dotnet", "SongLou.Web.dll"]

注:上面设置的EXPOSE 8080,不需要跟launchSettings.json的

applicationUrl属性中设置的端口一致,applicationUrl中的端口只是在调试时起作用。经过实验,这儿端口随便设置。关于端口更多信息可查看本文尾。
 

对上面五行代码做下说明:

FROM表示新镜像所依赖的基础镜像。

WORKDIR表示你的asp.net core web应用放在容器的哪个目录,这里是/app目录,没有会自动创建

COPY表示拷贝当前系统下的哪个目录,这里是songlou目录,把要发布的网站拷贝到该目录下面

EXPOSE表示暴露出来的端口号,和容器的端口号对应。这里默认是80。

CMD表示执行的命令,即运行我们自己的asp.net core web程序。

想办法将你的asp.net core web发布程序拷贝到centos系统的/tmp里面,COPY对应的目录,如下:

COPY ./songlou .

2.创建镜像

[root@localhost tmp]# docker build -t mycore .

后面的英文符号“.”不能去掉,mycore表示你的镜像名称。如果出现Step1-Step5,则表示镜像创建成功。

 
Sending build context to Docker daemon 7.426 MB
Step 1/5 : FROM docker.io/microsoft/aspnetcore
 ---> c4ca78cf9dca
Step 2/5 : WORKDIR /app
 ---> Using cache
 ---> 1ddb7788a4a9
Step 3/5 : COPY ./songlou .
 ---> bfad39b69b61
Removing intermediate container c9170e38b598
Step 4/5 : EXPOSE 8080
 ---> Running in 7b5381a9e64c
 ---> be22e6986e1d
Removing intermediate container 7b5381a9e64c
Step 5/5 : CMD dotnet SongLou.Web.dll
 ---> Running in 697cdaf9d864
 ---> 44150b234924
Removing intermediate container 697cdaf9d864
Successfully built 44150b234924
 

再次查看所有镜像

[root@localhost tmp]# docker images

再次查看所有镜像,我们会看到:

REPOSITORY                       TAG                 IMAGE ID            CREATED              SIZE
mycore                           latest              44150b234924        About a minute ago   332 MB
docker.io/microsoft/dotnet   latest              521411f3b61d        3 days ago          1.73 GB

除了我们从官网拉取的aspnetcore镜像,还有一个我们自己创建的镜像:mycore。

3.运行容器

[root@localhost tmp]# docker run --name mycore -p 8080:80 -d mycore

第一个mycore表示容器名称,第二个mycore表示镜像名称

注意 -p 8080:80端口号,前面是对外的端口号,可随便设置,通过http://ip:8080访问,后面是容器对外的端口,但又不是上面EXPOSE 8080设置的端口,可查看容器运行日志,.net core程序默认是以80端口启动的,这就是上面容器端口为什么是80。

执行后会出现新容器的ID:2859330db3a5c6113b0ccdf6e9d78e7e36ea17f6c4de495514c4ec8901ed9218

4.执行curl命令访问我们的网站

[root@localhost tmp]# curl http://localhost:8080

运行结果:

{"str":"test","environmen":null,"username":null,"password":null}

[root@localhost tmp]# curl http://192.168.1.160:8080

用IP访问看到的结果也是一样的:

{"str":"test","environmen":null,"username":null,"password":null}

或者是在windows操作系统里的浏览器地址栏输入:http://192.168.1.160:8080/看到的结果也是一样的。

至此大功告成。

5.进入容器

[root@localhost tmp]# docker exec -it mycore /bin/bash

exec命令可以进入docker容器,然后像使用centos操作系统一样。在里面进行操作。


 

查看容器日志,发现

Now listening on: http://[::]:80

这就能解释上面的端口疑问了

 

[root@localhost demo]# docker logs 6028d7b75923786c43a543ff8f61d1088140434ab4b70a28856b707154351912
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {cacdd312-37fe-43de-95a0-c7ce2e475b96} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.
[root@localhost demo]#

 

.net core可以通过如下代码设置启动端口,不设置的话就是上面的默认80端口

WebHost.CreateDefaultBuilder(args)
                .UseKestrel()
                .UseIISIntegration()
                .UseUrls("http://*:9001")
                .UseStartup<Startup>();

 

通常的Dockfile是这样

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
WORKDIR /app
COPY ./WebApplication16 .
EXPOSE 9002
CMD ["dotnet", "WebApplication16.dll", "--server.urls", "http://*:9002"]
"--server.urls", "http://*:9002"这两没实际作用,就是命令行参数,除非在.net core中接收命令行参数做处理
EXPOSE 9002 这个貌似设置成啥都可以

 

posted @ 2019-01-18 11:23  xtjatswc  阅读(726)  评论(0编辑  收藏  举报