1. 简介
Docker-Compose项目是Docker官方的开源项目,是对Docker容器集群的快速编排的工具。
2. 安装
sudo curl -L https://github.com/docker/compose/releases/download/1.29.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose -v
Windows 在安装docker桌面版本的时候已经包含了Compose,因此不需要单独安装 Compose
3. 常用命令
3.1. Docker-compose命令格式
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
3.2. docker-compose ps
用于列出 Compose 应用中所有容器。输出内容包括当前状态、容器运行的命令以及网络端口。
docker-compose ps
3.3. docker-compose up
docker-compose up 用于构建、启动容器。
docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
-d 参数令应用在后台启动。
–-build 在启动容器前构建服务镜像
–-no-build 不自动构建缺失的服务镜像
--t, –-timeout TIMEOUT 停止容器时候的超时(默认为10秒)
--no-color 不是有颜色来区分不同的服务的控制输出
--force-recreate 强制重新创建容器,不能与--no-recreate同时使用
–-no-recreate 如果容器已经存在,则不重新创建,不能与–-force-recreate同时使用
–-bort-on-container-exit 停止所有容器,如果任何一个容器被停止,不能与-d同时使用
–-remove-orphans 删除服务中没有在compose文件中定义的容器
docker-compose up
docker-compose up -d
3.4. docker-compose stop
停止正在运行的容器,但不会删除它们。
docker-compose stop [options] [SERVICE...]
选项包括:
-t, –timeout TIMEOUT,指定重启前停止容器的超时(默认为10秒)
docker-compose stop
3.5. docker-compose restart
重启已停止的容器
docker-compose restart [options] [SERVICE...]
选项包括:
-t, –timeout TIMEOUT,指定重启前停止容器的超时(默认为10秒)
docker-compose restart
3.6. docker-compose rm
删除所有已停止的服务容器。
docker-compose rm [options] [SERVICE...]
docker-compose rm
删除所有已停止服务容器。建议先执行docker-compose stop命令来停止容器。
3.7. docker-compose down
停止并删除运行中的容器、网络、卷、镜像。
docker-compose down [options]
docker-compose down
3.8. docker-compose kill
通过发送SIGKILL信号来停止指定服务的容器
docker-compose kill kafka
3.9. docker-compose config
查看compose文件配置
docker-compose config [options]
3.10. docker-compose create
为服务创建容器
docker-compose create
4. docker-compose.yml 属性
4.1. 模板文件简介
Compose允许用户通过一个docker-compose.yml模板文件来定义一组相关联的应用容器为一个项目
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
restart: unless-stopped
hostname: zookeeper
ports:
- "2181:2181"
container_name: zookeeper
# kafka version: 1.1.0
# scala version: 2.12
kafka:
image: wurstmeister/kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 192.168.31.64
KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
KAFKA_BROKER_ID: 1
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_CREATE_TOPICS: "stream-in:1:1,stream-out:1:1"
KAFKA_LOG_DIRS: "/kafka/logs"
depends_on:
- zookeeper
container_name: kafka
4.2. version
指定 docker-compose.yml 文件的写法格式
Compose目前有三个版本分别为Version 1,Version 2,Version 3,Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。
Version 2支持更多的指令。Version 1将来会被弃用
4.3. services
多个容器集合
4.4. image
image是指定服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。
4.5. build
服务除了可以指定的镜像 image,还可以利用Dockerfile自动构建镜像。
[!NOTE] 若同时指定image和build标签,Compose会构建镜像并且把镜像命名为image值指定的名字。
build指定 Dockerfile 所在文件夹的路径
#绝对路径
build: /www/blog/docker
#相对路径只要上下文能读取到Dockerfile就可
build: ./docker
#设定上下文根目录,以该目录为准指定Dockerfile。
build:
context: /www/blog/docker
dockerfile: Dockerfile
args:
username: yzx
password: secret
参数:
context : 可以是Dockerfile的文件路径,也可以是到链接到git仓库的url.
dockerfile : 指定Dockerfile文件名,若context指定了文件名,这里就不用设置了。
args : 添加构建参数,这些参数是仅在构建过程中可访问的环境变量
首先, 在Dockerfile文件中指定参数:
ARG username
ARG password
然后指定 build 下的参数,可以传递映射或列表 (与env不同的是,agr可以为空值)
build:
context: /www/blog/docker/Dockerfile
args:
username: yzx
password: secret
[!NOTE] YAML布尔值(true,false,yes,no,on,off)必须使用引号括起来,才能正常被解析为字符串.
4.6. restart
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
4.7. hostname
内网里可以直接用hostname的命名来代替其IP地址
4.8. ports
映射端口
使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口。
ports:
- "2181:2181"
- "127.0.0.1:8001:8001"
[!NOTE] 若使用的容器端口小于60可能会得到错误得结果,因为YAML将会解析xx:yy这种数字格式为60进制。所以建议采用字符串格式。
4.9. container_name
指定容器名称,如果未指定,容器命名规则是【[compose文件所在目录]_[服务名]_1】
4.10. environment
环境变量配置,可以使用数组或字典表示
environment 和 Dockerfile 中的 ENV 指令一样会把变量一直保存在镜像、容器中,类似 docker run -e 的效果
如kafka的环境变量设置
#数组
environment:
KAFKA_ADVERTISED_HOST_NAME: 192.168.31.64
KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
#字典
environment:
- KAFKA_ADVERTISED_HOST_NAME: 192.168.31.64
- KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
4.11. env_file
从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于 environment 指定的环境变量
env_file: .env
# 可设置多个
env_file:
- a.env
- b.env
若a.env和b.env有相同变量,取排在后面的b.env值
[!NOTE] 如果在配置文件中有 build 操作,这些变量是不会进入构建过程中,如果要在构建中使用变量首选还是 arg 标签
4.12. command
覆盖容器启动后默认执行的命令
command: [
'--character-set-server=utf8mb4', #设置数据库表的数据集
'--collation-server=utf8mb4_unicode_ci', #设置数据库表的数据集
'--default-time-zone=+8:00' #设置mysql数据库的时区
]
4.13. volumes
将主机的数据卷或着文件挂载到容器里。
4.14. depends_on
本服务启动前,需要依赖哪些别的服务
下面的容器会先启动db和redis两个服务,最后才启动web服务。
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: mysql
4.15. links
链接到其它服务中的容器。使用服务名称(同时作为别名),或者“服务名称:服务别名”,例如:
links:
- redis
- mysql:mysql
- db:database
4.16. logging
服务的日志记录配置。
logging:
driver: json-file
options:
max-size: "88k" # 单个文件大小为88k
max-file: "8" # 最多8个文件
该 driver值是指定服务器的日志记录驱动程序,默认值为 json-file,与 --log-diver 选项一样,当达到文件限制上限,会自动删除旧得文件。
使用syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.31.18:8080"
配置日志服务
4.17. 其它
networks 加入指定网络
aliases 同一网络上的其他容器可以使用服务器名称或别名来连接到其他服务的容器