Docker Compose
- 用处:定义、运行多个容器的程序,批量容器编排。
- YAML配置文件
- single command指令学习
- 使用Compose三个步骤:
- 定义Dockerfile
- 编写docker-compose.yaml
- 运行compose,docker-cmpose up启动
- 安装docker-compose
- Linux
- Docker Compose存放在Git Hub,高速安装Docker Compose如下:
curl -L <https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-`uname> -s`-`uname -m` > /usr/local/bin/docker-compose
- 给compose指令赋予可执行的权利
chmod +x /usr/local/bin/docker-compose
- 检测是否安装成功,不成功的话就需要重启服务器
[root@Contos7 ~]# docker-compose version docker-compose version 1.27.4, build 40524192 docker-py version: 4.3.1 CPython version: 3.7.7 OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
- Mac
- mac其实不需要安装,因为Docker Desktop中就自带compose。
- compose初体验 📦
- 创建项目结构:
mkdir composetest && cd composetest
- 创建
app.py
文件,也就是项目文件:
import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host='redis', port=6379) def get_hit_count(): retries = 5 while True: try: return cache.incr('hits') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5) @app.route('/') def hello(): count = get_hit_count() return 'Hello World! I have been seen {} times.\\n'.format(count)
- 建立requirements.txt文件
flask redis
- 编写Dockerfile
#将python:3.7-alpine作为基础镜像 FROM python:3.7-alpine #设置工作目录 WORKDIR /code #设置环境变量 ENV FLASK_APP=app.py #设置主机匹配所有地址,即所有主机可访问 ENV FLASK_RUN_HOST=0.0.0.0 #安装包的时候不安装到全局 #使员工gcc来编译程序,但是一旦程序被编译,我就不再需要gcc了,并且可以加快编译速度 RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt EXPOSE 5000 COPY . . CMD ["flask", "run"]
- 编写docker-compose.yml
#docker-compose版本号 version: "3.9" services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"
- 在docker-compose.yml所在目录使用docker-compose up启动(定义、运行多个容器),docker-compose down停止
- Tips⚠️ :这样创建出的容器的名字是当前docker-compose.yaml所在目录的目录名加上yml中的服务名,尾部的num表示该容器的副本数量,这些副本可以发送到其他机器上运行,compose会构建一个默认的网络(不使用docker0),所有容器默认在一个网络中
- 使用idea用docker-compose打包发布
- 复制jar包pom配置
<!--复制jar包到指定目录--> <plugin> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <id>gen-webadmin</id> <phase>package</phase> <configuration> <tasks> <copy todir="docker" file="target/${project.artifactId}-${project.version}.${project.packaging}" /> </tasks> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin>
- yam规则
https://docs.docker.com/compose/compose-file/compose-file-v3/
docker-compose.yaml核心
#三层 #compops版本号 version: "xxx" #服务配置 services: server1: configuration1: configuration2: configuration3: configuration4 #启动顺序控制,先启动数组中的服务项,最后再启动本服务 depends_on: .... server2: configuration1 .... #全局配置 netowkr volume
- 使用docker-compose.yml构建wordpress博客园
- docker-compose.yml
version: "3.8" services: db: image: mysql:5.7 volumes: - db_datas:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest ports: - "5000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: db_datas: {}
- 使用docker-compose up -d可以让其在后台启动,不加-d表示在前台启动
Docker Swarm
- Swarm是Docker公司推出的用来管理docker集群的平台.
- Swarm集成在Docker中无需安装
- 工作原理
- 常用命令
- 作为集群的管理docker swarm
- 初始化一个
swarmdocker swarm init - 指定初始化ip地址节点
docker swarm init --advertise-addr 管理端IP地址 - 去除本地之外的所有管理器身份
docker swarm init --force-new-cluster - 将节点加入swarm集群,两种加入模式manager与worker
docker swarm join - 工作节点加入管理节点需要通过join-token认证
docker swarm join-token - 重新获取docker获取初始化命令
docker swarm join-token worker - 离开swarm
docker swarm leave - 对swarm集群更新配置
docker swarm update
- 管理swarm节点docker node
- 查看集群中的节点
docker node ls - 将manager角色降级为worker
docker node demote 主机名 - 将worker角色升级为manager
docker node promote 主机名 - 查看节点的详细信息,默认json格式
docker node inspect 主机名 - 查看节点信息平铺格式
docker node inspect --pretty 主机名 - 查看运行的一个或多个及节点任务数,默认当前节点
docker node ps - 从swarm中删除一个节点
docker node rm 主机名 - 更新一个节点
docker node update - 对节点设置状态(“active”正常|“pause”暂停|“drain”排除自身work任务)
docker node update --availability
- 服务管理docker service
- 创建一个服务
docker service create - 创建的副本数
docker service create --replicas 副本数 - 指定容器名称
docker service create --name 名字 - 每次容器与容器之间的更新时间间隔。
docker service create --update-delay s秒 - 更新时同时并行更新数量,默认1
docker service create --update-parallelism 个数 - 任务容器更新失败时的模式,(“pause”停止|”continue“继续),默认pause。
docker service create --update-failure-action 类型 - 每次容器与容器之间的回滚时间间隔。
docker service create --rollback-monitor 20s - 回滚故障率如果小于百分比允许运行
docker service create --rollback-max-failure-ratio .数值(列“.2”为%20) - 添加网络
docker service create --network 网络名 - 创建volume类型数据卷
docker service create --mount type=volume,src=volume名称,dst=容器目录 - 创建bind读写目录挂载
docker service create --mount type=bind,src=宿主目录,dst=容器目录 - 创建bind只读目录挂载
docker service create --mount type=bind,src=宿主目录,dst=容器目录,readonly - 创建dnsrr负载均衡模式
docker service create --endpoint-mode dnsrr 服务名 - 创建docker配置文件到容器本地目录
docker service create --config source=docker配置文件,target=配置文件路径 - 创建添加端口
docker service create --publish 暴露端口:容器端口 服务名
- 搭建Docker集群[双主双从]
- manager节点和Leader节点是可以触达的
- docker swarm init -advertise-addr [初始化集群,节点为主节点发起集群,公网/内网ip]
- docker swarm join-token worker/manager 获取令牌,该令牌将未加入集群的节点变成w/m
- docker node ls 查看加入集群的节点
- Raft协议
- 双主双从:假设一个节点挂了!其他节点是否可用
- Raft协议:保证大多数节点存活才能用!主节点至少要>3台!
- 实验:
- 原本的双主双从配置如下分布
- 将swarm1停掉,在swarm4为上使用docker node ls查看集群状态,会发现卡住[验证双主双从的缺点]
- 启动swarm1会发现原本为管理节点的swarm4变成主节点leader,现在启动的swarm1变成管理节点Reachable
- 让swarm3 leave集群,节点列表不会删除会显示
STATUS=Down
- 当swarm3重新加入集群之后,原本的那条STATUS还是会存在,只不过会有一个新的集群id,可以用docker node rm id将其记录删除
- Tips ⚠️ :如果是某一个节点短暂的时间因为故障停掉了,然后又回来了,那么原本Down的那条记录就会变回Ready,效果不是和leave一样!切记!
- 将双主双从转变成准守Raft协议,实验如下:
- 在swarm2上使用docker swarm leave先让其离开集群
- 在有权限的manager或者leader上获得manager的令牌docker swarm join-token manager
- 将令牌给swarm2,则swarm2变成Reachable节点
- 停掉swarm2,不会让集群停止,会显示不可达。这就是保证高可用。遵守Raft协议
- Swarm创建弹性服务
- 弹性!扩缩容!集群!
- 容器、副本、服务。
- docker-compose up !启动单个项目,单机。
- 集群swarm:docker service...
- 灰度发布/金丝雀发布
灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度,而我们平常所说的金丝雀部署也就是灰度发布的一种方式
- Tips ⚠️ :
docker run
启动容器,不具备扩缩容的功能!docker service
服务启动,具有扩缩容的功能,滚动更新!
- 实例操作:
- 在基于Raft协议的基础上操作。
docker service create -p 5000:80 —name=menginx nginx
创建nginx服务docker service inspect menginx
查看menginx服务的元数据docker service update —replicas 3 menginx
扩展多个副本数量,也就是启动多个nginx服务
- Tips ⚠️ :访问的时候地址是init初始化docker集群时的地址,不管这台主机是否正常只要有两台台以上的MR存活,集群就会向外提供服务。docker node ls查看到某个ID后面有星号说明当前正处于该服务器下。
docker service scale menginx=5
scale的作用和update效果一样的扩缩容- 概念总结
- Swarm:集群的管理和编号
- Node:就是一个docker节点
- Service:任务,可以管理节点或者工作节点来运行
- Task:容器内的命令
- 不变逻辑
命令→ 管理→api →调度→工作节点(创建Task容器维护创建) - 调整service以什么方式运行
#每个工作节点上运行一个任务 docker service --mode global #按照一定规则在各个工作节点上运行指定个数的任务。 docker service --mode replicated
- 拓展:网络模式 "PublishMode": "ingress"
- Swarm:
- Overlay:将几台不同的服务器上的,ip是不同的,使用Overlay将集群变成一个整体,加入一个共同的网络。
- "ingress":特殊的Overlay网络!负载均衡!IPVS VIP
Docker Stack
- docker-compose 单机部署
- docker stack 集群部署
[root@Swarm004 ~]# docker secret --help Usage: docker secret COMMAND Manage Docker secrets Commands: create Create a secret from a file or STDIN as content inspect Display detailed information on one or more secrets ls List secrets rm Remove one or more secrets Run 'docker secret COMMAND --help' for more information on a command. [root@Swarm004 ~]# docker stack --help Usage: docker stack [OPTIONS] COMMAND Manage Docker stacks Options: --orchestrator string Orchestrator to use (swarm|kubernetes|all) Commands: deploy Deploy a new stack or update an existing stack ls List stacks ps List the tasks in the stack rm Remove one or more stacks services List the services in the stack Run 'docker stack COMMAND --help' for more information on a command.
- 例如:使用Docker stack集群部署wordpress,compose还是👆的compose
docker stack deploy example --compose-file=docker-compose.yml
Docker Secret
安全!配置密码,证书。
[root@Swarm004 ~]# docker secret --help Usage: docker secret COMMAND Manage Docker secrets Commands: create Create a secret from a file or STDIN as content inspect Display detailed information on one or more secrets ls List secrets rm Remove one or more secrets Run 'docker secret COMMAND --help' for more information on a command.
Docker Config
配置
[root@Swarm004 ~]# docker config --help Usage: docker config COMMAND Manage Docker configs Commands: create Create a config from a file or STDIN inspect Display detailed information on one or more configs ls List configs rm Remove one or more configs Run 'docker config COMMAND --help' for more information on a command.