Docker Compose(容器编排)

目录

[什么是 Docker Compose](#什么是 Docker Compose)

[Docker Compose 的功能](#Docker Compose 的功能)

[Docker Compose 使用场景](#Docker Compose 使用场景)

[Docker Compose 文件(docker-compose.yml)](#Docker Compose 文件(docker-compose.yml))

[Docker Compose 命令清单](#Docker Compose 命令清单)

常见命令说明

操作案例

总结


什么是****Docker Compose

docker-compose 是 Docker 官方的开源项目,使用 python 编写,实现上调用了 Docker 服务的 API 进行容器管理及编排,其官方定义为定义和运行多个 Docker 容器的应用。
docker-compose 中有两个非常重要的概念 :
服务 ( service ) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
项目 ( project ) :由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义 , 整个 docker-compose.yml 定义一个项目。 Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。 通过 compose 可以方便的管理多个服务。

为什么要 Docker Compose
Docker 是一个轻量化的应用程序, Docker 官方推荐每个 Docker 容器中只运行一个进程
如果一个应用需要涉及到 MySQL 、 nginx 等环境, 那么我们需要分别为应用、数据库和 nginx 创建单独的 docker 容器,然后分别启动容器。
想象一下,当我们构建好 Docker 之后,每次启动应用,都至少需要 docker run三次, 或者写一些脚本来实现, 这样会比较繁琐。
另外,这些 docker 容器都是分散独立的,也不方便镜像管理。那既然这些 docker容器 都是为了同一个应用服务,我们就应该把它们放到一起,这就引出了 docker-compose 来解决这类型的问题。
Docker Compose 的安装
安装 docker 的时候,我们默认已经安装了 docker-compose,安装的组件包名称为 docker-compose-plugin ,此处不再赘述
Shell

检查安装是否成功

root@139-159-150-152:/data/myworkdir/compose# docker compose
version
Docker Compose version v2.16.0

Docker Compose****的功能

  1. 使用步骤
    Compose 使用的步骤:
    使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
    最后,执行 docker compose up 命令来启动并运行整个应用程序。
  2. 核心功能
    Compose 具有管理应用程序整个生命周期的命令:
    启动,停止和重建服务
    查看正在运行的服务的状态
    流式传输运行服务的日志输出
    在服务上运行一次性命令

Docker Compose****使用场景

单主机部署
快速搭建一个单节点开发或者测试环境,方便使用。
不同环境隔离
通过指定 project 来运行不同的环境,实现隔离的目的。

**Docker Compose****文件(**docker-compose.yml)

文件基本结构及常见指令
YAML
version: "3.8" # 定义版本, 表示当前使用的 docker-compose 语法的版本
services: # 服务,可以存在多个
servicename: # 服务名字,它也是内部 bridge 网络可以使用的 DNS name, 如果不是集群模式相当于 docker run 的时候指定的一个名称

集群( Swarm )模式是多个容器的逻辑抽象

image: # 必选,镜像的名字
command: # 可选,如果设置,则会覆盖默认镜像里的 CMD 命令
environment: # 可选,等价于 docker container run 里的 --env 选项设置环境变量
volumes: # 可选,等价于 docker container run 里的 -v 选项 绑定数据卷
networks: # 可选,等价于 docker container run 里的 --network 选项指定网络
ports: # 可选,等价于 docker container run 里的 -p 选项指定端口映射
expose: # 可选,指定容器暴露的端口
build: # 构建目录
depends_on: # 服务依赖配置
env_file: # 环境变量文件
servicename2:
image:
command:
networks:
ports:
servicename3:
#...
volumes: # 可选,等价于 docker volume create
networks: # 可选,等价于 docker network create
image
指定容器运行的镜像。以下格式都可以:

cpp 复制代码
image: redis
image: redis:5
image: 
redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398
bc4b991aac7
image: library/redis
image: docker.io/library/redis
image: my_private.registry:5000/redis

command
覆盖容器启动的默认命令。
Shell
command: ["bundle", "exec", "thin", "-p", "3000"]
command: bundle exec thin -p 3000
entrypoint
覆盖容器默认的 entrypoint 。
Shell
entrypoint: /code/entrypoint.sh
也可以是以下格式:
Shell
entrypoint:

  • php
  • -d
  • zend_extension=/usr/local/lib/php/extensions/no-debug-non
    zts-20100525/xdebug.so
  • -d
  • memory_limit=-1
  • vendor/bin/phpunit
    environment
    添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False 。
    Shell
    #map 语法
    environment:
    RACK_ENV: development
    SHOW: "true"
    USER_INPUT:

数组语法

environment:

  • RACK_ENV=development
  • SHOW=true
  • USER_INPUT
    networks
    指定容器运行的网络:
    配置容器网络
    Shell
    services:
    frontend:
    image: awesome/webapp
    networks:
  • front-tier
  • back-tier
    monitoring:
    image: awesome/monitoring
    networks:
  • admin
    backend:
    image: awesome/backend
    networks:
    back-tier:
    aliases:
  • database
    admin:
    aliases:
  • mysql
    networks:
    front-tier:
    back-tier:
    admin:
    配置网络驱动和子网信息
    Shell
    services:
    frontend:
    image: awesome/webapp
    networks:
    front-tier:
    ipv4_address: 172.16.238.10
    networks:
    front-tier:
    ipam:
    driver: default
    config:
  • subnet: "172.16.238.0/24"
    volumes
    将主机的数据卷或者文件挂载到容器里。
    Shell

短语法

services:
db:
image: postgres:latest
volumes:

  • "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
  • "/localhost/data:/var/lib/postgresql/data"

完整语法

services:
backend:
image: awesome/backend
volumes:

  • type: volume

命名卷

source: db-data
target: /data
volume:
nocopy: true

绑定卷

  • type: bind
    source: /var/run/postgres/postgres.sock
    target: /var/run/postgres/postgres.sock
    volumes:
    db-data:
    ports
    指定端口映射。以下格式都可以:
    Shell

完整语法

ports:

  • target: 80
    host_ip: 127.0.0.1
    published: 8080
    protocol: tcp
    mode: host
  • target: 80
    host_ip: 127.0.0.1
    published: 8000-9000
    protocol: tcp
    mode: host

短语法

ports:

  • "3000"
  • "3000-3005"
  • "8000:8000"
  • "9090-9091:8080-8081"
  • "49100:22"
  • "127.0.0.1:8001:8001"
  • "127.0.0.1:5000-5010:5000-5010"
  • "6060:6060/udp"
    expose
    暴露端口,但不映射到宿主机,只被连接的服务访问。
    仅可以指定内部端口为参数:
    Shell
    expose:
  • "3000"
  • "8000"
    build
    指定为构建镜像上下文路径:
    例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:
    Shell
    version: "3.7"
    services:
    webapp:
    build: ./dir
    或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args :
    version: "3.7"
    services:
    webapp:
    build:
    context: ./dir
    dockerfile: Dockerfile-alternate
    args:
    buildno: 1
    labels:
  • "com.example.description=Accounting webapp"
  • "com.example.department=Finance"
  • "com.example.label-with-empty-value"

    context :上下文路径。

    dockerfile :指定构建镜像的 Dockerfile 文件名。

    args :添加构建参数,这是只能在构建过程中访问的环境变量。

    labels :设置构建镜像的标签。
    depends_on
    设置依赖关系。

    docker compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和
    redis ,才会启动 web 。

    docker compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,
    docker compose up web 还将创建并启动 db 和 redis 。

    docker compose stop :按依赖关系顺序停止服务。在以下示例中, web 在 db 和
    redis 之前停止。
    Shell
    version: "3.7"
    services:
    web:
    build: .
    depends_on:
  • db
  • redis
    redis:
    image: redis
    db:
    image: postgres
    可以指定条件, healthy 需要配置 healthcheck 来完成
    services:
    web:
    build: .
    depends_on:
    db:
    condition: service_healthy
    redis:
    condition: service_started
    redis:
    image: redis
    db:
    image: postgres
    health check 样例
    Shell
    version: "3.8"
    services:
    web:
    image: nginx:1.24.0
    environment:
    TEST: 1
    depends_on:
    mysql:
    condition: service_healthy
    mysql:
    image: mysql:5.7
    environment:
    MYSQL_ROOT_PASSWORD: "bit@123"
    volumes:
  • /data/maxhou/mysqldata/varlib/:/var/lib/mysql
    healthcheck :
    test: mysql --user=root --password='bit@123' -e "SELECT 1;"
    interval: 10s
    timeout: 5s
    retries: 10
    env_file
    从文件添加环境变量。可以是单个值或列表的多个值。
    Shell
    env_file: .env

Docker Compose****命令清单

Docker Compose 有很多命令,但是常用的就几个,这里列出一些,有需要额外学习的可以去docker官网学习

|-----------------------|----------------------|
| docker compose build | 构建服务 |
| docker compose config | 规范的格式来显示服务配置 |
| docker compose cp | 在本地系统和服务容器直接拷贝文件 |
| docker compose create | 创建服务的容器 |
| docker compose down | 停止所有容器,并删除容器 |
| docker compose exec | 在容器中执行命令 |
| docker compose images | 列出所有容器使用的镜像 |
| docker compose kill | 强制停止服务的容器 |
| docker compose ls | 显示所有项目 |
| docker compose pause | docker compose pause |

命令格式
对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。
docker-compose 命令的基本的使用格式为
docker compose [OPTIONS] COMMAND [ARGS...]
常见选项说明
-f, --file 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定
-p, --project-name 指定项目名称,默认将使用所在目录名称作为项目名

常见命令说明

up
该命令的作用十分强大,它会尝试自动完成包括构建镜像、(重新)创建服务、启动服务并关联服务相关容器的一系列操作,可以直接通过该命令来启动一个项目。
Shell
docker compose up [options] [SERVICE...]
-d 在后台运行服务容器, 推荐在生产环境下使用该选项
--force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用
--no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用
down
停止所有容器,并删除容器和网络
docker compose down [options] [SERVICE...]
-v, --volumes 删除容器同时删除目录映射
run
该命令可以在指定服务容器上执行相关的命令
Shell

例如 : 启动一个 ubuntu 服务容器,并执行 ping docker.com 命令

docker compose run ubuntu ping docker.com

docker compose run [options] SERVICE [COMMAND] [ARGS...]
-d 后台运行容器
--name NAME 为容器指定一个名字
--entrypoint CMD 覆盖默认的容器启动指令
-e KEY=VAL 设置环境变量值,可多次使用选项来设置多个环境变
-u, --user="" 指定运行容器的用户名或者 ui
--rm 运行命令后自动删除容器
-p, --publish=[] 映射容器端口到本地主机

操作案例

  1. 创建 compose 目录

mkdir -p /data/myworkdir/compose/base
cd /data/myworkdir/compose/base
2. 进入 base 目录 , 创建 docker-compose.yml 文件
cd /data/myworkdir/compose/base/
vi docker-compose.yml
3. 输入一下内容

cpp 复制代码
version: 3.8
services:
 web:
 image: nginx:1.24.0
 environment:
 TEST: 1
 ports:
 - 8979:80
 networks:
- mytestnet
 volumes:
 - ./mynginxhome:/usr/share/nginx/html
 depends_on:
 mysql:
 condition: service_healthy 
 redis:
 condition: service_healthy
 mysql:
 image: mysql:5.7
 environment:
 MYSQL_ROOT_PASSWORD: "bit@123"
 networks:
 - mytestnet
 volumes:
 - /data/maxhou/mysqldata/varlib/:/var/lib/mysql
 healthcheck:
 test: mysql --user=root --password='bit@123' -e "SELECT 1;"
 interval: 10s
 timeout: 5s
 retries: 10
 redis:
 image: redis:7
 networks:
 - mytestnet
 healthcheck:
 test: redis-cli ping
 interval: 10s
 timeout: 5s
 retries: 10
networks:
 mytestnet:
  1. 输入 docker config 会做检查
    root@139-159-150-152:/data/myworkdir/compose/base# docker compose
    config
    version must be a string
  2. 我们修改错误信息,将版本转为字符串,再次检查,检查通过
  3. 创建首页目录,编辑首页内容
    Shell
    root@139-159-150-152:/data/myworkdir/compose/base# mkdir - p ./mynginxhome
    root@139-159-150-152:/data/myworkdir/compose/base# cd ./mynginxhome/
    root@139-159-150-152:/data/myworkdir/compose/base/mynginxhome#
    echo "Hello bit" > index.html
  4. 启动服务
    root@139-159-150-152:/data/myworkdir/compose/base# docker compose
    up -d
  5. 停止服务
    root@139-159-150-152:/data/myworkdir/compose/base# docker compose
    stop
  6. 启动服务
    root@139-159-150-152:/data/myworkdir/compose/base# docker compose
    start
  7. 删除服务
    SQL
    root@139-159-150-152:/data/myworkdir/compose/base# docker compose
    down

总结

当docker某个项目牵扯多个微服务容器时,可以使用compose技术,实现对服务的容器定制化设置、网络的搭建和连接,以及容器的启动停止

相关推荐
IT里的交易员2 小时前
【C盘瘦身】Docker安装目录占用C盘过大,一键移动给C盘瘦身
运维·docker·容器
一张假钞9 小时前
Linux 系统 Docker Compose 安装
linux·运维·docker
zhanglb1213 小时前
liunx - 麒麟系统v10 SP1 执行脚本文件
linux·docker
k8s-open14 小时前
跨架构镜像打包问题及解决方案
macos·docker·容器·架构
xrz27716 小时前
docker部署ELK,ES开启安全认证
elk·elasticsearch·docker
三金C_C1 天前
docker 部署 gin
docker·容器·gin
家庭云计算专家1 天前
Portainer安装指南:多节点监控的docker管理面板-家庭云计算专家
docker
长勺1 天前
docker常见考点
docker·容器
迢迢星万里灬1 天前
Java求职者面试指南:DevOps技术栈深度解析
java·ci/cd·docker·kubernetes·jenkins·devops
喝养乐多长不高1 天前
深入探讨redis:万字讲解集群
java·数据库·redis·docker·集群·集群扩容·数据分片算法