docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker Compose使用

Docker Compose使用手册之场景、文件与命令详解

作者:卜及中

DockerCompose是Docker官方的多容器应用管理和编排工具,它简化了多容器应用的部署和管理,支持一键启动、停止服务,配置服务依赖和环境变量,管理网络和卷等,下面小编就和大家详细介绍一下Docker Compose的使用场景、文件与命令吧

一、什么是 Docker Compose

Docker Compose 是 Docker 官方的开源项目,使用 Python 编写,调用 Docker 服务的 API 来管理和编排容器。官方定义为:定义和运行多个 Docker 容器的应用。

在 Docker Compose 中,有两个重要概念:

Compose 的默认管理对象是 项目,通过子命令对项目中的一组容器进行简化的生命周期管理。

通过 compose 可以方便的管理多个服务。

二、为什么需要 Docker Compose

Docker 是一个轻量化的应用程序,官方推荐每个 Docker 容器只运行一个进程。

三、Docker Compose 使用步骤 / 核心功能

步骤

核心功能

  1. 多容器管理:可以轻松定义和管理多个服务(容器)。
  2. 一键启动与停止:通过命令启动或停止所有容器,简化操作。
  3. 服务依赖:自动处理服务之间的启动顺序。
  4. 配置管理:通过环境变量和 .env 文件管理配置。
  5. 数据持久化:支持使用卷(Volumes)持久化数据。
  6. 扩展服务:可以轻松扩展服务实例数量,处理负载。

四、Docker Compose 的使用场景

开发环境:在开发过程中,Docker Compose 可以用来快速搭建多容器的开发环境,例如将数据库、缓存服务器、Web 应用等服务组合在一起,开发者可以通过一条命令启动或停止整个环境。

测试环境:用于构建和管理临时的测试环境,确保不同服务之间的协作和集成测试在统一的环境中进行。可以确保每次测试时环境的一致性。

本地开发与调试:在本地开发中,Docker Compose 允许开发者同时运行多个依赖服务(如数据库、消息队列等),无需手动启动每个容器,便于开发和调试。

微服务架构:在微服务架构中,Docker Compose 可以用来管理多个微服务及其依赖服务(如数据库、API 网关等),通过 Compose 配置文件统一管理和部署。

多环境部署:Docker Compose 支持为不同的环境(如开发、测试、生产)配置不同的服务和设置,帮助实现环境间的一致性和迁移。

CI/CD 流水线:在持续集成/持续部署(CI/CD)过程中,Docker Compose 可用于自动化构建、测试和部署多容器应用,简化流程,保证环境一致性。

本地模拟生产环境:在本地机器上使用 Docker Compose 模拟生产环境中的复杂服务拓扑,帮助开发者在开发阶段提前发现潜在问题。

五、Docker Compose 文件(docker-compose.yml)

文件语法版本

目前,官方支持三大版本:Version 1、Version 2 和 Version 3,其中 Version 1 已被废弃。当前最新版本为 3.8,要求 Docker Engine 版本至少为 19.03.0。本课程将基于 3.8 版本的 Compose 文件语法进行讲解,其他版本的详细内容可以参考官方文档。

文件基本结构及常见指令

YAML 示例:

version: "3.8"  # 定义当前使用的 Docker Compose 语法版本
services:  # 服务定义,支持多个服务
  servicename:  # 服务名称,内部 bridge 网络中使用的 DNS 名称。非集群模式下相当于 Docker run 命令中的名称。
    image:  # 必选项,指定容器镜像
    command:  # 可选项,覆盖镜像的默认启动命令
    environment:  # 可选项,等同于 docker run 中的 --env 参数,用于设置环境变量
    volumes:  # 可选项,等同于 docker run 中的 -v 参数,用于数据卷挂载
    networks:  # 可选项,等同于 docker run 中的 --network 参数,指定容器网络
    ports:  # 可选项,等同于 docker run 中的 -p 参数,指定端口映射
    expose:  # 可选项,指定容器暴露的端口
    build:  # 可选项,指定构建镜像的路径
    depends_on:  # 可选项,定义服务间的依赖关系
    env_file:  # 可选项,定义外部环境变量文件

常见字段格式语法

image: 指定容器运行的镜像。支持多种格式:

image: redis
image: redis:5
image: redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398bc4b991aac7
image: library/redis
image: my_private.registry:5000/redis

command: 覆盖容器启动时的默认命令:

command: ["bundle", "exec", "thin", "-p", "3000"]
command: bundle exec thin -p 3000

entrypoint: 覆盖容器的默认 entrypoint:

entrypoint: /code/entrypoint.sh
entrypoint:
  - php
  - -d
  - zend_extension=/usr/local/lib/php/extensions/no-debug-nonzts-20100525/xdebug.so
  - -d
  - memory_limit=-1
  - vendor/bin/phpunit

environment: 设置环境变量,可以使用数组或字典格式:

environment:
  RACK_ENV: development
  SHOW: "true"

或者数组格式:

environment:
  - RACK_ENV=development
  - SHOW=true

networks: 配置容器使用的网络:

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

volumes: 将主机的数据卷或文件挂载到容器中:

services:
  db:
    image: postgres:latest
    volumes:
      - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
      - "/localhost/data:/var/lib/postgresql/data"

ports: 配置端口映射:

ports:
  - target: 80
    published: 8080
    host_ip: 127.0.0.1
    protocol: tcp
    mode: host

expose: 暴露容器内部端口,但不进行端口映射:

expose:
  - "3000"
  - "8000"

build: 指定构建镜像的上下文路径:

version: "3.7"
services:
  webapp:
    build: ./dir

