1、docker compose
docker compose 可以快速对 docker 容器集群编排,部署分布式应用。与 dockerfile 定义单独的应用容器不同,通过 docker-compose.yml 模板文件来定义一组相关联的容器为一个项目。
- 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
- 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。compose 的默认管理对象是项目
1.1、compose 安装
linux 平台直接使用 github release 编译好的二进制文件即可。
# 安装 wget https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-linux-x86_64 sudo cp -arf docker-compose-linux-x86_64 /usr/bin/docker-compose sudo chmod +x /usr/bin/docker-compose # 卸载 sudo rm /usr/bin/docker-compose
1.2、compose 命令
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
命令选项
-f '指定使用的 Compose 模板文件,默认为 docker-compose.yml
命令类型
# 验证配置文件格式是否正确,正确则显示配置 docker-compose config # 构建或重构镜像 docker compose build [OPTIONS] [SERVICE...] # 创建并启动服务 docker compose up [OPTIONS] [SERVICE...] # 停止并移除服务(容器、网络) docker compose down [OPTIONS] # 进入指定容器 docker compose exec [OPTIONS] SERVICE COMMAND [ARGS...] # 查看服务镜像 docker-compose images # 查看运行的容器 docker-compose ps # 查看服务日志 docker compose logs [OPTIONS] [SERVICE...] # 停止服务 docker compose stop [OPTIONS] [SERVICE...] # 删除服务 docker compose rm [OPTIONS] [SERVICE...] # 拉取服务依赖的镜像 docker-compose pull [options] [SERVICE...] # 推送服务依赖的镜像 docker compose push [OPTIONS] [SERVICE...]
1.3、yml 配置指令
1.4、实例
本地新建目录,并拉取代码:helloworld
第 1 步,编写 Dockerfile
FROM golang:1.18 ADD ./helloworld /go/src/helloworld/ WORKDIR /go/src/helloworld RUN go env -w GOPROXY=$http_proxy RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app . FROM ubuntu:latest COPY ./helloworld/curl-amd64 /usr/bin/curl RUN chmod +x /usr/bin/curl ENV env1=env1value ENV env2=env2value MAINTAINER nick WORKDIR /app/ COPY --from=0 /go/src/helloworld/app ./ EXPOSE 80 ENTRYPOINT ["./app"] CMD ["--param1=p1","--param2=p2"]
测试 dockefile
# 创建镜像 docker build -t hello:1.0.0 -f Dockerfile.compose . --build-arg http_proxy=https://proxy.golang.com.cn,https://goproxy.cn,direct # 创建容器 docker run -d -p 81:80 hello:1.0.0 # 健康测试 statuscode=`curl -o /dev/null -s -w %{http_code} http://localhost:81/health` echo $statuscode # 终端输出:200 # 删除该容器 docker rm -f 容器id
第 2 步,编写 docker-compose.yml
# 指定版本 version: "3.7" # 定义项目中的服务 services: # 1、服务名:web web: # 根据配置构建镜像 build: # 构建镜像的上下文 context: . # 构建镜像的 dockerfile dockerfile: Dockerfile.compose # 构建参数 args: http_proxy: https://proxy.golang.com.cn,https://goproxy.cn,direct # 设置labels元数据 labels: - myhello:1.0 - env:prod # 为构建的镜像指定tags tags: - "myhello:1.0.0" - "192.168.88.132:5000/myhello:1.0.0" # 指定容器名称 container_name: "myweb" # 设置容器依赖关系,该 web 服务依赖于 redis 服务 depends_on: - redis # 运行容器的端口映射 ports: - "80:80" # 覆盖容器的 cmd 指令 command: ["--param1=1","--param2=2"] # 设置环境变量 environment: env1: "a" env2: "b" # 健康检查 healthcheck: # 检查命令 test: ["CMD","curl","http://localhost/health"] test: ["CMD-SHELL","statuscode=`curl -o /dev/null -s -w %{http_code} http://localhost:81/health`;[$$statuscode -le 400] || exit"] # 检查时间间隔 interval: 5s # 检查超时时间 timeout: 1s # 重试次数,即连续失败指定次数则判定为不健康 retries: 5 # 设置容器初始化时间,再次期间不报告健康检查状态 start_period: 5s # 使用定义的网络 networks: - mynetwork - net1 # 2、redis 服务 redis: # 服务启动镜像 image: "redis:latest" container_name: "myredis" # 容器暴露端口 expose: - 6379 # 指定容器启动命令,即覆盖cmd指令 command: redis-server --requirepass 123456 # 数据卷设置 volumes: - /data networks: - mynetwork - net2 # 定义网络 networks: net1: {} net2: {} mynetwork: ipam: driver: default config: - subnet: "172.16.238.0/24"
实验流程
# 检查配置文件 docker-compose -f docker-compose.yml config # 构建并启动服务 docker-compose up -d # 查看运行的服务 docker-compose ps # 查看服务日志 docker-compose logs web docker-compose logs redis # 1、测试指令 curl http://localhost:81/health # 返回ok #/2、使用 postman 调用接口访问 redis,并设置 key-value http://192.168.88.132:81/op/redis # 进入 redis 容器,查看设置是否成功 docker-compose exec -t redis bash
2、docker swam
docker swarm 部署和管理 docker 集群。支持管理节点高可用,并采用 raft 一致性算法。
2.1、集群管理
创建集群
# 创建集群,并生成 join-token docker swarm init [OPTIONS]
节点加入集群
# 集群生成 join-token docker swarm join-token [OPTIONS] (worker|manager) # 节点加入集群 docker swarm join --token join-token '加入对应 join-token 的集群
查看集群状态
docker info
将节点从集群中移除
docker swarm leave '只能移除woker节点,manager 节点只能强制移除 -f
更新集群
docker swarm update
锁定/解锁集群
docker 提供自动锁机制来锁定 swarm,要求重启的管理节点在提供集群解锁码后才能重新加入,避免主节点宕机后重新接入,出现双主节点(脑裂)。
# 设置为自动锁定集群 docker swarm update --autolock=true # 查询解锁集群的秘钥 docker swarm unlock-key # 重启后的管理节点必须提供解锁码后才能重新接入集群 docker swarm unlock # 更新整数 docker swarm ca --rotate
2.2、节点管理
docker node
查看集群节点
docker node ls
升级 / 降级节点
docker node promote | demote <NODE>
更新节点
# 更新节点状态 docker node update --availability active|pause|drain <NODE> # 升降/降级节点 docker node update --role manager <NODE> # 回滚节点 docker node --rollback
删除节点
docker node rm <node>
3、服务部署
3.1、docker service 命令
服务部署命令
# 创建服务 docker service create # 查看服务信息 docker service inspect # 查看服务日志 docker service logs # 查看所有服务 docker service ls # 查看服务下的任务列表(容器) docker service ps # 删除服务 docker service rm # 回滚服务 docker service rollback # 弹性伸缩服务 docker service scale # 更新服务 docker service update
3.2、集群部署应用
集群部署应用
# 部署应用(私有注册中心:--with-registry-auth) docker service create --name myhello -p 81:80 --replicas 3 hello:1.0.0 # 查看服务下的任务(容器) docker service ps myhello # 查看节点下的任务(容器) docker node ps <NODE> # 查看服务列表 docker service ls # 访问集群中任意节点均可以访问到服务,swarm 集群实现了负载均衡 curl http://localhost:81/ # 删除服务 docker service rm myhello
集群部署带有更新策略和回滚策略的应用
# 部署应用(私有注册中心:--with-registry-auth) docker service create --name myhello -p 81:80 --replicas 20 --update-delay 5s --update-parallelism 2 --update-failure-action continue --rollback-parallelism 2 --rollback-monitor 5s --rollback-max-failure-ratio 0.2 hello:1.0.0 # 查看服务下的任务(容器) docker service ps myhello # 缩容服务 docker service scale myhello=8 # 更新服务 docker service update myhello --image hello:1.0.1 # 查看服务下的任务(容器) docker service ps myhello # 回滚服务 docker service rollback myhello # 查看服务下的任务(容器) docker service ps myhello
4、堆栈部署
swarm + compose 部署
4.1、docker stack 命令
# 部署或更新 stack docker stack deploy [OPTIONS] STACK -c '指定文件 # 查看 stack 列表 docker stack ls # 查看 stack 的任务列表 docker stack ps # 删除 stack docker stack rm # 查看 stack 中的服务列表 docker stack services [OPTIONS] STACK
4.2、部署应用
编写 docker-compose.yml 文件
version: "3.7" services: myhello: image: hello:1.0.0 ports: - "82:80" depends_on: - redis deploy: mode: replicated replicas: 20 endpoint_mode: vip rollback_config: parallelism: 2 delay: 10s monitor: 10s max_failure_ratio: 0.2 update_config: parallelism: 2 delay: 5s failure_action: continue redis: image: redis:latest deploy: mode: replicated replicas: 6 endpoint_mode: dnsrr labels: description: "This redis service label" resources: limits: cpus: "0.50" memory: 50M reservations: cpus: "0.25" memory: 20M restart_policy: condition: on-failure delay: 5s max_attempts: 3 window: 120s
部署 stack
# 部署 stack docker stack deploy -c docker-compose.yml mystack # 查看服务列表 docker stack services mystack # 查看 stack 列表 docker stack ls