本文主要说明使用.NET Core 3.1搭建的站点如何使用docker打包并运行容器供外网访问。
开发环境
Windows 10
Visual Studio 2019
.NET Core 3.1
部署环境
CentOS 8
Docker 1.19.03
编写Dockerfile文件
将编写好的.NET Core项目发布至指定文件夹,在发布文件夹下添加名为Dokcerfile文件,需要注意此文件没有后缀,同时需要注意文件名的大小写,如下图所示:
对应的Dockerfile文件如下所示:
#引入镜像,低版本 docker 去掉 AS base 这里要注意踩过坑 #换成别人做的阿里镜像
#FROM registry.cn-hangzhou.aliyuncs.com/newbe36524
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base #配置工作目录 相当于cd WORKDIR /app #暴露容器端口,此端口与程序运行路径一致,可 EXPOSE 5000 #复制文件到工作目录 COPY . . #ENV :配置系统环境变量,比如程序环境环境等在这里配置(开发、预发、线上环境) #这里是配置程序运行端口,如果程序不使用默认的80端口这里一定要设置(程序运行端口) ENV ASPNETCORE_URLS http://+:5000 #设置时间为中国上海,默认为UTC时间 ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone #启动程序 ENTRYPOINT ["dotnet", "DotNetCore.API.dll"]
生成Docker镜像
Dockerfile文件编写完成后,上传至CentOS目录下,如下所示:
[root@localhost web]# ll total 376 -rw-r--r--. 1 root root 162 Aug 25 13:56 appsettings.Development.json -rw-r--r--. 1 root root 192 Aug 25 13:56 appsettings.json -rw-r--r--. 1 root root 850 Aug 27 00:55 Dockerfile -rw-r--r--. 1 root root 106577 Aug 27 2020 DotNetCore.API.deps.json -rw-r--r--. 1 root root 8192 Aug 27 2020 DotNetCore.API.dll -rw-r--r--. 1 root root 174592 Aug 27 2020 DotNetCore.API.exe -rw-r--r--. 1 root root 19480 Aug 27 2020 DotNetCore.API.pdb -rw-r--r--. 1 root root 224 Aug 25 14:04 DotNetCore.API.runtimeconfig.json -rw-r--r--. 1 root root 25088 Aug 27 2020 DotNetCore.API.Views.dll -rw-r--r--. 1 root root 20032 Aug 27 2020 DotNetCore.API.Views.pdb -rw-r--r--. 1 root root 558 Aug 27 2020 web.config drwxr-xr-x. 5 root root 57 Aug 25 14:04 wwwroot
在此目录下执行构建docker镜像命令。
# 构建docker image docker build -t apitest:v1 . 注意最后面有个点,代表当前目录 # 执行结果 Sending build context to Docker daemon 4.755MB Step 1/8 : FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base 3.1-buster-slim: Pulling from dotnet/core/aspnet bf5952930446: Pull complete 95f9f5484a21: Pull complete ebc43d54b0d9: Pull complete eb8b3fc30ae1: Pull complete c42d79623507: Pull complete Digest: sha256:3209fc5e97bcc9d4137d603baf7971475435a3760fbcbba13a4a13ecb973bdb8 Status: Downloaded newer image for mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim ---> bdca989bc8d3 Step 2/8 : WORKDIR /app ---> Running in e1bc2cdcce7e Removing intermediate container e1bc2cdcce7e ---> d115392570f1 Step 3/8 : EXPOSE 8001 ---> Running in 7329d738bc32 Removing intermediate container 7329d738bc32 ---> facb418c8e93 Step 4/8 : COPY . . ---> db32752819a7 Step 5/8 : ENV ASPNETCORE_URLS http://+:5000 ---> Running in aa6129a3c24d Removing intermediate container aa6129a3c24d ---> 26dbc37969a1 Step 6/8 : ENV TZ=Asia/Shanghai ---> Running in 5972afb49e7b Removing intermediate container 5972afb49e7b ---> 8ba512fe33ac Step 7/8 : RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone ---> Running in 7af56acee843 Removing intermediate container 7af56acee843 ---> 6063c7efb5e3 Step 8/8 : ENTRYPOINT ["dotnet", "DotNetCore.API.dll"] ---> Running in a5747e363825 Removing intermediate container a5747e363825 ---> 490d51c5dfb0 Successfully built 490d51c5dfb0 Successfully tagged apitest:v1
此时,Docker镜像已经构建完成,可以查看下构建结果。
# 查看构建后的docker image docker images # 执行结果 REPOSITORY TAG IMAGE ID CREATED SIZE apitest v1 490d51c5dfb0 9 seconds ago 212MB mcr.microsoft.com/dotnet/core/aspnet 3.1-buster-slim bdca989bc8d3 2 weeks ago 207MB
运行容器
执行下面命令运行生成的容器,需要注意一下几点:
- 挂载目录,映射容器内目录到宿主机,如文件下载、上传等
- 端口,宿主机与容器内端口号映射,容器内端口号要保证与Dockerfile文件内一致
- 自动重启,设置restart属性为always,防止宿主机或者docker重启后容器停止
# 启动容器 docker run -d -p 8001:5000 --restart=always --name api.test api.test:v1 # 查看已经启动的容器 docker ps 或者 docker container ls # 执行结果 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 306917290c1c api.test:v1 "dotnet DotNetCore.A…" 6 seconds ago Up 4 seconds 0.0.0.0:8001->5000/tcp api.test
访问接口
在网内其他终端或者宿主机访问http://192.168.43.131:8001/api/test/getstr即可查看运行效果