Docker: 云与容器编排

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值