参考地址:https://docs.docker.com/compose/compose-file/#stdin_open

常用配置

示例yaml

version: "3"
services:
  symfony_demo:
    #tty: true
    #stdin_open: true
    #entrypoint: /bin/bash
    image: dev:v4
    container_name: con-symfony
    restart: always
    privileged: true
    ports:
      - 18000:8000
      - 13306:3306
    volumes: 
      - "/data/con_symfony/my_demo:/data/www/my_demo"
    working_dir: /data/www/my_demo
    command:
      - /bin/bash
      - -c
      - |
        pwd
    #symfony serve
    #/bin/bash
    networks:
      - php_net

networks:
  php_net:
    driver: bridge
  1. command 块执行如果需要执行多个命令,就按照上面的 bash -c 的方式传递变量
  2. 最主要的services 块,包含了service名称以及下面的不同的参数,如restart、privileged、image、container_name、volumes、ports 等,顺便说一下,在 deploy/replica 里也可以设置容器副本数量,类似k8s 里的deploymet 里设置pod 数量。

使用问题


问题1:docker-compose 编排容器,启动后执行完命令,容器就退出不运行了,如何让容器一直运行。

解决方案:

  1. 使用 循环,重复执行某个命令。如while,sleep等。如 command: sleep infinity
  2. 使用需要手动中断的命令。如tail -f something,python3 manager.py runserver 0.0.0.0:10000, symfony server:start 等。
  3. 最后一条命令使用/bin/bash,这个是需要配合 tty 和stdin_open 参数使用,任意一个或者两个都配置。这个方案体现出来就是使用 docker-compose down 命令的时候要比 前两种方案慢。实验确认,慢是因为和多参数的bash -c配置化有关。
version: "3"
services:
   api:
     stdin_open: true
     tty: true			
     build: .
     image: your_image_name
     container_name: your_container_name
     restart: always
     ports:
       - "80:80"     
     command:
       - /bin/bash
       - -c
       - |
		  cmd1
		  cmd2
		  cmd3
          /bin/bash  # 如果这行注释掉则会导致问题的产生
这三种方案里如果只考虑使容器启动后不退出的话,使用tty或者stdin_open 参数更为方便。运行后的 command 显示的都是 bash,而且没有其他启动时的 command 的话,启动并不会很慢。

问题2:如何使启动的容器的的IP地址固定

解决方案:使用networks 块中的 ipam 参数,和ipv4_address 配置网络。
ipam 设置 docker-compose 网桥的IP地址范围,这里注意和docker0网桥不是同一个虚拟设备。
ipv4_address (或者ipv6_address)固定 容器的ip地址。

参考官方配置如下:

services:
  frontend:
    image: awesome/webapp
    networks:
      front-tier:
        ipv4_address: 172.16.238.10
        ipv6_address: 2001:3984:3989::10

networks:
  front-tier:
    ipam:
      driver: default
      config:
        - subnet: "172.16.238.0/24"
        - subnet: "2001:3984:3989::/64"

ipam指定自定义 IPAM 配置。这是一个具有多个属性的对象,每个属性都是可选的:

driver:自定义 IPAM 驱动程序,而不是默认的。
config:具有零个或多个配置元素的列表,每个包含:
subnet: CIDR 格式的子网,代表一个网段
ip_range: 分配容器 IP 的 IP 范围
gateway:主子网的 IPv4 或 IPv6 网关
aux_addresses:网络驱动程序使用的辅助 IPv4 或 IPv6 地址,作为从主机名到 IP 的映射
options:作为键值映射的驱动程序特定选项。
一个完整的例子:

ipam:
  driver: default
  config:
    - subnet: 172.28.0.0/16
      ip_range: 172.28.5.0/24
      gateway: 172.28.5.254
      aux_addresses:
        host1: 172.28.1.5
        host2: 172.28.1.6
        host3: 172.28.1.7
  options:
    foo: bar
    baz: "0"

留个问题,这里面的 entrypoint 参数作用是什么?和dockerfile 里的区别?