.NET Core 如何部署到Docker(菜鸟篇)
我的.net core 版本为3.1,centos 版本为7.0
在Centos下安装Docker
这里参考此篇文章:Docker从入门到实践-在centos下安装Docker
如果下载慢就更换yum的软件源:
配置文件路径为: /etc/yum.repos.d/docker-ce.repo
安装完成后进行测试:docker run hello-world
输出如图所示的内容就表示安装成功:
.NET Core 配置
这里的重点是需要一个 Dockerfile
文件,无需后缀文件名。
这个文件可以通过在创建项目的时候勾选 启用Docker支持 的选项生成,也可以自己在项目的根目录中新建一个,如图所示:
如何写一个 Dockerfile
文件是本次文章内容重点。
Dockerfile格式
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
#FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
EXPOSE 80
EXPOSE 443
RUN apt-get update -y && apt-get install -y libgdiplus && apt-get clean && ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
RUN cd /usr/local/src
RUN mkdir DockerAsPose
WORKDIR /usr/local/src/DockerAsPose
COPY . .
ENTRYPOINT ["dotnet", "PPTDemo.dll"]
第一条 FROM
指令是拉取一个基础镜像,这里可以使用微软提供的官方镜像。据说还有一个体积更小的。这条命令必须放在第一行。
然后是 EXPOSE
指令,这是告诉Docker 容器对外暴露的端口。
EXPOSE指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。
再然后是 RUN
指令,这里可以执行你想要执行的命令,比如安装某个依赖库。(我这里安装的是 libgdiplus
,是图形处理方面的。
直到 COPY
指令前都是在指定地方创建一个目录,COPY . .
是将当前所有文件复制到你创建的工作目录中。
最后就是 ENTRYPOINT
指令 就是告诉程序的入口点是哪个。这里的 PPTDemo.dll就是你程序发布后生成的dll文件。
最终发布
在发布以前,你可以像以前一样通过文件夹的形式发布项目,最后会得到一堆dll文件以及你的 web.config
,Dockerfile
等文件。
这个时候你需要把你的发布文件夹内的所有内容上传到服务器的相关目录,可以通过 xftp 的方式上传。
上传完以后就是剩下最后一步,将程序部署到Docker**中,这里我们需要以下2个命令来完成这部分操作:
#1.以下命令是构建一个镜像,镜像名称可以为XX.XXX.XX的格式,最后一定要以"."结尾
docker build -t test.iamge.docker .
#2.以下命令是让镜像在一个指定容器中运行,前面是容器名称,后面是镜像名称,-p 是指定容器的运行端口
docker run --name=testdockercontainer -p 5000:80 -d test.iamge.docker
运行完以后就可以通过 curl
命令查看你的程序了。curl http://localhost:5000
,
如果以后每次需要更新程序的话,需要重新执行以下命令:
- 停止容器
- 删除容器
- 删除镜像
- 构建镜像
- 在指定容器中运行镜像
为了减少麻烦,以上命令可以放到一个可执行文件中,以后每次就执行这个文件。build.sh
#!/bin/bash
cd ./my-publish
docker stop mycontainer
docker rm mycontainer
docker rmi my.api:v1
docker build -t my.api:v1 .
docker run --name=mycontainer -p 5000:80 -d my.api:v1
相关命令
docker ps
列出所有正在运行的容器docker stop 容器名称或ID
停止某个容器docker ps -a
列出所有容器(包括已停止的容器)docker images
列出所有镜像docker rm 容器名称或ID
删除某个容器docker rmi 镜像名称或ID
删除某个镜像firewall-cmd --zone=public --add-port=5899/tcp --permanent
打开防火墙的指定端口firewall-cmd --query-port=80/tcp
查询防火墙指定端口是否打开:set ff
vim 打开后查看文件的格式:set ff=unix
vim打开文件后,设置文件格式为unix