.net core 微服务之 Docker(编排、集群)

 

Docker 容器编排(Docker Compose)

docker的基础应用这里就讲了,如果不知道怎样安装可以看这篇文章.

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose 使用 YML 文件来配置应用程序需要的所有服务。然后使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

简单来说就是一个命令行工具,文件内容指向所有需要创建服务的Dockerfile,每次只需要运行这个命令行文件就可以创建所有的服务。

docker-compose通过新建并创建一个docker-compose.yml 文件定义构成应用程序的服务的,这个文件是通过yml(类似于Json)写的

yml 参考地址:https://www.runoob.com/w3cnote/yaml-intro.html

docker-compose.yml核心配置

docker-compose 命令行内容官方参考地址:  https://docs.docker.com/compose/compose-file/

		version 指定compose版本 最好是3.0以上版本 目前最新是3.8版本
		services 配置容器[容器列表]
			nginx: #配置容器标识(唯一编号)
			   image: #配置容器镜像
			   ports: #配置容器映射端口号[数组]
			   networks: #配置容器网络[数组]
		networks 网络指定配置
			nginx-rmcore: #配置网络名称
			    external: true #网络自定义
		volumes 数据挂载配置
		extensions 扩展配置

docker-compose 示例

1. 准备两个测试的.net core的项目(一个叫test1 , 一个叫test2),把他们发布后包含Dockerfile的文件拷贝到服务器上面,这里贴一个test1 Dockerfile文件内容,这个系统也可以自动生成

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /src
COPY . .
EXPOSE 80
ENTRYPOINT ["dotnet", "test1.dll"]

Dockerfile 官方参考地址: https://docs.docker.com/engine/reference/builder/

指令内容:

     FROM:指定基础镜像(FROM是必备的指令,并且必须为第一条指令)。

  RUN: 用来执行命令行命令。其基本格式:

      shell格式: RUN  <命令>  ,输入在bash环境中的命令即可,一个dockerfile允许使用RUN不得超过127层,所以,使用一次RUN, 使用 ‘ \ ’ 换行,使用‘ && ’执行下一条命令。一般使用此种格式;

      exec格式: RUN  <"可执行文件", "参数1", "参数2">,此种方式像是函数调用中的格式;

  COPY:  复制文件。 其基本格式:

      格式1:COPY <源路径>...<目标路径>

      格式2:COPY [“<源路径1>”,....."<目标路径>"]

  ADD: 更高级的复制文件,在COPY的基础上增加了一些功能,如果复制的是压缩包的话,会直接解压,而不需要在使用RUN解压;

  CMD:容器启动命令。其基本格式:

      shell格式: CMD <命令>

      exec格式: CMD ["可执行文件", "参数1", "参数2"...]

      参数列表格式: CMD [“参数1”, “参数2”...],在指定了ENTRYPOINT指令后,用CMD指定具体的参数

  ENTRYPOINT: 入口点。其基本格式分为exec和shell,

      ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。ENTRYPOINT在运行中可以替代,不过比CMD繁琐,需要通过docker run 的参数--entrypoint 来指定。当指定了ENTRYPOINT后,CMD的含义就发生了改变,不在是直接运行其命令,而是将CMD的内容作为参数传递给ENTRYPOINT指令。其执行时就变成了:  <ENTRYPOINT> "<CMD>"

  ENV: 设置环境变量。(都可以使用这里使用的变量)其基本格式:

      格式1:ENV <key> <value>

      格式2:ENV <key1>=<value1> <key2>=<value>...

  ARG: 构建参数。构建参数和ENV的效果一样,都是设置环境变量,所不同的是ARG所构建的环境变量在将来容器运行时是不存在的。其基本格式:

      格式1: ARG <参数名> [=<默认值>]

      格式2: 该默认值可以在构建命令 docker build  中用 --build-arg <参数名>=<值> 来覆盖

  VOLUME: 定义匿名卷。 其基本格式:

      格式1: VOLUME ["<路径1>", "<路径2>"...]

      格式2: VOLUME <路径>

  EXPOSE:  暴露端口。EXPOSE指令是声明运行时容器所提供的端口,在启动容器时不会在因为这个声明而开启端口。 其基本格式:

      格式1: EXPOSE <端口1> [<端口2>...]

  WORKDIR: 指定工作目录。其基本格式:

      格式1: WORKDIR <工作目录路径>

  USER: 指定当前用户。USER是帮助你切换到指定用户。 其基本格式:

      格式1: USER <用户名>

  HEALTCHECK: 健康检查,判断容器的状态是否正常。 其基本格式:

      格式1: HEALTCHECK [选项] CMD <命令> :设置检查容器健康状况的命令

      格式2: HEALTCHECK NONE: 如果基础镜像有健康检查指令,使用此格式可以屏蔽掉其健康检查指令
