如何启动具有主机名和 IP 地址的容器,以便它们 运行 串行?
how to bring up containers with hostname and ip addresses such that they run serially?
这里是示例 docker compose 配置,用于启动一个简单的目录列表服务 (dirlist
):
version: "3"
services:
dirlist:
image: ubuntu-python
networks:
app_net:
ipv4_address: "172.19.0.10"
hostname: maca
volumes:
- /home/arun/misc:/misc
working_dir: /misc
curlcmd:
image: ubuntu-curl
command: curl -s http://maca:8000/readme1.txt
extra_hosts:
- "maca:172.19.0.10"
depends_on:
- web
networks:
app_net:
networks:
app_net:
ipam:
driver: default
config:
- subnet: "172.19.0.0/24"
我想创建 dirlist
的副本,以便其生成的每个容器都具有以下内容:
- ip 地址应该是连续的。例如第一个容器必须有 IP 地址
172.19.0.10
,第二个 - 172.19.0.11
,第三个 - 172.19.0.12
,等等......从一个范围内随机选择 IP 地址也是可以的,但是, #3 要求也应该满足。
- 它们的主机名也应具有序列模式 - 假设第一个容器的主机名为
dirlist1
,第二个容器的主机名为 dirlist2
,等等...
- 对于依赖于
dirlist
的服务(即 curlcmd
根据示例)。
您描述的所有网络功能,Docker Compose does on its own:它可以在一定范围内分配 IPv4 地址(每个 Docker 专用网络一个唯一的 CIDR 块),并且它提供了一个内部 DNS 系统,因此服务名称可直接用作主机名,无需指定 extra_hosts
。也就是说,对于单个副本,这个短得多的 Compose 文件就可以正常工作:
version: "3"
services:
dirlist:
image: ubuntu-python
curlcmd:
image: ubuntu-curl
command: curl -s http://dirlist:8000/readme1.txt
我依赖于开箱即用的 Compose 提供的 default
网络,假设您想要 运行 的文件已 COPY
编辑到您的 Docker 图像,并假设 Docker 文件已经具有正确的 WORKDIR
。我已经跳过所有 networks:
设置以使用默认值,并且没有特别需要为每个容器设置 hostname:
(它不会在容器本身之外做任何可见的事情)。
Compose 本身不直接支持复制服务。如果你 运行 结合 Docker 的 Swarm 集群服务,你可以为 dirlist
服务指定 replicas:
我认为这基本上满足你的要求,但是对于一个您可能不想设置 Swarm 的单个主机。
您可以做的另一件事是使用文本模板工具创建 docker-compose.yml
文件。例如,使用 Jinja,我可能会写:
version: "3"
services:
{%- for i in range(1, 6) %}
dirlist{{ i }}:
image: ubuntu-python
{%- endfor %}
curlcmd:
image: ubuntu-curl
command: curl -s http://dirlist1:8000/readme1.txt
在 Compose 中,curlcmd
容器无法发现有多少副本,但如果它知道它们遵循这种特定模式,它可以简单地遍历主机名直到失败。
这里是示例 docker compose 配置,用于启动一个简单的目录列表服务 (dirlist
):
version: "3"
services:
dirlist:
image: ubuntu-python
networks:
app_net:
ipv4_address: "172.19.0.10"
hostname: maca
volumes:
- /home/arun/misc:/misc
working_dir: /misc
curlcmd:
image: ubuntu-curl
command: curl -s http://maca:8000/readme1.txt
extra_hosts:
- "maca:172.19.0.10"
depends_on:
- web
networks:
app_net:
networks:
app_net:
ipam:
driver: default
config:
- subnet: "172.19.0.0/24"
我想创建 dirlist
的副本,以便其生成的每个容器都具有以下内容:
- ip 地址应该是连续的。例如第一个容器必须有 IP 地址
172.19.0.10
,第二个 -172.19.0.11
,第三个 -172.19.0.12
,等等......从一个范围内随机选择 IP 地址也是可以的,但是, #3 要求也应该满足。 - 它们的主机名也应具有序列模式 - 假设第一个容器的主机名为
dirlist1
,第二个容器的主机名为dirlist2
,等等... - 对于依赖于
dirlist
的服务(即curlcmd
根据示例)。
您描述的所有网络功能,Docker Compose does on its own:它可以在一定范围内分配 IPv4 地址(每个 Docker 专用网络一个唯一的 CIDR 块),并且它提供了一个内部 DNS 系统,因此服务名称可直接用作主机名,无需指定 extra_hosts
。也就是说,对于单个副本,这个短得多的 Compose 文件就可以正常工作:
version: "3"
services:
dirlist:
image: ubuntu-python
curlcmd:
image: ubuntu-curl
command: curl -s http://dirlist:8000/readme1.txt
我依赖于开箱即用的 Compose 提供的 default
网络,假设您想要 运行 的文件已 COPY
编辑到您的 Docker 图像,并假设 Docker 文件已经具有正确的 WORKDIR
。我已经跳过所有 networks:
设置以使用默认值,并且没有特别需要为每个容器设置 hostname:
(它不会在容器本身之外做任何可见的事情)。
Compose 本身不直接支持复制服务。如果你 运行 结合 Docker 的 Swarm 集群服务,你可以为 dirlist
服务指定 replicas:
我认为这基本上满足你的要求,但是对于一个您可能不想设置 Swarm 的单个主机。
您可以做的另一件事是使用文本模板工具创建 docker-compose.yml
文件。例如,使用 Jinja,我可能会写:
version: "3"
services:
{%- for i in range(1, 6) %}
dirlist{{ i }}:
image: ubuntu-python
{%- endfor %}
curlcmd:
image: ubuntu-curl
command: curl -s http://dirlist1:8000/readme1.txt
在 Compose 中,curlcmd
容器无法发现有多少副本,但如果它知道它们遵循这种特定模式,它可以简单地遍历主机名直到失败。