docker-compose
docker-compose是基于docker的开源项目,托管于github上,由python实现,调用 docker服务的API负责实现对docker容器集群的快速编排,即通过一个单独的yaml文件,来定义一组相关的容器来为一个项目服务。
简单来说,docker-compose能批量操作容器,比如说一组容器按序启动,但是只能单机操作,不能去管理其他服务器上的容器。
Compose 中有两个重要的概念:
- 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义(docker-compose.yml文件所在的目录名就是项目名称,所以应该单独创建一个目录,如需用到dockerfire就和dockerfire文件放一起)。
Compose 允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
注意:yml文件中用空格控制缩进,不能使用tab缩进,空格的数量不重要,但是必须保持每个块内的代码空格缩进数量一致,- 符号被视为缩进的一部分。
docker-compose.yml
version: "3"
services:
webapp:
build: .
container_name: web01
ports:
- "80:80"
- "8081:8081"
volumes:
- "/data/apps:/apps"
networks:
- my_network
depends_on:
- mysql
- redis
redis:
image: redis
command: redis-server --requirepass 123456 --appendonly yes # redis容器密码,开启持久化
restart: always
networks:
- my_network
mysql:
image: mysql:5.7
expose:
- "3306"
environment:
- "MYSQL_ROOT_PASSWORD=123456"
volumes:
- mysql_data:/var/lib/mysql
networks:
- my_network
networks:
my_network:
volumes:
mysql_data:
version:代表使用docker-compose项目的版本号,参考官网,第一列为docker-compose的版本号,对应第2列docker引擎的版本号,docker引擎的版本号通过docker -v查看。
services标签管理一组服务,里面就是具体的容器服务配置。
webapp、redis、mysql:服务名称,当未指定容器名称时,默认将会使用 项目名称_服务名称_序号 这样的格式为容器名(项目名称为yml文件所在目录名称)。注意每个服务都必须通过image指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。
build:指定 Dockerfile 所在文件夹的路径,如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中重复设置。
# 使用 build . 是指定docker-compose文件当前目录的Dockerfire文件,还可以使用这种写法:
build:
context: dockerfire_path
dockerfire: dockerfire_name
container_name:指定容器名称后,该服务将无法进行扩展(scale),因为 Docker 不允许多个容器具有相同的名称。
ports:端口映射到宿主机,容器端口 (HOST:CONTAINER) 格式,建议数字串都采用引号包括起来的字符串格式。
networks:配置容器连接的网络,需要在最下方定义该网桥,否则不会自动创建。
volumes:数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER)或者数据卷名称(VOLUME:CONTAINER),并且可以设置访问模式(HOST:CONTAINER:ro)。注意:如使用宿主机目录,该目录需存在,而不会像docker run一样自动创建;如使用数据卷别名的方式,则需要在最下方使用volumes定义该数据卷别名,否则也不会自动创建,参考上面例子中的myslq数据卷。
depends_on:容器启动顺序,该配置代表该服务依赖于两个数据库服务,会按mysql-redis-webapp的顺序启动容器,但不是说web容器会等db容器完全启动了才会启动。
command:覆盖容器启动后默认执行的命令。
restart:容器重启策略。
expose:暴露端口,但不映射到宿主机,只被连接的服务访问。
environment:设置环境变量。可以使用 RACK_ENV: development 和 "MYSQL_ROOT_PASSWORD=123456" 这两种格式,推荐后者。
Compose 命令说明
对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。
比如说,docker compose up命令,会启动该项目中的所有服务,docker compose up mysql,则只会启动mysql服务,这里最后的服务名称和compose.yml文件中的服务名称对应。
config命令:验证 Compose 文件格式是否正确
# 语法,会自动检测当前目录的docker-compose.yml文件
docker compose config
up命令:它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
- 链接的服务都将会被自动启动,除非已经处于运行状态。
- 可以说,大部分时候都可以直接通过该命令来启动一个项目。
- 默认情况,docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。
- 当通过 Ctrl-C 停止命令时,所有容器将会停止。
- 默认情况,如果服务容器已经存在,docker compose up 将会尝试停止容器,然后重新创建(保持使用volumes-from 挂载的卷)。
# 语法,缺省服务名则默认针对整个项目
docker compose up [选项] [服务名称...]
# 选项
-d # 在后台运行服务容器,一般推荐生产环境下使用该选项。
--no-color # 不使用颜色来区分不同的服务的控制台输出。
--no-deps # 不启动服务所链接的容器。
--force-recreate # 强制重新创建容器,不能与 --no-recreate 同时使用。
--no-recreate # 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
--no-build # 不自动构建缺失的服务镜像。
-t, --timeout TIMEOUT # 停止容器时候的超时(默认为 10 秒)。
down命令:此命令将会停止 up 命令所启动的容器,并移除网络
# 语法,缺省服务名则默认针对整个项目
docker compose down [服务名称...]
exec命令:进入指定的容器
# 语法,等同于docker exec -ti 容器ID bash
docker compose exec 服务名称|容器ID bash
ps命令:列出项目中目前的所有容器
# 语法
docker compose ps [选项] [服务名称...]
# 选项
-q # 只打印容器的 ID 信息
restart命令:重启项目中的服务
# 语法
docker compose restart [选项] [服务名称...]
# 选项
-t, --timeout TIMEOUT # 指定重启前停止容器的超时(默认为 10 秒)。
rm命令:删除所有(停止状态的)服务容器。推荐先执行 docker compose stop 命令来停止容器。
# 语法
docker compose rm [选项] [服务名称...]
# 选项
-f, --force # 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。
-v # 删除容器所挂载的数据卷。
stop命令:停止已经处于运行状态的容器,但不删除它。通过 docker compose start 可以再次启动这些容器。
# 语法
docker compose stop [选项] [服务名称...]
# 选项
-t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。
start命令:启动已经存在的服务容器
# 语法
docker compose start [服务名称...]
top命令:查看各个服务容器内运行的进程
# 语法
docker compose top [服务名称...]
pause与unpause命令:暂停一个服务容器与恢复处于暂停状态中的服务
# 语法,使用docker ps查看暂停状态会在STATUS里显示为Paused
docker compose pause [服务名称...]
docker compose unpause [服务名称...]
logs命令:查看服务容器的输出。默认情况下,docker compose 将对不同的服务输出使用不同的颜色来区分。
# 语法
docker compose logs [选项] [服务名称...]
# 选项
--no-color # 关闭颜色
-f # 实时刷新