Docker: 云与容器编排

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 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

第 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
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2天前
|
存储 安全 数据安全/隐私保护
【Docker 专栏】Docker 容器化应用的备份与恢复策略
【5月更文挑战第9天】本文探讨了Docker容器化应用的备份与恢复策略,强调了备份在数据保护、业务连续性和合规要求中的关键作用。内容涵盖备份的重要性、内容及方法,推荐了Docker自带工具和第三方工具如Portainer、Velero。制定了备份策略,包括频率、存储位置和保留期限,并详细阐述了恢复流程及注意事项。文章还提及案例分析和未来发展趋势,强调了随着技术发展,备份与恢复策略将持续演进,以应对数字化时代的挑战。
【Docker 专栏】Docker 容器化应用的备份与恢复策略
|
2天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
|
1天前
|
NoSQL Redis Docker
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
10 0
|
2天前
|
缓存 关系型数据库 数据库
【Docker 专栏】Docker 与容器化数据库的集成与优化
【5月更文挑战第9天】本文探讨了Docker与容器化数据库集成的优势,如快速部署、环境一致性、资源隔离和可扩展性,并列举了常见容器化数据库(如MySQL、PostgreSQL和MongoDB)。讨论了集成方法、注意事项、优化策略,包括资源调整、缓存优化和监控告警。此外,强调了数据备份、恢复测试及性能评估的重要性。未来,随着技术发展,二者的集成将更紧密,为数据管理带来更多可能性。掌握此技术将应对数字化时代的机遇与挑战。
【Docker 专栏】Docker 与容器化数据库的集成与优化
|
2天前
|
存储 安全 数据库
【Docker 专栏】Docker 容器内应用的状态持久化
【5月更文挑战第9天】本文探讨了Docker容器中应用状态持久化的重要性,包括数据保护、应用可用性和历史记录保存。主要持久化方法有数据卷、绑定挂载和外部存储服务。数据卷是推荐手段,可通过`docker volume create`命令创建并挂载。绑定挂载需注意权限和路径一致性。利用外部存储如数据库和云服务可应对复杂需求。最佳实践包括规划存储策略、定期备份和测试验证。随着技术发展,未来将有更智能的持久化解决方案。
【Docker 专栏】Docker 容器内应用的状态持久化
|
2天前
|
机器学习/深度学习 监控 Kubernetes
【Docker 专栏】Docker 容器内服务的自动扩展与缩容
【5月更文挑战第9天】本文探讨了Docker容器服务的自动扩展与缩容原理及实践,强调其在动态业务环境中的重要性。通过选择监控指标(如CPU使用率)、设定触发条件和制定扩展策略,实现资源的动态调整。方法包括云平台集成和使用Kubernetes等框架。实践中,电商平台和实时数据处理系统受益于此技术。注意点涉及监控数据准确性、扩展速度和资源分配。未来,智能算法将提升扩展缩容的效率和准确性,成为关键技术支持。
【Docker 专栏】Docker 容器内服务的自动扩展与缩容
|
2天前
|
Java 数据库连接 Docker
【Docker 专栏】Docker 容器内环境变量的管理与使用
【5月更文挑战第9天】本文介绍了Docker容器中环境变量的管理与使用,环境变量用于传递配置信息和设置应用运行环境。设置方法包括在Dockerfile中使用`ENV`指令或在启动容器时通过`-e`参数设定。应用可直接访问环境变量或在脚本中使用。环境变量作用包括传递配置、设置运行环境和动态调整应用行为。使用时注意变量名称和值的合法性、保密性和覆盖问题。理解并熟练运用环境变量能提升Docker技术的使用效率和软件部署质量。
【Docker 专栏】Docker 容器内环境变量的管理与使用
|
3天前
|
运维 安全 Linux
深入理解Docker自定义网络:构建高效的容器网络环境
深入理解Docker自定义网络:构建高效的容器网络环境
|
3天前
|
存储 弹性计算 运维
Docker数据集与自定义镜像:构建高效容器的关键要素
Docker数据集与自定义镜像:构建高效容器的关键要素
|
3天前
|
Kubernetes Java 调度
Java容器技术:Docker与Kubernetes
Java容器技术:Docker与Kubernetes
13 0