.NetCore项目在Liunx中使用Docker容器托管详解
本文实例环境及版本Centos7、Docker-ce-19.03.9、.NetCore3.1
Docker简介
Docker基于 Go 语言 并遵从 Apache2.0 协议开源。是一个轻量级的虚拟机(VMWare) Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。
Docker的两句口号
第一句“Build, Ship and Run” 搭建、发送、运行”
第二句“Build once,Run anywhere(搭建一次,到处能用)”
Docker 采用的是 Client/Server 架构,包含client,docker daemon服务端,image镜像,registry软件仓库,docker container共5部分。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 socket 或 REST API 与远程的服务器通信。
关于Docker的一些本质
1、容器其实就是Linux下一个特殊的进程
2、Docker容器通过namespace实现进程隔离通过cgroups实现资源限制
3、Docker镜像(rootfs)是一个操作系统的所有文件和目录而不包括内核,Docker镜像是共享宿主机的内核的
4、Docker镜像是以只读方式挂载,所有的增删改都只会作用在容器层, 但是相同的文件会覆盖掉下一层,这种方式也被称为"Copy-on-write"
一句话总结:Docker容器比虚拟机轻量多了!
现Docker包括了 Docker-EE 和 Docker-CE,前者是企业收费版,后者是社区免费版。
Docker涉及了三个核心概念:Register、Image、Container。
1、Registry:仓库。用来存储Docker镜像,比如Docker官方的Docker Hub就是一个公开的仓库,在上面我们可以下载我们需要的镜像。
2、Image:镜像。开发人员创建一个应用程序或服务,并将它及其依赖关系打包到一个容器镜像中。镜像是应用程序的配置及其依赖关系的静态形式。
3、Container:容器。Container是镜像的运行实例,它是一个隔离的、资源受控的可移植的运行时环境,其中包含操作系统、需要运行的程序、运行程序的相关依赖、环境变量等。
Docker的安装
Docker支持Centos7/8
在Centos7中安装docker有两种方法
1、安装默认版本
CentOS已经将Docker软件包放在了Extras软件源中,直接利用即可
yum install docker 或 yum install docker‐io ‐y
此版本说明:目前在centos7上yum install docker,默认安装的docker版本号为1.13.1,那么此版本是企业版还是社区版呢?带着这个疑问,我这里追溯下版本发布历史,查了一下docker-1.13.1发布的时间为2017年2月8日,docker正式宣布推出企业版的时间为2017年3月2日。看到这里大家应该明白了,docker是在1.13.1后正式推出企业版,版本号也从此发生了变化,由原来的1.13.1升级到了17.03(即表示17年3月),从此docker有了docker-ee和docker-ce之分。因此总结centos7默认安装的docker是免费的版本,可以说是社区版。
此版本如果要卸载
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine rm -rf /etc/systemd/system/docker.service.d rm -rf /var/lib/docker rm -rf /var/run/docker
2、自定义安装Docker社区版 Docker-ce
第一次在服务器上安装需要安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
设置stable镜像仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
或
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
查看可用版本,从高到低
yum list docker-ce.x86_64 --showduplicates | sort -r
yum list docker-ce --showduplicate | sort -r
该软件包名称是软件包名称(Docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。
此处指定版本Docker-ce-19.03.9进行安装
yum install docker-ce-19.03.9 docker-ce-cli-19.03.9 containerd.io
#如果要安装最新版本
yum -y install docker-ce
等待安装查,看安装的Docker版本
docker -v
如果要删除此版本的Docker
#列出已安装Docker包的具体的名字
sudo yum list installed | grep docker
#删除docker
sudo yum -y remove containerd.io.x86_64 \
docker-ce.x86_64 \
docker-ce-cli.x86_64
#直接删除Docker
sudo yum remove docker \
docker-io \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#备注:以上命令只会删除Docker运行环境,并不会删除镜像,容器,卷文件,以及用户创建的配置文件。
#清除镜像和容器文件:
sudo rm -rf /var/lib/docker
#安装成功后手动启动Docker
sudo systemctl start docker
sudo systemctl stop docker #停止Docker
sudo systemctl restart
docker #重启Docker
创建使用 Dockerfile
为了将 .NET Core 应用程序进行容器化,我们需要为程序编写一个 Dockerfile 文件注意该文件没有后缀名,正如其名称一样,该文件的名字也需要命名为 Dockerfile,然后将其放入程序根目录下。
我们有两种创建 Dockerfile 文件的方式
1、通过开发工具 visual studio 右键点击项目:添加-> Docker 支持选择Linux (不推荐)
尽量不要使用这样的方式,创建镜像很慢也不一定创建成功
2、手动创建Dockerfile
一个标准的 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 #指定该站点该项目的内部启动端口,此处为5011 ENV ASPNETCORE_URLS http://+:5011 #暴露docker容器端口 EXPOSE 5011 //EXPOSE 443 //Https 端口开启 #复制文件到工作目录 COPY . . #设置程序的运行环境环境 ENV ASPNETCORE_ENVIRONMENT=Development #设置Docker时间为中国上海 ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone #安装vim / vi RUN apt-get update && apt-get install -y vim && apt-get install -y libgdiplus #启动程序 ENTRYPOINT ["dotnet", "Mzpro.dll"] #精简版如 FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base WORKDIR /app EXPOSE 5011 COPY . . ENV ASPNETCORE_ENVIRONMENT=Development ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone RUN apt-get update && apt-get install -y vim && apt-get install -y libgdiplus ENTRYPOINT ["dotnet", "Mzpro.dll"]
将创建好的Dockerfile文件上传至服务器上发布好根目录下
根据dockerfile创建镜像及容器/Docker的应用
创建镜像 image文件 (-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。:1.0为版本 PS:注意最后的 点)需要花点时间耐心等待
sudo docker build -t mzpro:1.0 .
#查看当前镜像 sudo docker images #删除镜像 docker image rm 0602856d297d #image id
创建一个容器,一个镜像可以创建多个不同配置的容器
#创建一个名字为mzpro2.0的容器并设置重启restart=always(无论退出状态是如何,都重启容器)在后台运行,将环境变量设置为Test并对应80端口。 sudo docker run --restart always -d -p 80:5011 -e ASPNETCORE_ENVIRONMENT=Test --name=mzpro2.0 mzpro:1.0
参数说明: -d: 后台运行容器,并返回容器ID -p: 端口映射 格式为:容器暴露的端口号(也就是最后访问时的端口):主机(宿主、应用程序)的端口
-e: 设置环境变量 --name: 为容器指定一个名称,后面为镜像的名称。注意名称只能为英文字母小数点和数字和下画线。 其他参数说明: -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; -d: 后台运行容器,并返回容器ID; -i: 以交互模式运行容器,通常与 -t 同时使用; -P: 随机端口映射,容器内部端口随机映射到主机的端口 -p: 指定端口映射,格式为:主机(宿主)端口:容器端口 -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; --name="nginx-lb": 为容器指定一个名称; --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致; --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致; -h "mars": 指定容器的hostname; -e username="ritchie": 设置环境变量; --env-file=[]: 从指定文件读入环境变量; --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行; -m :设置容器使用内存最大值; --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型; --link=[]: 添加链接到另一个容器; --expose=[]: 开放一个端口或一组端口; --volume , -v: 绑定一个卷 --restart=[option] :no - 容器退出时,不重启容器;on-failure - 设置尝试重新启动容器的最大次数(--restart=on-failure:10); always - 无论退出状态是如何,都重启容器;如果创建时未指定 --restart=always ,可通过update 命令;docker update --restart=always 容器ID
容器操作命令
#查看运行着的容器 sudo docker ps -a #停掉一个容器 docker stop df7926f88409 #容器ID #启动一个停止的容器 docker start df7926f88409 #容器ID
#删除一个容器(删除之前要先停掉)
docker rm df7926f88409 #容器ID
#重启一个容器
docker restart #容器ID
#删除所有容器
docker rm $(sudo docker ps -a -q)
至此通过服务器80端口即可访问我们的应用程序
Docker设置开机启动
#设置Docker 开机启动
systemctl enable docker.service
#关闭开机启动
systemctl disable docker.service
#查看开机启动项
systemctl list-unit-files | grep enable
#查看已启动的服务
systemctl list-units --type=service
才疏学浅,相关文档等仅供自我总结,如有相关问题可留言交流谢谢。