Docker Compose 是一个由 Docker 官方开发的开源工具,用于定义和运行多容器的 Docker 应用。如果你想要一次启动多个容器,并且这些容器之间有依赖关系或者需要协同工作,那么 Docker Compose 是一个理想的工具。
Compose 项目: Compose 的目标是处理“项目”。一个项目对应于一个“docker-compose.yml”文件,该文件描述了一组相关的容器和它们的属性。
服务: 在 Compose 中,服务是由 Docker 容器实例化的。一个服务对应于 Docker Compose 配置中的一个“服务定义”。一个服务可能由多个容器组成,这些容器都是从同一个镜像实例化的。
项目: 一个项目是由 Compose 管理的一组容器。这些容器是在同一网络上运行的,由同一个“docker-compose.yml”文件定义的。
使用 Docker Compose,你可以通过一个 YAML 文件定义多容器应用的服务、网络和卷。然后,使用一个简单的命令,就可以从这个文件启动所有的服务。
Compose 与 Docker CLI 以及 Docker Engine API 交互,以管理和运行应用的服务。通过 Compose,你可以启动、停止、构建服务,查看服务的日志等。
这是 Docker Compose 的核心。在这个文件中,你定义了所有的服务、网络和卷。这个文件是用 YAML 格式编写的,使得它既简单又易读。
例如, 你可能会有一个 Web 服务、一个后端数据库和一个负载均衡器。每个服务都定义在 docker-compose.yml
文件中,然后可以一次性启动所有服务。
Docker Compose v2 是 Docker Compose 的最新版本,与早期的 Python 版本相比,它带来了许多新功能和优化。最大的变化是它现在是用 Go 语言编写的,并且已经集成到了 Docker CLI 中,作为一个子命令。
集成到 Docker CLI: 与 Docker CLI 更紧密地集成,为用户提供了更流畅的体验。你不再需要单独的 docker-compose
命令,只需使用 docker compose
即可。
Go 语言重写: 使用 Go 语言重写意味着性能的提升和更好的跨平台兼容性。
新功能和优化: 带来了一些新功能和对旧功能的优化,使得定义和管理多容器应用更加简单和高效。
安装: 根据 Docker 官方文档的指引安装 Compose v2。
替换命令: 早期版本的 Docker Compose 使用 docker-compose
命令,而在 Compose v2 中,你只需使用 docker compose
(注意没有“-”)。
常用命令: 大部分常用的命令和参数与早期版本保持一致。例如,docker compose up
用于启动服务,docker compose down
用于停止服务。
docker-compose
命令,你可能需要更新它们以适应新的命令语法。Docker Compose 是一个工具,用于定义和运行多容器 Docker 应用程序。通过 Compose,你可以使用 docker-compose.yml
文件来配置应用程序的服务,然后使用一个命令来启动和停止所有服务。
预装在 Docker Desktop:
docker-compose
,因为它已经包含在里面。$ docker-compose --version
docker-compose version 1.27.4, build 40524192
二进制包安装:
$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
PIP 安装:
$ sudo pip install -U docker-compose
bash 补全命令:
docker-compose
更方便,可以安装 bash 补全命令。$ curl -L https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
二进制包安装的卸载:
$ sudo rm /usr/local/bin/docker-compose
PIP 安装的卸载:
$ sudo pip uninstall docker-compose
注意: 选择哪种安装方法取决于你的操作系统和使用习惯。在大多数情况下,二进制包安装是最简单和推荐的方法。但如果你正在使用 ARM 架构(如树莓派)或者喜欢使用 pip,那么 pip 安装也是一个不错的选择。
构建一个 web 网站,这个网站能够记录并显示页面被访问的次数。这样的一个简单项目通常会包括 web 服务(显示页面)和一个数据库或缓存服务(记录访问次数)。
Web 应用:
a. 新建一个文件夹并进入该文件夹。
b. 在此目录中创建 app.py
:
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello World! 该页面已被访问 {} 次。\n'.format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
Dockerfile:
创建一个 Dockerfile
来指定如何构建 web 应用的容器:
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]
Compose 文件:
创建一个 docker-compose.yml
文件,这是 Compose 的核心,它定义了项目中的所有服务:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
运行 Compose 项目:
使用以下命令启动 Compose 项目:
$ docker-compose up
然后,访问 http://localhost:5000
。每次刷新页面,你会看到计数增加。
小结: 使用 Docker Compose,你可以很容易地定义和管理多容器应用。在这个简单的示例中,我们创建了一个 Flask web 应用和一个 Redis 服务,两者通过 Compose 文件定义并关联起来。
Compose 的命令结构为 docker-compose [-f=
,其中 COMMAND 是 Compose 提供的具体命令,如 up
、down
、logs
等。
-f, --file FILE
:
docker-compose.yml
。# 使用特定的模板文件启动服务
docker-compose -f docker-compose.prod.yml up
形象化解释: 这就像你有多个配置文件,并且你想使用其中一个特定的配置启动应用。-p, --project-name NAME
:
# 使用特定的项目名称启动服务
docker-compose -p myproject up
形象化解释: 这就像给你的项目或任务一个特定的名字,使其更容易识别。--verbose
:
docker-compose --verbose up
形象化解释: 这就像你在查找问题时需要更详细的日志或信息,这个选项会给你更多的内部信息。-v, --version
:
docker-compose --version
形象化解释: 这就像检查你手机或电脑上的应用程序版本。build
docker-compose build [options] [SERVICE...]
--force-rm
: 删除构建过程中的临时容器。--no-cache
: 构建过程中不使用缓存。--pull
: 始终尝试通过 pull 更新镜像。docker-compose build --no-cache web
此命令将构建名为“web”的服务,同时不使用任何缓存。build
命令就是告诉工人开始建造,并指明是否使用之前保存的材料(缓存)。config
docker-compose config
docker-compose config
此命令将显示并验证当前目录下的 docker-compose.yml
文件。down
docker-compose down [options]
--volumes
or -v
: 同时移除与项目关联的数据卷。docker-compose down --volumes
此命令将停止并删除所有容器,并移除数据卷。exec
docker-compose exec [options] SERVICE COMMAND
-d
: 后台运行。-u
: 指定用户。docker-compose exec -u root web bash
此命令将以 root 用户身份在正在运行的“web”服务容器内启动 bash shell。images
docker-compose images [SERVICE...]
# 列出项目中的所有使用的镜像。
docker-compose images
kill
docker-compose kill [options] [SERVICE...]
-s SIGNAL
: 指定发送的信号。# 使用 SIGINT 信号来停止“web”服务容器。
docker-compose kill -s SIGINT web
logs
docker-compose logs [options] [SERVICE...]
--no-color
: 不使用颜色输出。# 显示“web”服务的输出,但不使用颜色。
docker-compose logs --no-color web
pause
用途: 暂停服务容器。
用法:
docker-compose pause [SERVICE...]
示例:
# 暂停“web”服务容器。
docker-compose pause web
在此命令执行后,所有与“web”服务相关的容器都会被暂停,但它们的状态并未被终止,可以随时恢复。
形象化解释: 就像你暂停了一个正在播放的视频,虽然视频暂停了,但你可以随时点击播放按钮继续观看。
port
docker-compose port [options] SERVICE PRIVATE_PORT
--protocol=proto
: 指定端口协议,tcp(默认值)或者 udp。# 显示“web”服务的 8080 端口映射到主机的哪个端口。
docker-compose port web 8080
ps
用途: 列出项目中的所有容器,显示容器的状态、端口等信息。
用法:
docker-compose ps [options] [SERVICE...]
参数:
-q
: 只打印容器的 ID 信息。示例:
# 查看所有服务的容器状态
docker-compose ps
执行此命令将会显示项目中所有容器的列表,包括其名称、命令、状态、端口等信息。
形象化解释: 就像查看一个管理面板,列出当前项目中运行的所有任务及其状态。
pull
用途: 拉取服务所依赖的镜像。
用法:
docker-compose pull [options] [SERVICE...]
参数:
--ignore-pull-failures
: 在拉取过程中忽略错误。示例:
# 拉取“web”服务所依赖的镜像
docker-compose pull web
执行此命令将会从 Docker Hub 或其他配置的镜像仓库中拉取“web”服务在 docker-compose.yml
文件中指定的镜像。
形象化解释: 就像你从一个云存储服务下载文件,pull
命令允许你从镜像仓库下载所需的镜像到本地。
push
docker-compose push [options] [SERVICE...]
--ignore-push-failures
: 在推送过程中忽略错误。# 将“web”服务的镜像推送到 Docker Hub。
docker-compose push web
restart
docker-compose restart [options] [SERVICE...]
-t, --timeout TIMEOUT
: 在重启前停止容器的超时(默认为 10 秒)。# 重新启动“web”服务
docker-compose restart web
rm
docker-compose rm [options] [SERVICE...]
-f, --force
: 不询问直接删除。-s
: 停止和删除。-v
: 同时删除与容器相关的数据卷。# 删除已停止的“web”容器
docker-compose rm web
run
docker-compose run [options] SERVICE [COMMAND]
--name NAME
: 为容器指定一个名字。-d
: 后台运行。--rm
: 命令完成后自动删除容器。...
: 还有许多其他参数。# 在“web”服务容器上执行`ls`命令
docker-compose run web ls
scale
docker-compose scale SERVICE=NUM
# 将“web”服务的容器数量设置为3
docker-compose scale web=3
start
docker-compose start [SERVICE...]
# 启动已停止的“web”服务容器
docker-compose start web
stop
docker-compose stop [options] [SERVICE...]
-t, --timeout TIMEOUT
: 指定停止容器前的超时时间(默认为 10 秒)。# 停止“web”服务
docker-compose stop web
top
docker-compose top [SERVICE...]
# 显示“web”服务容器中的进程
docker-compose top web
unpause
docker-compose unpause [SERVICE...]
# 恢复暂停的“web”服务
docker-compose unpause web
up
docker-compose up [options] [SERVICE...]
-d
: 在后台运行。--no-color
: 不使用颜色输出。--no-deps
: 不启动服务的依赖。--force-recreate
: 强制重新创建容器。--no-recreate
: 不重新创建容器。--no-build
: 不自动构建镜像。-t, --timeout TIMEOUT
: 指定停止容器前的超时时间。# 启动并运行“web”服务
docker-compose up web
docker-compose.yml
文件中定义的所有服务。version
docker-compose version
docker-compose version
Docker Compose 模板文件是 Docker Compose 的核心,它定义了一组容器及其配置,使用户能够一次性启动和停止一组相关的容器。下面是关于 Compose 模板文件的一些关键说明和指令的详细描述:
docker-compose.yml
。version: "3"
.Docker Compose 提供了一种动态地从系统环境变量和当前目录下的 .env
文件中读取变量的能力,从而为配置增添了灵活性。这意味着,你可以根据不同的环境或需求来调整配置,而无需直接修改 Compose 文件。
如何工作?
从环境变量直接读取:
你可以在 Compose 文件中使用 ${VARIABLE_NAME}
的格式来引用环境变量。例如,以下的 Compose 文件:
version: "3"
services:
db:
image: "mongo:${MONGO_VERSION}"
执行以下命令:
MONGO_VERSION=3.2 docker-compose up
Compose 会使用环境变量的值替换 ${MONGO_VERSION}
,从而使用 mongo:3.2
镜像启动容器。
从 .env
文件读取:
如果 Compose 文件所在的目录下有一个 .env
文件,Compose 会自动从这个文件中读取环境变量。这为配置提供了一个方便的方式,尤其是当有多个要设置的环境变量或不希望在命令行中显示这些值时。
例如,.env
文件内容如下:
# 支持 # 号注释
MONGO_VERSION=3.6
当你执行 docker-compose up
时,Compose 会读取 .env
文件并使用 mongo:3.6
镜像启动容器。
形象化解释:
想象 Compose 文件就像一个️ 菜单,而环境变量或 .env
文件就像是客人的 特殊要求。当你为客人准备食物时,你会根据这些特殊要求来调整食谱,确保满足客人的需求。这样,你不需要为每个客人的特殊要求都准备一个单独的菜单,只需调整现有的菜单即可。
build
:version: '3'
services:
webapp:
build: ./dir
形象化解释: 就像手工制作一个食谱,然后按照食谱准备食物。image
:image: ubuntu
形象化解释: 就像从菜单中选择一个预先制作的食物。ports
:ports:
- "3000:3000"
形象化解释: 就像为客户提供从外部访问店内的门。environment
:environment:
- RACK_ENV=development
形象化解释: 就像设置餐厅的氛围或温度。volumes
:volumes:
- /var/lib/mysql
- cache/:/tmp/cache
形象化解释: 就像为餐厅指定存放食材的冷藏室或储藏室。links
:links:
- db
形象化解释: 就像连接餐厅的不同部分或区域。depends_on
:depends_on:
- db
- redis
形象化解释: 例如,在打开餐厅前确保所有食材和工具都已准备好。networks
:networks:
- frontend
- backend
形象化解释: 就像为餐厅设置不同的通讯频道或区域。command
:command: echo "hello world"
形象化解释: 就像改变餐厅开门后的第一首播放的歌曲。cap_add, cap_drop
:cap_add:
- ALL
cap_drop:
- NET_ADMIN
形象化解释: 就像为员工分配或撤销某些权限或职责。env_file
:env_file:
- ./common.env
- ./apps/web.env
形象化解释: 就像从多个食谱书中找到所需的食材。environment
:environment:
RACK_ENV: development
SESSION_SECRET:
形象化解释: 就像为餐厅设置氛围或主题。expose
:expose:
- "3000"
形象化解释: 就像一个专供员工使用的门,客人看不到。external_links
:external_links:
- redis_1
- project_db_1:mysql
形象化解释: 就像与餐厅外部的供应商建立联系。healthcheck
:healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
形象化解释: 就像定期检查食材是否新鲜。image
:image: ubuntu:latest
形象化解释: 就像选择餐厅的主菜。labels
:labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
形象化解释: 就像给餐厅的每个区域贴上说明标签。network_mode
:network_mode: "bridge"
形象化解释: 就像选择餐厅的内部通信方式。networks
:networks:
some-network:
other-network:
形象化解释: 就像为餐厅的各个房间设置专门的通信线路。pid
:pid: "host"
形象化解释: 就像让餐厅的员工能在所有房间之间自由移动。ports
:ports:
- "8000:8000"
形象化解释: 就像为餐厅的大门安装一个门牌号。secrets
:secrets:
db_password:
file: ./db_password.txt
形象化解释: 就像餐厅有一个保险箱来存放重要文件。security_opt
:security_opt:
- seccomp:unconfined
形象化解释: 就像设置餐厅的安全措施。stop_signal
:stop_signal: SIGUSR1
形象化解释: 就像一个特定的哨声来通知餐厅员工下班。sysctls
:sysctls:
net.ipv4.ip_forward: 1
形象化解释: 调整餐厅的内部设置以满足特定需求。ulimits
:ulimits:
nproc: 65535
形象化解释: 就像为餐厅设置最大客户数量。volumes
:volumes:
- /data:/data
形象化解释: 就像在餐厅的储藏室里为食材和酒找到一个地方。entrypoint
:entrypoint: /code/entrypoint.sh
形象化解释: 就像当你进入餐厅时,有一个迎宾员来欢迎你。user
:user: nginx
形象化解释: 就像在餐厅里,有个员工负责特定任务。working_dir
:working_dir: /code
形象化解释: 就像在餐厅里为厨师指定一个特定的工作区域。domainname
, hostname
, mac_address
:domainname: your_website.com
hostname: test
mac_address: 08-00-27-00-0C-0A
形象化解释: 就像为餐厅取个名字,分个区域,并给每个区域一个编号。privileged
:privileged: true
形象化解释: 就像给餐厅的某些员工特权,允许他们进入特定的区域。restart
:restart: always
形象化解释: 就像每次餐厅关闭后,第二天都会重新开放。read_only
:read_only: true
形象化解释: 就像有些餐厅的房间只允许特定的员工进入,不允许客人进入。stdin_open
, tty
:stdin_open: true
tty: true
形象化解释: 就像餐厅有一个服务台,客户可以直接和员工交谈。127.0.0.1
加端口号访问其他容器。内部网络通信:
A
可以通过名称 B
连接到服务 B
。端口映射:
docker-compose.yml
中配置,如 ports: - "5000:5000"
。桥接网络使用:
docker-compose.yml
设置 network_mode
为 bridge
。主机网络模式:
network_mode
设置为 host
。️ 相关 Docker 命令:
查看所有容器 IP 地址:
# 查看所有容器的 IP 地址
docker ps -q | xargs -n 1 docker inspect --format '{{ .Name }}: {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
提取特定容器 IP:
# 提取特定容器的 IP 地址
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_name_or_id>
容器部署和管理:
# 清理并复制新的配置文件
rm -rf /root/mall4cloud/
cp -R /mnt/d/Ubuntu/mall4cloud/ /root/mall4cloud
cp /mnt/d/Ubuntu/mall4cloud/docker-compose.yaml /root/mall4cloud/docker-compose.yaml
chmod -R 777 /root/mall4cloud/
# 启动 Docker Compose 服务
docker-compose up -d --build
# 停止并移除容器
docker-compose down
# 查看容器日志
docker-compose logs -f