Docker: 云与容器编排

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,经济版 1GB 1个月
简介: 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
相关文章
|
3天前
|
JSON JavaScript 开发者
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
【8月更文挑战第7天】Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
|
1天前
|
Docker 容器
|
1天前
|
网络协议 Linux 网络安全
遇到Docker容器网络隔断?揭秘六种超级实用解决方案,轻松让Docker容器畅游互联网!
【8月更文挑战第18天】Docker容器内网络不通是开发者常遇问题,可能因网络配置错、Docker服务异常或防火墙阻碍等原因引起。本文提供六种解决策略:确认Docker服务运行状态、重启Docker服务、检查与自定义Docker网络设置、验证宿主机网络连接、临时禁用宿主机IPv6及检查防火墙规则。通过这些步骤,多数网络问题可得以解决,确保容器正常联网。
7 1
|
2天前
|
安全 Ubuntu Docker
深度挖掘Docker 容器
【8月更文挑战第16天】Docker容器间的连接是容器化技术的关键,支持容器与宿主机的数据交换。主要方法包括:1) 利用Docker网络驱动创建自定义网络,使容器相连通信;2) 采用Docker Compose通过配置文件简化多容器应用的部署与互联;3) 虽不推荐,早期使用--link参数实现容器互联;4) 通过环境变量配置连接信息;5) 共享卷支持文件共享和间接通信。推荐使用Docker网络和Docker Compose以实现高效灵活的容器间通信。
13 3
|
3天前
|
Ubuntu Linux Docker
使用Docker进行容器化:从零开始的技术博文
【8月更文挑战第16天】从零开始掌握Docker容器化技术:本文详细介绍Docker基本概念、安装配置流程及核心组件。涵盖Docker镜像与容器管理、镜像加速配置,以及如何利用Dockerfile自动化构建镜像,助您快速入门并高效运用Docker进行软件开发与部署。
|
5天前
|
监控 Ubuntu Docker
如何在Docker容器启动时自动运行脚本
【8月更文挑战第13天】在Docker容器启动时自动运行脚本可通过以下方式实现:1) 使用`ENTRYPOINT`或`CMD`指令在Dockerfile中直接指定启动脚本,如`ENTRYPOINT [&quot;/startup.sh&quot;]`;2) 启动容器时通过`--entrypoint`参数指定脚本路径;3) 利用supervisor等进程管理工具自动启动与监控脚本,确保其稳定运行。确保脚本具有执行权限并正确设置依赖资源路径。
|
4天前
|
Docker 容器
Docker - 网络模式与容器网络互连
Docker的网络模式包括桥接模式、主机模式和覆盖网络模式,以及如何通过Docker的网络操作命令实现容器网络互连。
9 0
|
4天前
|
Linux Docker 容器
在CentOS操作系统上使用yum安装/使用/卸载Docker容器引擎
在CentOS操作系统上安装、配置、使用和卸载Docker容器引擎的详细步骤,包括配置Docker镜像加速的方法。
24 0
|
4天前
|
存储 Ubuntu Linux
如何在 Ubuntu 上使用 Docker 容器化和部署多个 WordPress 应用程序
如何在 Ubuntu 上使用 Docker 容器化和部署多个 WordPress 应用程序
11 0
|
4天前
|
Ubuntu NoSQL 关系型数据库
在Ubuntu操作系统上安装/使用/卸载Docker容器引擎
这篇文章详细介绍了在Ubuntu操作系统上安装、配置、使用、基本操作以及卸载Docker容器引擎的步骤,包括配置Docker镜像加速和使用Docker部署Nginx、MySQL和Redis服务器的方法。
21 0