常用命令
# 启动默认 yml docker-compose up # 创建并启动容器(使用默认模板 docker-compose.yml) docker-compose up falkafka # 创建并启动falkafka容器,由于falkafka依赖于falzookeeper容器,因此falzookeeper容器也会一并起来 docker-compose down # 停止并删除 containers, networks, images, and volumes docker-compose ps # 列出容器 docker-compose logs -f falkafka # 查看 falkafka 服务的日志 docker-compose images # 列出镜像 # 启动指定 yml docker-compose -f kafka-compose.yml up docker-compose -f kafka-compose.yml up falkafka docker-compose -f kafka-compose.yml down docker-compose -f kafka-compose.yml ps docker-compose -f kafka-compose.yml logs -f falkafka docker-compose -f kafka-compose.yml images # 启动多个 yml docker-compose -f docker-compose.yml -f docker-compose-elasticsearch.yml up # 关闭 docker-compose -f /home//kafka-compose.yml stop # 最后添加 -f,把不在运行的容器删掉,参考:https://docs.docker.com/engine/reference/commandline/compose_rm docker-compose -f /home/kafka-compose.yml rm -f
Compose 安装
在线安装
apt install docker-compose
离线安装
首先去官网下载 docker-compose-linux-x86_64 文件,大概42MB,接着按下面步骤完成安装:
# 将下载的二进制文件复制或剪切到 /usr/local/bin/docker-compose,文件被重命名为 docker-compose 了 cp ./docker-compose-linux-x86_64 /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 version
请注意,docker-compose up 启动的 compose 文件,不能使用 deploy 配置,它只能在 swarm 模式下使用。
经过测试,docker-compose 里可以使用 driver: overlay,但不能在 service 上设置 network。
最后附上官方安装教程。
使用多个 compose 文件
默认情况下,compose 读取 docker-compose.yml 和可选的 docker-compose.override.yml 文件。按照惯例,docker-compose.yml 包含基本配置,override文件,可以包含现有服务或全新服务的配置覆盖。
要使用多个 override 文件或一个具有不同名称的 override 文件,可以使用 -f 选项指定文件列表。按命令行中指定的顺序组合合并文件。例如:
docker-compose.yml
web:
image: example/my_web_app:latest
links:
- db
- cache
db:
image: postgres:latest
cache:
image: redis:latest
docker-compose.override.yml
web:
build: .
volumes:
- '.:/code'
ports:
- 8883:80
environment:
DEBUG: 'true'
db:
command: '-d'
ports:
- 5432:5432
cache:
ports:
- 6379:6379
开发环境可以这样使用:docker-compose up,这会自动覆盖合并到 docker-compose.yml。
docker-compose.prod.yml
web:
ports:
- 80:80
environment:
PRODUCTION: 'true'
cache:
environment:
TTL: '500'
生产环境可以这样使用:docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
注:docker-compose 命令需要 cd 到项目目录(即 docker-compose.yml 所在目录)去执行,否则不起作用!如果你的项目目录为 “faldocker”,那么volumns映射出来的目录格式如:”faldocker_kafka”,即会加个前缀faldocker。
如果需要后台运行,请在命令最后加 -d
GPU支持、时区设置、系统 UTF-8 设置
version: '3.6'
services:
my-tomcat:
image: my-tomcat/wang:9.0.35
container_name: my-tomcat
environment:
# 时区设置
TZ: Asia/Shanghai
# 修复 tomcat 日志乱码问题
LANG: C.UTF-8
deploy:
resources:
reservations:
# Docker Compose 支持 GPU,但 Swarm 中测试不支持!
devices:
- driver: nvidia
device_ids: [ '0' ]
capabilities: [ compute, utility ]
volumes:
- "tomcat_webapps:/usr/local/apache-tomcat-9.0.35/webapps"
volumes:
tomcat_webapps:
如果想测试下 Docker 中 GPU 是否可用,可以下载个 nvidia cuda 小镜测试,Docker 20 引擎装好后是直接支持GPU的,若你 Docker 宿主机是 VMware Workstation 虚机,那没办法支持:
docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
上面的 device_ids 指定了这个容器使用哪块显卡,我的主板上插了两块显卡,分解对应 deviceId 0 和 1,如果 device_ids 设置了没有的显卡,容器会起不来:

最后再附上 Docker 中 GPU 的使用。
例子 kafka-compose.yml
version: '3.6'
services:
falzookeeper:
image: 192.168.1.166:8083/zookeeper-falsec
volumes:
- "zoodata:/data"
- "zoodatalog:/datalog"
- "zoologs:/logs"
ports:
- "2181:2181"
networks:
- falnet
falkafka:
image: 192.168.1.166:8083/kafka-falsec
volumes:
- "kafka:/kafka"
- "kafka-conf:/opt/kafka/config"
depends_on:
- falzookeeper
ports:
- "9092:9092"
networks:
- falnet
falkafkamanager:
image: hlebalbau/kafka-manager:latest
depends_on:
- falzookeeper
ports:
- "9000:9000"
environment:
ZK_HOSTS: "falzookeeper:2181"
APPLICATION_SECRET: "random-secret"
command: -Dpidfile.path=/dev/null
networks:
- falnet
volumes:
zoodata:
zoodatalog:
zoologs:
kafka:
kafka-conf:
networks:
falnet:
driver: overlay
attachable: true
固定容器IP
version: '3.6'
services:
tomcat1:
image:tomcat:9.0.35
container_name: tomcat1
restart: always
# 给容器设置固定IP。进入容器后使用 "cat /etc/hosts" 即可看到这个容器IP
networks:
my_network1:
ipv4_address: 172.18.0.2
tomcat2:
image:tomcat:9.0.35
container_name: tomcat2
restart: always
# 给容器设置固定IP。进入容器后使用 "cat /etc/hosts" 即可看到这个容器IP
networks:
my_network2:
ipv4_address: 10.18.0.2
# 创建 bridge 网路,宿主机使用 "ip addr" 命令可看到会创建一个 "br-xxx" 开头的虚拟网桥,且 state UP。
# 定义了 172.18.0.0/16 这个子网后,若给容器1分配了固定IP 172.18.0.2,那么经测容器2不分配IP时会自动获取到172.19.0.2。
# 我们将整个 networks 配置拿掉也是可以的,此时 compose 也会自动创建一个 "br-xxx" 开头的虚拟网桥,此时容器就不好设置固定IP了。
# 网络更新后,必须用 docker network rm <ID> 先删除后重新添加,否则改动不生效的。
networks:
my_network1:
driver: bridge
enable_ipv6: false
ipam:
driver: default
config:
- subnet: 172.18.0.0/16
gateway: 172.18.0.1
my_network2:
driver: bridge
enable_ipv6: false
ipam:
driver: default
config:
- subnet: 10.18.0.0/16
gateway: 10.18.0.1
#driver_opts:
# com.docker.network.bridge.name: enp4s0
环境变量文件
参考 Set environment variables within your container’s environment