使用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的
对上面五行代码做下说明:
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 这个貌似设置成啥都可以