Docker: 云与容器编排

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容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
相关文章
|
23天前
|
运维 Cloud Native 虚拟化
一文吃透云原生 Docker 容器,建议收藏!
本文深入解析云原生Docker容器技术,涵盖容器与Docker的概念、优势、架构设计及应用场景等,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文吃透云原生 Docker 容器,建议收藏!
|
10天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
39 6
|
10天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
20 5
|
10天前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
31 3
|
10天前
|
存储 安全 数据安全/隐私保护
Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。
在数字化时代,Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。本文探讨了 Docker 应用的备份与恢复策略,涵盖备份的重要性、内容、方法及常见工具,制定备份策略,恢复流程及注意事项,并通过案例分析和未来趋势展望,强调备份与恢复在保障应用安全中的重要性。
20 2
|
15天前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
46 5
|
17天前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
16天前
|
开发者 Docker Python
从零开始:使用Docker容器化你的Python Web应用
从零开始:使用Docker容器化你的Python Web应用
30 1
|
22天前
|
持续交付 开发者 Docker
Docker容器化技术实战指南
Docker容器化技术实战指南
38 1
|
24天前
|
缓存 监控 开发者
掌握Docker容器化技术:提升开发效率的利器
在现代软件开发中,Docker容器化技术成为提升开发效率和应用部署灵活性的重要工具。本文介绍Docker的基本概念,并分享Dockerfile最佳实践、容器网络配置、环境变量和秘密管理、容器监控与日志管理、Docker Compose以及CI/CD集成等技巧,帮助开发者更高效地利用Docker。