.NET Core 应用部署到 Docker

最近申请到了微软 Azure  免费虚拟主机,于是便有了将本站迁移到 Azure 的想法。因本站是基于 .NET Core 开发,原本是托管在 Linux 主机上,打算在 Azure 上使用 Docker 进行部署。几经折腾,总算是部署成功了,现将部署过程记录下来,便于日后查阅。

1、创建 Dockerfile

Dockerfile 用于将应用编译打包成为 Docker 镜像。由于我的应用基于 Visual Studio 2019 (以下称“VS2019”)开发,创建 Dockerfile 非常简单,选择应用启动项目(本站为 Web 项目),右键选择“添加”->“Docker 支持...”即可完成 Dockerfile 创建, VS2019 将在该启动项目根目录下创建 Dockerfile,并根据应用依赖关系,自动生成 Dockerfile 内容,如果无额外的需要,该 Dockerfile 可直接用于编译镜像。

这里需要注意的是,由于本站图片使用了水印图片,需要把水印图片复制到应用根目录下,Dockerfile 需要添加一条额外的内容:

COPY ["Notex.WebUI/watermark.png", "."]

同时,在 VS2019 中必须设置文件 watermark.png 属性为“内容”,否则无法复制成功。

2、编译镜像

编译镜像遇到一个坑,也是自己对 Docker 编译机制不了解所致,这个坑就是编译中执行文件复制命令的时候,老是报文件不存在(如下图示)

Docker 编译错误信息
Docker 编译错误信息

其实出现这个问题的原因是 Dockerfile 已经在启动项目目录(Notex.WebUI)下,执行"Notex.WebUI/nuget.config", "."指令时,一定是找不到对应文件夹或文件的。解决这个问题的方法很简单,将 Dockerfile 转移到解决方案根目录下,然后在该根目录下执行编译,编译指令:docker build -t -name:tag .,其中name为镜像名称,tag 一般用于指定镜像版本,注意最后的点号(.)不要忽略了,本站的编译示例如下:

docker build -t notexapp:1.1 .

由于国内网络原因,编译时下载相关依赖文件是个相当慢长的过程,为了加快速度,建议使用阿里云的镜像资源,实现方法可从网上查找参考资料。

3、推送镜像

为了能在其它服务器上获取镜像,需要将编译完成的镜像推送到  Docker Hub 上。因此,需要在 Docker 上创建仓储库(repository),公开或私有仓储库均可,根据实际需要而定。本站仓储库(zhiyongpeng/notexapp)为私有。

在推送之前,还要完成一件事情,就是重命名镜像名称,否则将推送失败。以本站上述生成的镜像为例,重命名镜像名称指令如下:

docker tag notexapp:1.1 zhiyongpeng/notexapp:1.1

重命名镜像名称指令执行完成后,就可以推送镜像包了:

docker push zhiyongpeng/notexapp:1.1

推送成功后,Docker Hub 上便可查看相应的包资源。

Docker Hub包示例
Docker Hub包示例

4、拉取镜像

对于私有仓储库中的镜像,拉取前必须进行登陆授权,否则因权限不足而拉取失败。拉取镜像指令如下:

docker pull zhiyongpeng/notexapp:1.1

5、运行容器

Docker 容器有多种网络形式,本站使用 host 网络,这样便可直接访问本地机器上的数据库。由于安全原因,以下运行容器指令已做脱敏处理:

sudo docker run --net=host -e "ASPNETCORE_URLS=https://pzy.io:443" -e "ASPNETCORE_Kestrel__Certificates__Default__Password=ssl_cert_password" -e "ASPNETCORE_Kestrel__Certificates__Default__Path=ssl_cert_path" -e "ASPNETCORE_ENVIRONMENT=Production" -v local_ssl_cert_path:ssl_cert_path --restart=always -d --name container-name zhiyongpeng/notexapp:1.1

容器启动后,可通过以下指令进入容器内部

docker exec -it [container_id] bash

《.NET Core 应用部署到 Docker》的相关评论

发表评论

必填项已用 * 标记,邮箱地址不会被公开。