1.编写Dockerfile文件
将编写好的.NET Core项目发布至指定文件夹,在发布文件夹下添加名为Dokcerfile文件,需要注意此文件没有后缀,同时需要注意文件名的大小写,如下图所示:
因为项目中存在swagger,添加配置Gis_server.xml
微信图片_20210806145130.png
对应的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
#看了我需要连接的 Sql Server 的版本,微软官方的版本支持对应列表,发现不支持 TLS 1.2,只支持 TLS 1.1
#所以调整版本为 1.1 即可,修改 Dockerfile,加入如下命令:
RUN sed -i 's/TLSv1.2/TLSv1.0/g' /etc/ssl/openssl.cnf
#启动程序
ENTRYPOINT ["dotnet", "Gis_server.API.dll"]
2.生成docker镜像
Dockerfile文件编写完成后,上传至CentOS目录下切换进入目录,在此目录构建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 images
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
apitest v1 1fdf012e6474 4 hours ago 232MB
mcr.microsoft.com/dotnet/core/aspnet 3.1-buster-slim f7c8bae90990 7 days ago 208MB
nginx latest 08b152afcfae 2 weeks ago 133MB
3.运行容器
执行下面命令运行生成的容器,需要注意一下几点:
挂载目录,映射容器内目录到宿主机,如文件下载、上传等
端口,宿主机与容器内端口号映射,容器内端口号要保证与Dockerfile文件内一致
自动重启,设置restart属性为always,防止宿主机或者docker重启后容器停止
# 启动容器
docker run -d -p 8001:5000 --restart=always --name apitest apitest: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
4.访问接口
在网内其他终端或者宿主机访问http://IP:8001/swagger/index.html即可查看运行效果
5.错误排查
如果容器启动失败或错误,跟踪容器日志
docker logs -f -t --tail 20 b1cf1984f209 #容器ID
SqlException:ConnectionTimeout Expired. The timeout period elapsed during the post-login phase
Microsoft.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired. The timeout period elapsed during the post-login phase. The connection could have timed out while waiting for server to complete the login process and respond; Or it could have timed out while attempting to create multiple active connections. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=1; handshake=25; [Login] initialization=0; authentication=0; [Post-Login] complete=14000;
SqlClient现在不支持Linux的SP1连接。Sqlserver 2008 R2需要升级安装SP3 Service Pack
https://www.microsoft.com/en-us/download/details.aspx?id=44271