指令内容

贴一下常见的命令

	FROM  指定基础镜像构建
		写法:
		FROM 指定基础镜像

	COPY  复制命令。从上下文目录中复制文件或者目录到容器里指定路径。

		写法:

		COPY 源路径,目标路径

		COPY ["源路径","目标路径"]	

	RUN  运行指令。构建的时候运行的指令

		主要在于镜像构建的时候运行,运行build命令的时候 

		后面接的命令就是shell输入的命令
	
		写法

		RUN  shell命令 参数1 参数2

		RUN ["shell命令 ","参数1"," 参数2"]

		例如:

		RUN ["echo",">"," /usr/share/index.html"]

	CMD  运行指令。运行容器时候运行的指令

		主要在于镜像运行容器的时候生成,运行run的时候运行

		写法

		CMD <shell 命令> 
		CMD ["<可执行文件或命令>","<param1>","<param2>",...] 

		例如:

		CMD ["dotnet","rmcore.dll"]

		缺点:在run 命令后面可以进行覆盖

		docker run -d -P  rmcore dotnet rmcore.dll 进行覆盖掉

     ENTRYPOINT  运行指令。运行容器时候运行的指令(不会被覆盖)

		写法

		ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

		可以和CMD动态结合,设置动态的配置参数

		例如 

		ENTRYPOINT ["nginx", "-c"] 定参

		CMD ["/etc/nginx/nginx.conf"]变参

     EXPOSE  暴露端口指令

		仅仅声明端口,就是指定镜像暴露的端口

		在run 的时候,通过docker run -p 会自动随机映射到EXPOSE端口

		写法

		EXPOSE 端口

		EXPOSE 端口

		例如 

		EXPOSE 5000

		EXPOSE 5001

    WORKDIR  工作目录指令
		用于应用在容器内的工作目录,就好比:ruanmou目录
	
		写法

		WORKDIR <工作目录路径>

		例如

		WORKDIR /rmcore

		或者

		WORKDIR /nginx

  

2. 创建一个叫compose文件夹,文件夹中创建docker-compose.yml 文件(一定要这个名称),文件内容

version: '3'    #版本号
services:
         fcbtest1:    #服务唯一名称,随便起名
                   build: ../test1   #test1项目位置,也就是Dockerfile所在位置 
                   ports:
                        - 6066:80     #外网映射端口号:内网端口号
                        - 6067:443
         fcbtest2:
                   build: ../test2
                   ports:
                       - 6068:80

3.  进入到 docker-compose.yml 文件所在目录, 运行命令 

docker-compose up -d

运行成功之后就可以看到生成了两个镜像文件 compose_fcbtest1 和 compose_fcbtest2 说明成功了

手动docker run 一下两个镜像,运行其中一个

Docker 集群

集群概念

集群:不同服务实例来共同提供服务的一组集合

集群分类

对称集群:不同服务实例,功能地位相等(每一个实例提供的功能机会相同) 。 

    特点:数据计算(不会存储任何状态)

    例如:Nginx

非对称集群:不同服务实例,功能地位不相等(每一个实例提供功能的机会不相同)

              特点:数据存储(会存储数据状态)

    例如:Redis、Docker(因为会存储镜像和容器,所以属于非对称集群)

 

 

Docker Swarm

swarm是docker官方提供的集群工具。。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机

特点

1、单点故障问题

​2、性能问题

核心概念

node :节点概念,docker 别名

task :在集群环境中,用来运行容器

service : 指不同节点容器集合,用来维护容器

stack : stack的集合,用来维护service

manager:管理节点(容器服务管理,集群配置)

worker : 工作节点

Docker集群示例

创建管理节点

docker swarm init --advertise-addr [当前主机ip]

创建成功后会提供工作节点添加方式,其中包含一串token,直接把命令整个复制,放到需要添加为工作节点的主机上面执行就行了

 

创建 工作节点

例如这里就执行上面创建管理节点返回的命令

