.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
分别在两台服务器上找一个容器看看效果