简介
简介
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
它可以简化多容器应用的管理,使得开发、测试和部署应用更加方便。
安装
虽然 Docker Compose 是 Docker 的一个项目,但它并不随 Docker 一起自动安装。你需要在安装 Docker 后,再单独安装 Docker Compose。
在大多数 Linux 发行版上,你可以使用以下命令来安装 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
要安装其他版本的 Compose,请替换 1.29.2。
创建软链:
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
$ docker-compose --version
cker-compose version 1.29.2, build 4667896b
在 Windows 上,Docker Compose 已经包含在 Docker Desktop 中,所以你不需要单独安装。
Compose 使用
使用 Docker Compose 需要一个 YAML 格式的配置文件,通常命名为 docker-compose.yml。在这个文件中,你可以定义你的应用的服务、网络和卷。
之后在docker-compose.yml所在的目录下执行docker compose的命令
docker-compose.yml说明
Compose 使用的三个步骤
- 使用 Dockerfile 定义应用程序的环境。
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
docker-compose.yml 的配置案例如下:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
在这个示例中,web 和 redis 是两个服务,web 服务会从当前目录的 Dockerfile 构建镜像,并映射宿主机和容器的 5000 端口。redis 服务则使用了 Docker Hub 上的公开 redis:alpine 镜像。
要运行这个 Compose 文件,你可以使用 docker-compose up 命令。这个命令会启动并运行你的整个应用。
Docker Compose 的主要命令包括:
- docker-compose up:启动并运行你的应用
- docker-compose down:停止并移除你的应用
- docker-compose build:构建或重新构建服务
- docker-compose ps:列出你的应用的状态
- docker-compose pull:拉取服务依赖的镜像
docker-compose.yml说明
docker-compose.yml 是 Docker Compose 的配置文件,用于定义应用的服务、网络和卷。以下是一个 docker-compose.yml 文件的主要组成部分:
version: '3' # Docker Compose 文件的版本
services: # 定义应用的服务
web: # 服务名称
build: . # 构建服务的 Dockerfile 所在的路径
ports: # 端口映射
- "5000:5000" # 宿主机端口:容器端口
redis: # 另一个服务名称
image: "redis:alpine" # 使用的 Docker 镜像
- version: Docker Compose 文件的版本。版本决定了你可以使用的功能和语法。
- services: 定义应用的服务。每个服务都是一个容器。
- build: 指定 Dockerfile 所在的路径,用于构建 Docker 镜像。
- image: 指定要使用的 Docker 镜像。
- ports: 端口映射。格式为 <宿主机端口>:<容器端口>。
services配置
version: '3'
services:
web:
build:
context: .
dockerfile: Dockerfile
image: my-web:latest
container_name: my-web-container
command: ["python", "app.py"]
environment:
- APP_ENV=production
volumes:
- ./data:/var/data
ports:
- "5000:5000"
networks:
- mynetwork
depends_on:
- db
db:
image: postgres:latest
volumes:
- db-data:/var/lib/postgresql/data
networks:
mynetwork:
volumes:
db-data:
常用的配置说明
- build: 用于指定 Dockerfile 的路径,或者一个包含 context 和 dockerfile 的对象。
- image: 用于指定服务使用的镜像。
- container_name: 用于指定容器的名称。
- command: 用于覆盖默认的启动命令。
- environment: 用于设置环境变量。
- volumes: 用于挂载卷。
- ports: 用于映射端口。
- networks: 用于指定网络。
- depends_on: 用于指定服务的依赖关系。
environment
用于设置环境变量。这些环境变量在容器启动时被添加到容器中,可以被容器内运行的应用程序访问。
Docker Compose 在启动容器时,会将这些环境变量传递给容器,如果容器中已经存在同名的环境变量,那么这些环境变量的值将被 environment 中的值覆盖。
services:
web:
image: my-web:latest
environment:
- VAR1=value1
- VAR2=value2
也可以使用一个环境变量文件 .env,然后在 docker-compose.yml 文件中使用 env_file 子配置来指定这个文件:
services:
web:
image: my-web:latest
env_file:
- .env
network
还可以定义network
通过定义网络,你可以控制容器之间的通信。例如,你可以将数据库和后端服务放在同一个网络中,而将前端服务放在另一个网络中,这样前端服务就无法直接访问数据库,增加了安全性。
version: '3'
services:
web:
image: nginx:alpine
networks:
- mynetwork
networks:
mynetwork:
在这个例子中,创建了一个名为 mynetwork 的网络,并将 web 服务连接到这个网络。
volumes
用于将宿主机上的文件映射存储到容器的指定目录,宿主机的源文件或挂载点的文件修改了对应的一方也会立即反映到宿主机上,这是因为实际上是在宿主机和容器之间共享了同一份文件或目录。(所以是不需要重启服务就可以做出同样的更改)
version: '3'
services:
web:
image: nginx:alpine
volumes:
- volume1:/path/in/container1
- volume2:/path/in/container2/xgss.txt
volumes:
volume1:/path/in/linux1
volume2:/path/in/linux2/xgss.txt
或
version: '3'
services:
web:
image: nginx:alpine
volumes:
- /path/in/linux1:/path/in/container1
- /path/in/linux2/xgss.txt:/path/in/container2/xgss.txt
在这个例子中,web 服务有两个挂载目录:volume1 挂载到容器的 /path/in/container1,volume2 挂载到容器的 /path/in/container2。
restart
restart 子配置用于设置容器的重启策略。这决定了在容器退出时 Docker 应该如何处理它。以下是可用的选项:
- no: 这是默认设置,容器在退出时不会自动重启。
- always: 容器在退出时总是会自动重启,无论退出代码是什么。(用户明确使用 docker stop 或 docker kill 命令停止容器后也会重启)
- on-failure: 只有在容器以非零状态退出时,Docker 才会自动重启它。(我们说一个容器以非零状态退出,我们是指在容器中运行的主进程已经结束,并且返回了一个非零的退出状态。这通常意味着在容器中运行的程序遇到了错误或异常情况,导致它不能正常运行。 )
- unless-stopped: 容器在退出时总是会自动重启,除非用户明确地停止了它。(使用 docker stop 或 docker kill 命令停止了容器后不会自动重启)
services:
web:
image: my-web:latest
restart: on-failure
logging
logging 子配置用于定义容器的日志记录配置。这包括日志驱动(driver)和驱动的配置选项(options)。
logging 子配置定义的日志策略不会影响容器内使用的日志框架如logback的日志记录。
会记录容器的所有标准输出(STDOUT)和标准错误(STDERR)日志。这包括你的应用程序写入 STDOUT 和 STDERR 的所有内容。(比如我们部署的web项目,控制台输出的内容都会记录到这个日志文件中)
重启容器日志文件不会消失,新的日志会继续追加到同一个日志文件中,除非你设置了日志文件的最大大小和文件数量,超过这个限制时,旧的日志文件会被删除。
删除并重新创建了容器(例如,通过 docker-compose down 和 docker-compose up),那么旧的日志文件会被删除,因为 Docker 会为新的容器创建新的日志文件。
services:
web:
image: my-web:latest
logging:
driver: json-file
options:
max-size: "200k"
max-file: "10"
我们为 web 服务的容器设置了 json-file 日志驱动,并配置了两个选项:max-size 和 max-file。这意味着日志文件的最大大小为200KB,且最多保留10个日志文件。
可用的日志驱动包括 json-file、syslog、journald、gelf、fluentd、awslogs、splunk、etwlogs、gcplogs 和 logentries。
Docker 提供了多种日志驱动,每种驱动都有其特定的用途和特性:
- json-file: 这是 Docker 的默认日志驱动。它将日志写入 JSON 文件。
- syslog: 这个驱动将日志发送到系统的 syslog 服务。这对于集成到系统的日志系统非常有用。
- journald: 这个驱动将日志发送到 systemd 的 journald 服务。
- gelf: 这个驱动将日志发送到 Graylog2 服务器。
- fluentd: 这个驱动将日志发送到 Fluentd 服务器,这是一个开源的数据收集器。
- awslogs: 这个驱动将日志发送到 Amazon CloudWatch Logs 服务。
- splunk: 这个驱动将日志发送到 Splunk 日志分析平台。
- etwlogs: 这个驱动将日志发送到 Windows 的 Event Tracing for Windows (ETW) 服务。
- gcplogs: 这个驱动将日志发送到 Google Cloud Platform (GCP) 的 Stackdriver Logging 服务。
- logentries: 这个驱动将日志发送到 Logentries 日志分析平台。
选择哪种日志驱动取决于你的特定需求和环境。例如,如果你正在使用 AWS 平台,那么 awslogs 可能是一个好选择。如果你正在使用 GCP,那么 gcplogs 可能更好
日志要怎么看:
可以使用 docker logs 命令来查看容器的日志。例如,如果你的服务名为 web,你可以使用以下命令来查看它的日志:
docker-compose logs web
如果你使用的是 json-file 日志驱动(这是 Docker 的默认设置),日志文件通常是宿主机的 /var/lib/docker/containers/<container-id>/<container-id>-json.log。
注意:这里的container-id是容器id的全称,docker ps命令看到的容器id是全称的前12位