docker swarm join --token SWMTKN-1-1p1jdsrxh6dsoajcs8uol72d5siw5ap4cxa6a7gyw5zezhf8jv-7bui8196ans11v1dze33fgpcv 192.168.230.130:2377

创建完成之后,执行 docker info 可以看到 swarm的状态

也可以直接通过 docker node ls 命令查看集群状态

创建服务

1. 创建服务

docker service create --replicas 2 --name fcbtestservice_test2 compose_fcbtest1
--replicas 配置服务副本(容器在不同节点启动,也就是随机启动多少个节点)
--name 服务名称(service名称)
--compose_fcbtest1 需要实例化容器的镜像名

 

 2. 服务列表

docker service ls

3. 查看服务运行在哪个节点

docker service ps fcbtestservice_test2

4. 服务扩展(向其他节点添加服务副本)

docker service scale fcbtestservice_test2=2

5. 删除服务

docker service rm fcbtestservice_test2

6. 服务设置外部访问端口

docker service create --replicas 2  --name fcbtestservice_test2  --publish 6066:80 compose_fcbtest1

这里通过docker ps 看不到映射的端口,只有通过docker service ls 可以查看监控到的端口映射。注意,这里如果外网访问不到,注意检查主机的网络问题

使用satck 管理服务、批量处理 

上面我们只能一个一个去创建指定镜像的集群,如果我们想一次性创建多个镜像的集群,那么我们就要用到了statck 。就相当于是批量处理,也就会用到文章开头的docker-compose.yml , 配置大概差不多,只是会新增一些选项

1. 准备一个 docker-compose.yml 文件.这里复制一下之前的稍微改动一下

version: '3'
services:
         fcbtest1:
                   image: compose_fcbtest1   #镜像名称
                   ports:
                        - 6076:80     #映射端口号
                        - 6077:443
                   deploy: #集群模式配置 
                        mode: replicated   #配置副本模式,如果为replicated必须配置replicas。还可以配置gload,全局模式
                        replicas: 2   #副本份数
         fcbtest2:
                   image: compose_fcbtest2    #镜像名称
                   ports:
                       - 6078:80
                   deploy:
                        mode: replicated
                        replicas: 2

关于stack  docker-compose.yml 中deploy 的所有配置说明

endpoint_mode:访问集群服务的方式。
	endpoint_mode: vip 
	# Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。
	endpoint_mode: dnsrr
	# DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。
labels:在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。

mode:指定服务提供的模式。
	replicated:复制服务,复制指定服务到集群的机器上。
    global:全局服务,服务将部署至集群的每个节点。	
replicas:mode 为 replicated 时,需要使用此参数配置具体运行的节点数量。

resources:配置服务器资源使用的限制,例如上例子,配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。

restart_policy:配置如何在退出容器时重新启动容器。

condition:可选 none,on-failure 或者 any(默认值:any)。
	delay:设置多久之后重启(默认值:0)。
	max_attempts:尝试重新启动容器的次数,超出次数,则不再尝试(默认值:一直重试)。
	window:设置容器重启超时时间(默认值:0)。
	rollback_config:配置在更新失败的情况下应如何回滚服务。

parallelism:一次要回滚的容器数。如果设置为0,则所有容器将同时回滚。
	delay:每个容器组回滚之间等待的时间(默认为0s)。
	failure_action:如果回滚失败,该怎么办。其中一个 continue 或者 pause(默认pause)。
	monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
	max_failure_ratio:在回滚期间可以容忍的故障率(默认为0)。
	order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认 stop-first )。
	update_config:配置应如何更新服务,对于配置滚动更新很有用。

parallelism:一次更新的容器数。
	delay:在更新一组容器之间等待的时间。
	failure_action:如果更新失败,该怎么办。其中一个 continue,rollback 或者pause (默认:pause)。
	monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
	max_failure_ratio:在更新过程中可以容忍的故障率。
	order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认stop-first)

2. 在当前目录中执行一下

docker stack deploy -c docker-compose.yml fcbstack

#  -c 是指定docker-compose.yml文件
#  fcbstack 指定stack 标识(名称)

3. 此时已经部署成功了,查看stack 列表

docker stack ls

4. 查看stack 服务列表信息 

docker stack ps fcbstack

5. 删除 stack

docker stack rm fcbstacks 

 分别在两台服务器上找一个容器看看效果

 

posted @ 2023-02-15 16:27  Joni是只狗  阅读(397)  评论(0编辑  收藏  举报