常用命令
# 启动默认 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