Docker Compose 笔记

By | 2021年12月31日

常用命令

# 启动默认 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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注