.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

  

才疏学浅,相关文档等仅供自我总结,如有相关问题可留言交流谢谢。

 

posted @ 2021-03-07 17:41  独角马  阅读(232)  评论(0编辑  收藏  举报