Docker基础——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 的功能

  1. 使用步骤

Compose 使用的步骤:

使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

最后,执行 docker compose up 命令来启动并运行整个应用程序。

  1. 核心功能

Compose 具有管理应用程序整个生命周期的命令:

  • 启动,停止和重建服务
  • 查看正在运行的服务的状态
  • 流式传输运行服务的日志输出
  • 在服务上运行一次性命令

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

文件语法版本

目前官方支持三个大版本, 即 Version 1、Version 2 及 Version 3, 其中 Version 1 已经被废弃掉了。

文件基本结构及常见指令

version: # 定义版本, 表示当前使用的 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

指定容器运行的镜像。以下格式都可以:

image: redis

image: redis:5

image: redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398

bc4b991aac7

image: library/redis

image: docker.io/library/redis

image: my_private.registry:5000/redis

利用:nginx:1.24.0版本的镜像来启动一个容器

使用docker compose up -d 命令来运行这个yml脚本,compose会自动启动我们的容器和一个默认的网络

查看容器启动情况:

查看网络创建情况:

使用docker compose down可以利用compose关闭容器并清理空间:会完全的删除容器和网络

command

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

command: "tail","-f","/dev/null"

command: tail -f /dev/null

command:

  • tail

  • -f

  • /dev/null

将nginx的容器的command修改为如下:启动容器后nginx服务器不会启动

利用curl 127.0.0.1 发现访问不到服务器,

查看当前容器的详细信息:cmd确实以及被我们修改了

entrypoint

覆盖容器默认的 entrypoint,可以是一个文件,也可以是一个语句

更改entrypoint之后,我们的容器不会去读取默认的entrypoint所有我们的nginx容器启动了,但是nginx服务并不会启动

environment

添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。

#map 语法

environment:

RACK_ENV: development

SHOW: "true"

USER_INPUT:

#数组语法

environment:

  • RACK_ENV=development

  • SHOW=true

  • USER_INPUT

在yml文件中配置环境变量:

查看容器中的环境变量:

networks

用于指定容器运行的网络

给yml文件进行配置:

启动后发现net1网络中加入了当前容器。

volumes

将主机的数据卷或者文件挂载到容器里

#短语法

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

指定端口映射。以下格式都可以:

#完整语法

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"

映射端口:

查看结果:

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 之前停止

services:

web:

build: .

depends_on:

  • db

  • redis

redis:

image: redis

db:

image: postgres

从构建顺序也可以看出是按照我们的依赖顺序进行的

销毁顺序也可以看出按照顺序进行销毁:

可以指定条件,healthy 需要配置 healthcheck 来完成

env_file

从文件添加环境变量。可以是单个值或列表的多个值

env_file: .env

env_file:

  • ./common.env

  • ./apps/web.env

  • /opt/secrets.env

Docker Compose****命令清单

|------------------------|----------------------------------------------------------------------------------------------------------------|
| 命令 | 功能 |
| docker compose build | 构建服务 |
| docker compose config | 规范显示服务配置 |
| docker compose cp | 在本地系统和服务器容器之间拷贝文件 |
| docker compose create | 创建服务的容器 |
| docker compose down | 停止所有容器 |
| docker compose events | 从服务器获取实时事件 |
| docker compoes exec | 在容器中指向命令 |
| docker compose images | 列出所有容器使用的镜像 |
| docker compose kill | 强制停止服务的容器 |
| docker compose logs | 显示日志 |
| docker compose ls | 显示所有项目 |
| docker compose pause | 暂停服务 |
| docker compose port | 列出所有映射端口 |
| docker compose ps | 列出项目中的所有容器 |
| docker compose pull | 拉取服务镜像 |
| docker compose push | 推送镜像 |
| docker compose restart | 重启某个服务 |
| docker compose rm | 删除服务停止容器 |
| docker compose run | 在指定服务容器上执行相关命令 |
| docker compose start | 启动被停止的容器 |
| docker compose stop | 停止某个运行的容器 |
| docker compose top | 显示运行的进程 |
| docker compose unpause | 恢复服务 |
| docker compose up | up 命令会构建,(重新)创建,启动,链接一个服务相关的容器。默认情况下如果容器已经存在,将会停止并尝试重新创建他们。并使用之前挂载的卷。--no-recreate 参数可以让容器不被停止或者重新创建,-d 表示后台运行 |
| docker compose version | 查看版本信息 |

相关推荐
xia54204644619 小时前
Docker 远程 API(Remote API)未授权访问漏洞入侵过程
运维·docker·容器
minglie119 小时前
linux中动态库的制作和调用的3个实验---第2课 python调用动态库
linux
Nile19 小时前
解密Palantir系列三:9.AIP · 从 Ontology 到 Agent,完整走一遍 AIP 工作流
服务器·人工智能·算法
Y_cheng_19 小时前
LVS知识梳理
运维·服务器·lvs
X1A0RAN19 小时前
容器化部署 Jenkins 教程
运维·docker·jenkins
程序员允诺19 小时前
Ubuntu 安装 Docker CE 和 Docker Compose 最新教程(2026)
ubuntu·docker·eureka
HiDev_20 小时前
【非标自动化】2、认识元器件(电动缸)
运维·自动化
青皮桔20 小时前
Redis AOF 文件损坏修复记录
运维·数据库·redis
happyh h h h p p p p20 小时前
LVS 项目完整知识点总结
linux·服务器·数据库
不会就选b20 小时前
Linux之磁盘--硬件
linux·服务器·网络