depends_on: 设置服务依赖关系,确保服务按顺序启动:

services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

可以根据服务健康状态设置条件:

services:
  web:
    build: .
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started

env_file: 从文件中加载环境变量,可以是多个文件:

env_file:
  - .env
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

示例:使用healthcheck配置容器健康检查

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

六、Dockers Compose 命令清单

常见 Docker Compose 命令 与 官方文档

启动和管理服务

构建和镜像管理

容器状态和日志

容器的其他操作

资源管理

docker-compose scale:设置服务的容器数量(只适用于 Version 2 格式)。

官方文档

Docker Compose 的官方文档包含完整的命令清单、配置项说明以及示例,可以通过以下链接访问:

Docker Compose 命令文档https://docs.docker.com/compose/reference/

该页面提供了所有 docker-compose 命令的详细说明,包括常用命令、选项和用法示例。

命令格式

对于 Docker Compose,大多数命令可以作用于整个项目,也可以针对项目中的特定服务或容器。如果没有特别说明,命令默认会影响整个项目,即项目中的所有服务。

docker compose 命令的基本格式为:

docker compose [OPTIONS] COMMAND [ARGS...]

常见选项说明:

常见选项 / 命令

常见选项

常见命令

Docker Compose 常见命令及选项说明

1. up

该命令会自动完成包括构建镜像、(重新)创建服务、启动服务并关联相关容器等操作,通常用于启动一个项目。

基本命令格式

docker compose up [OPTIONS] [SERVICE...]

常见选项

2. down

停止所有容器,并删除容器和网络。

基本命令格式

docker compose down [OPTIONS] [SERVICE...]

常见选项

-v, --volumes:删除容器的同时删除与容器关联的卷(目录映射)。

3. run

在指定服务容器上执行相关命令。此命令用于启动服务容器并在其中执行命令。

基本命令格式

docker compose run [OPTIONS] SERVICE [COMMAND] [ARGS...]

常见选项

示例

# 启动 ubuntu 服务容器,并执行 ping docker.com 命令
docker compose run ubuntu ping docker.com

下面是一个基本的 Docker Compose 操作案例,假设你的操作环境是 Ubuntu。

操作案例

下面演示如何创建一个包含 NginxMySQL 的多容器应用,并通过 docker-compose.yml 文件管理它们。我们可以根据需要扩展服务、配置网络和卷等。

1. 安装 Docker 和 Docker Compose

首先确保你的 Ubuntu 系统已经安装了 Docker 和 Docker Compose。你可以使用以下命令进行安装。

更新你的包列表并安装依赖:

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common

安装 Docker:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

安装 Docker Compose:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

验证安装:

docker --version
docker-compose --version

创建 Docker Compose 项目文件

假设我们要创建一个简单的项目,包含一个 Nginx 服务和一个 MySQL 数据库服务。

创建一个新目录

mkdir myproject
cd myproject

创建 docker-compose.yml 文件

使用编辑器创建 docker-compose.yml 文件,该文件描述了我们的服务和配置。

version: '3'
services:
  web:
    image: nginx:latest
    container_name: nginx-container
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    networks:
      - mynetwork
  db:
    image: mysql:5.7
    container_name: mysql-container
    environment:
      MYSQL_ROOT_PASSWORD: examplepassword
      MYSQL_DATABASE: exampledb
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - mynetwork
networks:
  mynetwork:
volumes:
  mysql-data:

解释:

web 服务:使用 Nginx 镜像,映射本地的 8080 端口到容器的 80 端口。

db 服务:使用 MySQL 5.7 镜像,设置了数据库根密码 examplepassword 和数据库名 exampledb

我们创建了一个网络 mynetwork 来让容器间通信,并为 MySQL 创建了一个数据卷 mysql-data 来持久化数据库数据。

创建 HTML 文件(可选)

如果你希望在浏览器中访问你的 Nginx 服务并显示内容,可以创建一个简单的 HTML 文件:

mkdir html
echo "<h1>Hello from Docker Compose!</h1>" > html/index.html

3. 启动服务

在项目目录中,使用 docker compose up 命令来启动所有定义的服务。

docker compose up

如果你希望在后台运行容器,可以加上 -d 参数:

docker compose up -d

这个命令会:

你可以用 docker ps 查看正在运行的容器:

docker ps

4. 访问 Nginx 服务

如果一切正常,你可以在浏览器中访问 Nginx 服务,打开 http://localhost:8080,你应该能够看到 “Hello from Docker Compose!” 的 HTML 内容。

5.查看容器日志

如果你想查看容器的日志,使用 docker compose logs 命令:

docker compose logs web

这将显示 Nginx 容器的日志。如果你想查看 MySQL 容器的日志,可以使用:

docker compose logs db

6.停止并删除服务

要停止并删除所有运行中的服务和容器,可以使用 docker compose down 命令:

docker compose down

如果你希望同时删除卷(例如 MySQL 的数据卷),可以使用 -v 选项:

docker compose down -v

七、常见问题

uprunstart 之间的区别

如何在同一主机上运行 Compose 文件的多个副本

Compose 使用项目名称为项目中的所有容器和资源创建唯一标识符。要运行项目的多个副本,可以通过以下方式设置自定义项目名称:

这样可以在同一主机上启动多个独立的 Compose 项目实例。

可以控制服务启动顺序吗?

可以通过在 docker-compose.yml 文件中使用 depends_on 来指定服务的启动顺序。可以结合 healthcheck 功能来确保服务在健康检查成功后再启动,从而实现更精确的启动控制。

到此这篇关于Docker Compose使用手册之场景、文件与命令详解的文章就介绍到这了,更多相关Docker Compose使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文