Docker: 云与容器编排
文章目录
- 1、docker compose
- 1.1、compose 安装
- 1.2、compose 命令
- 1.3、yml 配置指令
- 1.4、实例
- 2、docker swam
- 2.1、集群管理
- 2.2、节点管理
- 3、服务部署
- 3.1、docker service 命令
- 3.2、集群部署应用
- 4、堆栈部署
- 4.1、docker stack 命令
- 4.2、部署应用
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 命令
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 配置指令
yml 配置指令文档
1.4、实例
本地新建目录,并拉取代码:[helloworld](git clone https://gitee.com/nickdemo/helloworld.git)
第 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