参考地址: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
- command 块执行如果需要执行多个命令,就按照上面的 bash -c 的方式传递变量
- 最主要的services 块,包含了service名称以及下面的不同的参数,如restart、privileged、image、container_name、volumes、ports 等,顺便说一下,在 deploy/replica 里也可以设置容器副本数量,类似k8s 里的deploymet 里设置pod 数量。
使用问题
问题1:docker-compose 编排容器,启动后执行完命令,容器就退出不运行了,如何让容器一直运行。
解决方案:
- 使用 循环,重复执行某个命令。如while,sleep等。如
command: sleep infinity
。 - 使用需要手动中断的命令。如tail -f something,python3 manager.py runserver 0.0.0.0:10000, symfony server:start 等。
- 最后一条命令使用/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 里的区别?