Docker Compose 使用

一、简介

Docker Compose 是一个工具,用于定义和运行多容器 Docker 应用程序。它允许用户使用 YAML 文件来配置应用程序需要的所有服务,然后使用一个命令来从 YAML 文件配置中创建并启动所有服务。其主要目的是为了简化了多容器 Docker 应用程序的部署和管理过程。

二、安装

Docker Compose可以在大多数Linux发行版上安装,包括Ubuntu、CentOS等。安装方法可能包括通过包管理器安装或直接下载二进制文件。在Windows系统上,Docker Compose通常随Docker Desktop一起安装,不需要单独安装。Linux系统上安装步骤如下:

  1. 下载当前稳定的Compose版本:
    curl -L "https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  2. 给予Docker Compose可执行权限:
    chmod +x /usr/local/bin/docker-compose
  3. 验证安装是否成功:
    docker-compose --version

三、Docker Compose使用

3.1 编写 docker-compose.yml 配置文件

创建一个名为docker-compose.yml的YAML文件,在其中定义要启动的服务、网络、卷等配置。下面是一个简单的 docker-compose.yml 配置文件示例:

bash 复制代码
version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    depends_on:
      - redis
  redis:
    image: redis
    volumes:
      logvolume01: {}

这个配置文件定义了两个服务:web 和 redis,web服务是依赖redis服务的,先启动 redis服务,再启动 web。web 服务使用从当前目录中构建的镜像,并将容器的 5000 端口映射到主机的 5000 端口。redis 服务使用 Docker Hub 上的官方 Redis 镜像。

3.2 启动 docker-compose

执行 docker-compose up -d 命令来启动并运行整个应用程序。

四、Docker Compose常用命令

Docker Compose命令基本上和Docker相差不多,主要就是对Docker Compose生命周期控制、日志格式等相关命令。常用的命令如下:

  1. docker-compose up:启动所有服务。
  2. docker-compose up -d:在后台启动所有服务。
  3. docker-compose down:停止并删除所有容器、网络、卷和镜像。
  4. docker-compose ps:列出所有运行的容器。
  5. docker-compose logs:查看容器输出日志。
  6. docker-compose exec:在容器内部执行命令。
  7. docker-compose build:构建服务的镜像。
  8. docker-compose restart:重启服务。
  9. docker-compose start:启动服务。
  10. docker-compose stop:停止服务。
  11. docker-compose config:检查Docker Compose配置文件的语法。
  12. docker-compose push:推送服务镜像到仓库。
  13. docker-compose pull:从仓库拉取服务镜像。
  14. docker-compose top:显示由 Docker Compose 管理的所有容器的进程信息。

五、docker-compose.yml 配置文件解析

docker-compose.yml 文件是用于定义和运行多个 Docker 容器的 YAML 文件。它的通常组成部分有:服务定义、网络定义和数据卷定义等。以下是一个基本的 docker-compose.yml 文件示例:

bash 复制代码
# 指定Docker Compose 文件的版本
version: '3'


# 必填部分,定义服务
services:
  web:
    image: nginx
    ports:
      - "80:80"
    networks:
      - mynetwork
 
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example
    networks:
      - mynetwork

# 可选部分,定义网络
networks: 
  network_name:
    driver: bridge # 网络类型,默认为桥接网络


# 可选部分,定义数据卷 
volumes: 
  volume_name:
    driver: local # 数据卷驱动,默认为本地存储
5.1 version

指定Docker Compose文件的版本信息,定义关乎于docker的兼容性。随着 Docker Compose 的发展,出现了多个版本,每个版本都带来了新的特性和改进。以下是一些常见的 Docker Compose 文件版本号:

  • Version 1: 这是最早的版本,不支持数据卷、网络和构建参数配置。它不会利用 Docker 网络的优势,每个容器都位于默认的桥接网络上,并且需要使用 links 来启用容器之间的发现。
  • Version 2.x: 引入了对 Swarm 模式的支持,可以通过 docker stack 命令将 Compose 文件部署到 Swarm 集群中。它支持数据卷和网络的配置,默认情况下,每个容器都加入了应用范围的默认网络,并且可以在与服务名称相同的主机名下发现。
  • Version 3.x: 这是最新的版本,也是推荐使用的版本。它与 Docker Engine 的 Swarm 模式形成交叉兼容,并引入了一些新特性,例如配置命名空间、健康检查、秘密管理等。
5.2 services

