docker 部署.net core 3.1程序
公司部署网站一般是需要三台服务器,数据库服务器,应用服务器以及一台通讯服务器(环保行业需要稳定的数据接收服务,并进行入库),这种部署方式无疑给销售带来了麻烦,别人家都是1台服务器就够了,而我们却需要三台服务器,不占优势,并且,如果小木较小,也神请三台服务器很容易造成浪费,所以领导决定使用docker来做程序的部署,对程序进行隔离,小项目一台服务器搞定,并且所有项目都开始迁移到云上,这也是为什么上docker的背景了。
docker安装
安装所需的软件包,yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
使用命令来设置docker仓库(阿里源,官方源太慢了)
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker
sudo yum install docker-ce docker-ce-cli containerd.io
启动docker并设置开机启动
启动docker
sudo systemctl start docker
设置开机启动
sudo systemctl enable docker
设置镜像加速器
登录阿里云控制台,并搜索 容器镜像服务 并选择镜像加速器
按照步骤设置镜像加速器
docker使用
接下来就是使用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 AS base #修复调用System.Drawing生成图片时确少 libgdiplus 的问题 RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list RUN apt-get update -y && apt-get install -y libgdiplus && apt-get clean && ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll WORKDIR /app EXPOSE 5004 COPY . . ENTRYPOINT ["dotnet", "TyFrame.WebApi.dll"]
FROM:定制的镜像都是基于 FROM 的镜像,这里的asp.net core:3.1就是定制需要的基础镜像。后续的操作都是基于asp.net core:3.1。
RUN:用于执行后面跟着的命令行命令。这里是因为基础镜像中确少依赖 libgdiplus 需要安装否则无法生成验证码。
WORKDIR :工作目录。
EXPOSE :声明端口,帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射,在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
CPOY :复制指令,从上下文目录中复制文件或者目录到容器里指定路径,COPY . . 意思是将本机的当前目录拷贝到容器中的工作目录中。
ENTRYPOINT :类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
将编译好的发布文件复制到安装好docker的机器上,进入该目录执行如下命令进行构建镜像:
sudo docker build -t tyframeapi .
-t:镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
如需要了解更多参数,https://docs.docker.com/engine/reference/commandline/build/
现在可以通过如下命令查看镜像列表:
使用构建好的镜像启动容器
sudo docker run --name tyframeapi -v /etc/localtime:/etc/localtime:ro -d -p 5001:5001 tyframeapi
--name:为容器指定一个名称
-v:挂载一个卷,-v /etc/localtime:/etc/localtime:ro 挂载本机的/etc/localtime到容器内的/etc/localtime :ro readonly
-d:后台运行容器,并返回容器ID
-p:指定端口映射,格式为:主机(宿主)端口:容器端口
tyframeapi:指定容器装载的镜像
如需要了解更多参数,https://docs.docker.com/engine/reference/commandline/run/
通过docker ps –a查看容器运行情况
看到STATUS 为UP状态访问该服务器的5001端口,网站可以正常访问,docker的安装和部署就完整完成了,由于很少使用Linux并且公司其他人使用的也不多,所以就采用了Jenkins来做持续集成。