A. 什么是 Docker Compose?

Docker Compose 是一个用于定义和管理多容器 Docker 应用程序的工具。使用 Docker Compose,您可以使用一个 YAML 文件(通常命名为 docker-compose.yml)来定义应用程序所需的所有服务、网络和卷等配置,然后通过简单的命令来启动、停止和管理整个应用栈。它非常适合在开发、测试和生产环境中使用,尤其是在需要管理多个相互依赖的容器时。

B. Docker Compose 的核心概念

  1. 服务(Services)

    • 一个服务代表一个运行中的容器。Compose 文件中的每个服务定义了容器的镜像、环境变量、端口映射、卷挂载等配置。
  2. 网络(Networks)

    • Compose 可以定义多个服务之间的通信网络,每个服务可以连接到一个或多个网络。默认情况下,所有服务都会连接到一个默认的网络中。
  3. 卷(Volumes)

    • 卷是用于持久化数据的存储,可以在多个容器之间共享。Compose 文件中可以定义和管理这些卷。

C. Docker Compose 的安装

在大多数现代操作系统上,Docker Compose 已经作为 Docker Desktop 的一部分被自动安装。如果您使用 Linux,可以通过以下命令手动安装 Docker Compose:

1
2
sudo apt-get update
sudo apt-get install docker-compose-plugin

您可以通过以下命令检查 Docker Compose 是否已经安装成功:

1
docker compose version

D. 如何使用 Docker Compose

D.1. 创建 docker-compose.yml 文件

这个文件定义了应用程序的所有服务、网络和卷的配置。以下是一个简单的 docker-compose.yml 文件示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    networks:
      - webnet

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - webnet

volumes:
  db_data:

networks:
  webnet:

在这个例子中:

  • web 服务使用 nginx 镜像,暴露端口 8080,并将本地的 ./html 目录挂载到容器内的 /usr/share/nginx/html
  • db 服务使用 mysql:5.7 镜像,并设置了 MYSQL_ROOT_PASSWORD 环境变量,还使用一个命名卷 db_data 来持久化数据库数据。
  • 两个服务都连接到名为 webnet 的自定义网络。

D.2. 启动服务

在包含 docker-compose.yml 文件的目录中运行以下命令以启动所有定义的服务:

1
docker compose up

此命令会拉取必要的镜像、创建并启动容器,并设置网络和卷。默认情况下,日志输出会显示在终端中。

如果希望在后台运行这些服务,可以使用 -d 选项:

1
docker compose up -d

D.3. 停止和删除服务

要停止所有正在运行的服务,您可以运行:

1
docker compose down

这个命令不仅会停止容器,还会删除容器、网络、卷(可选)等。

如果您希望删除数据卷,可以添加 -v 选项:

1
docker compose down -v

D.4. 查看服务状态

您可以使用以下命令查看当前所有服务的状态:

1
docker compose ps

D.5. 查看服务日志

要查看某个服务的日志,可以使用以下命令:

1
docker compose logs <service_name>

例如,要查看 web 服务的日志,可以运行:

1
docker compose logs web

D.6. 重新启动服务

要重新启动某个服务,您可以使用以下命令:

1
docker compose restart <service_name>

或者重新启动所有服务:

1
docker compose restart

D.7. 进入正在运行的容器

您可以使用以下命令进入正在运行的容器:

1
docker compose exec <service_name> <command>

例如,要进入 web 服务的容器并打开一个 Bash 终端,可以运行:

1
docker compose exec web bash

E. 卸载操作

E.1. 散装删除的方法

E.1.1. 停止使用该镜像的容器

列出所有正在运行的容器:

1
docker ps

列出所有容器,包括已停止的容器:

1
docker ps -a

运行一个停止的容器

1
docker start container_id

停止运行的容器:

1
docker stop <container_id>

删除容器:

1
docker rm <container_id>

E.1.2. 删除 Docker 镜像

一旦确认没有任何容器在使用该镜像,就可以删除该镜像。你可以使用镜像的名字或 ID 删除镜像。

使用镜像名字删除:

1
docker rmi my-image:latest

使用镜像 ID 删除:

1
docker rmi d64d3505b0d2

如果镜像有多个 tag,可以使用 -f 强制删除:

1
docker rmi -f <image_id>

确认镜像已删除: 再次列出所有镜像,确认镜像已成功删除。

1
docker images

注意:如果你在删除镜像时遇到问题,确保没有任何容器在使用该镜像。你可以通过删除所有未使用的镜像来清理系统:

1
docker image prune -a

E.2. 批量

1
docker-compose down --rmi all -v

删除容器时,卷和镜像一起删除