services 是一个顶级元素,docker-compose.yml 文件中的核心部分,它定义了应用程序中的各个服务及其配置。每个服务都是一个独立的容器,可以运行在不同的主机上。以下是 services 元素中常见的配置选项:

  • image: 指定服务使用的 Docker 镜像名称,可以是公共 Docker Hub 中的镜像,也可以是本地的自定义镜像。
  • build: 指定 Dockerfile 的路径,Docker Compose 将自动构建该服务的 Docker 镜像。
  • container_name: 指定容器的名称,如果不指定,Docker 会自动分配一个唯一的名称。
  • ports: 指定容器和宿主机之间的端口映射关系,格式为 宿主机端口:容器端口。
  • expose:声明容器暴露的端口。不会在主机和容器之间创建端口映射,而是仅仅在容器内部定义了一个端口,以便其他容器可以通过容器网络进行访问。
  • environment: 定义容器的环境变量,可以是数组或字典形式。
  • volumes: 指定容器和宿主机之间的数据卷映射关系,格式为 宿主机路径:容器路径。
  • networks: 指定容器所属的网络,可以是已存在的网络或者新建的网络。
  • depends_on: 指定服务之间的依赖关系,使得一个服务启动前必须先启动其依赖的服务。
  • links:链接到其它服务的中的容器,可以指定服务名称也可以指定链接别名。
  • restart: 指定容器退出后的重启策略,如 no, always, on-failure, unless-stopped。
  • command: 覆盖容器启动后要执行的命令。
  • healthcheck:定义容器的健康检查逻辑。通过这种方式,你可以确保容器在启动后能够正常运行,并且在出现问题时能够被及时发现和处理。
  • env_file:从文件添加环境变量。可以是单个值(env_file: .env)或列表的多个值。
  • secrets:用于定义敏感数据的部分。这些敏感数据通常是需要保密的信息,如数据库密码、API密钥等。
bash 复制代码
version: "3.9"

# 定义服务
services:
  # 定义服务1
  service1: # 自定义服务名称
    image: postgresql # 使用的是postgresql镜像
    build:
      context: ./dir # Dockerfile 所在的上下文路径
      dockerfile: Dockerfile # Dockerfile 的名称,默认为 Dockerfile
    container_name: my-postgresql-container # 指定自定义容器名
    ports:
      - "5005:5432" # 将主机的5005端口映射到容器的5432端口上
    expose:
      - "8080" # 暴露容器内部8080端口
    environment: # 环境变量
      - DB_HOST=${DB_HOST}
      - DB_USER=${DB_USER}
      - DB_PASSWORD=${DB_PASSWORD}
    volumes: # 数据卷挂载
      - /db-data:/var/lib/postgresql/data # 将主机根目录下的db-data目录挂载到容器的/var/lib/postgresql/data目录中
    networks: # 网络配置
      - my_network: aliased_web  # 服务在my_network网络中被赋予别名aliased_web
    depends_on: # 依赖服务
      - service2 # 指定要依赖的服务名称
    links: # 链接服务
      - service3 # 指定要链接的服务名称
    restart: always # 重启策略
    command: ["echo", "Goodbye World"] # 会覆盖容器启动命令
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:5000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
    env_file:
      - ./config/env
	secrets:
      - my_secret
      - my_other_secret

  # 定义服务2
  service2: 
    image: nginx # 使用的是nginx镜像    
    volumes:
      - my_data:/data  # my_data卷被挂载到service2容器的/data路径


# 定义数据卷,与services元素同级
volumes:
  my_data:


# 定义网络,与services元素同级
networks:
  my_network:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.100.0/24


# 定义密钥, 与services元素同级
secrets:
  my_secret:
    file: ./my_secret.txt
  my_other_secret:
    external: true
相关推荐
洛克大航海23 分钟前
Linux 中新建用户
linux·运维·服务器
三口吃掉你33 分钟前
Docker安装Elasticsearch、kibana、IK分词器
elasticsearch·docker·kibana·ik分词器
dehuisun1 小时前
jenkins流水线部署springboot项目
运维·jenkins
fly五行1 小时前
Windows 系统下使用 Docker 安装 Milvus 向量数据库
windows·docker·milvus
爱宇阳2 小时前
离线环境下运行 Docker 容器编排指南
docker·容器·eureka
蜜蜜不吃糖2 小时前
解决Vcenter告警datastore存储容量不足问题
linux·运维·服务器
东城绝神2 小时前
《Linux运维总结:基于ARM64+X86_64架构CPU使用docker-compose一键离线部署redis 7.4.5容器版分片集群》
linux·运维·redis·架构·分片集群
Java陈序员3 小时前
免费开源!一款操作 MySQL 和 MariaDB 的 Web 界面工具!
mysql·docker·php·mariadb
迷路爸爸1803 小时前
解决GitHub SSH密钥冲突:一台电脑多账户配置
运维·ssh·github
梁正雄3 小时前
9、dockerfile
docker·dockerfile·dockerfile基础用法