CentOS7+Docker部署ASP.NET Core3.1应用
Docker介绍(引用自https://www.runoob.com/docker/docker-tutorial.html)
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。Docker容器实际上是Docker镜像的“运行实例”。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们这里用社区版(即docker -ce)。
准备系统和工具
centos7.8、Xftp6、Xshell6、VMware Workstation Pro 15
备注:Xftp6和Xshell6官方有个人版,不收费。下载地址:https://www.xshell.com/zh/free-for-home-school/
-
首先在VM中安装一个centos7.8的虚拟机,账号root,密码123456 ,网络选择桥接方式。(后续操作都是基于root账号,如果是非root账号,请在命令前加上sudo ,如:sudo yum update)
-
开启虚拟机,并输入账号密码登录后首先更新linux系统
命令:yum update
提示选择【y/n】时输入y即可
看到Complete!表示更新完成
-
查看虚拟机IP地址
命令:ip addr
-
为了操作更加方便,也符合实际应用场景,我们使用xshell6登录到虚拟机。
用户身份验证选择密码验证,并输入账号和虚拟机密码
点击链接后弹出如下提示,选择-接受并保存(下次就不会再要求输入密码了)
成功登录到虚拟机
接下来在centos7系统中安装docker
-
为了方便添加软件源,支持 devicemapper 存储类型,安装如下软件包(\分割多条命令)
命令:
yum install -y yum-utils
yum install -y device-mapper-persistent-data
yum install -y lvm2
执行结果如下:
-
添加 yum 软件源,添加 Docker 稳定版本的 yum 软件源(逐行执行)
命令:yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
此处执行结果如下:
-
安装docker-ce
命令:yum install docker-ce
这里会下载docker安装包,根据网速不同,需要的时间不同,耐心等待,提示【y/d/n】时输入y
输入y继续下载包文件
网速太慢,等的我N急,让他继续下载……,我去上个厕所,稍后回来
终于安装好了,如下图:
-
默认的 docker 组是没有用户的(也就是说需要使用 sudo 才能使用 docker 命令)。
您可以将用户添加到 docker 组中(此用户就可以直接使用 docker 命令了),将root用户加入docker组
命令:usermod -aG docker root
-
设置docker开机启动
命令:systemctl enable docker
-
启动docker
命令:systemctl start docker
-
停止docker
命令:systemctl stop docker
-
更新docker -ce
命令:yum update docker-ce
-
再次启动docker
命令:systemctl start docker
-
查看docker信息
命令:docker info
我们的docker版本为19.03.9,还没有容器运行(还没启动),如果docker没启动的话,执行docker info会返回错误信息,具体自己试验下。
-
卸载docker(根据需要执行)
命令:yum remove docker-ce
-
删除本地docker文件(docker 的本地文件,包括镜像(images), 容器(containers), 存储卷(volumes)等,都需要手工删除。默认目录存储在 /var/lib/docker)
命令:rm -rf /var/lib/docker
-
检查docker是否可以正常运行(运行hello-world镜像,如果本机没有hello-world镜像,系统会自动拉取hello-world镜像)
命令:docker run hello-world
上图提示没有找到hello-world镜像,稍后会自动拉取该镜像。
拉取成功后,再次执行docker run hello-world 如下图:
看到Hello from Docker!表示,docker运行正常
-
下载微软官方推荐的基础镜像(搭建了.NET CORE 3.1运行环境)
命令:docker pull mcr.microsoft.com/dotnet/core/aspnet:3.1
-
查看本地的镜像
命令:docker images
现在有mcr.microsoft.com/dotnet/core/aspnet:3.1 和 hello-world两个镜像
-
创建一个.net core3.1的webapi项目,名称为OrderApp,并添加一个控制器,添加一个get接口
在Program中指定端口为5000
发布为文件(部署模式为框架依赖,因为镜像中已经包含了运行环境)
-
使用xftp6工具链接到虚拟机(协议选择SFTP)
-
我们在虚拟机中创建一个我们自己的目录,用来构建docker镜像时使用
命令:mkdir data
mkdir data命令是在当前目录(我这里是根目录)创建data目录,然后cd到data目录中,在data目录下创建一个docker目录,在docker目录下新建app目录
目录结构为:/data/docker/app
-
我这里是使用Dokerfile方式构建镜像,所以我们要添加一个Dokerfile文件
打开Dockerfile文件内容为:
我们将Dockerfile文件的内容替换为:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
MAINTAINER PDF
LABEL description="orderservice webapi"
LABEL version="1.0"
WORKDIR /app
COPY . .
EXPOSE 5000
ENV ASPNETCORE_ENVIRONMENT Production
ENTRYPOINT ["dotnet","OrderApp.dll"]
替换后为:
内容说明:
FROM 基于那个镜像来构建新的镜像
MAINTAINER 镜像构建者是谁
LABEL 用来添加备注信息,以便以后可以查看这个镜像的信息
WORKDIR 镜像的工作目录(这里的工作目录为app目录)
COPY 复制文件(将Dockerfile文件所在的当前目录下的文件复制到镜像中的工作目录中)
EXPOSE 容器要开放的端口(我们用.NET CORE默认的5000端口)
ENV 设置环境变量(我们设置ASPNETCORE_ENVIRONMENT变量值为Production)
ENTRYPOINT 为容器启动后要执行的命令 (这里将执行dotnet OrderApp.dll命令)
-
我们用Xftp6将Dockerfile文件和发布后的.NET CORE项目文件上传到虚拟机的/data/docker/app目录中
上传后:
-
虚拟机防火墙打开5000端口(如果没安装防火墙需要先安装防火墙 )
防火墙常用相关命令:
防火墙常用相关命令:
永久开启端口:firewall-cmd --add-port=8888/tcp --zone=public --permanent
永久关闭端口:firewall-cmd --remove-port=8888/tcp --zone=public --permanent
安装:yum install firewalld
启动: systemctl start firewalld
重启:firewall-cmd --reload
关闭: systemctl stop firewalld
查看状态: systemctl status firewalld
开机禁用 : systemctl disable firewalld
开机启用 : systemctl enable firewalld
查看开启的端口:firewall-cmd --list-all
开放5000端口
命令:firewall-cmd --add-port=5000/tcp --zone=public --permanent
(--permanent表示永久开放5000端口,否则重启防火墙后,5000端口将被关闭)
命令含义:
–zone #作用域
–add-port=5000/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效
关闭5000端口
命令:firewall-cmd --remove-port=5000/tcp --zone=public --permanent
重启防火墙
命令:firewall-cmd --reload
查看防火墙状态:
命令:systemctl status firewalld
查看防火墙已经开放的端口
命令:firewall-cmd --list-all
可以看到,我们已经开放了5000端口
-
构建docker镜像
进入/data/docker/app文件夹下(ls命令为查看目录中所有文件)
构建名称为pdf/orderserviec,版本号为V1的镜像(警告:命令末尾有个空格和.号)
命令:docker build -t pdf/orderapp .
查看当前系统中已有的镜像
命令:docker images
创建并运行容器
命令:docker run -d -p 5000:5000 pdf/orderapp
命令说明:
-d 以后台模式运行(和服务等效)
-p 将容器的5000端口映射到主机的5000端口(主机端口:容器端口,若不指定则将容器的80端口映射到主机随机端口)
查看docker运行日志
命令:docker logs confident_hodgkin
这里我们看到容器运行后正在监听5000端口
说明:confident_hodgkin为docker容器名称,用docker run 命令创建的容器,名称是随机生成的,如果要指定容器名称,可以使用docker run --name 命令来创建容器。(强烈建议指定容器名称,否则会增加维护难度)
命令:docker run --name pdf_orderapp_client1 -d -p 5000:5000 pdf/orderapp
命令说明:
--name 指定容器名称(我这里指定的名称为pdf_orderapp_client1)
访问5000端口
我们再运行一个容器,用虚拟机的4999端口来访问
命令:docker run -d -p 4999:5000 pdf/orderapp
访问4999端口
这样,我们就可以在一台虚拟机中或物理机中创建很多个独立运行的容器了。
最后:
更多docker命令学习请参考:https://www.runoob.com/docker/docker-command-manual.html
小插曲:
一开始我使用主机的6000端口映射到容器的5000端口,而firefox和google浏览器不允许访问6000端口,大家避免踩坑。