如何启动具有主机名和 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 的副本,以便其生成的每个容器都具有以下内容:

  1. ip 地址应该是连续的。例如第一个容器必须有 IP 地址 172.19.0.10,第二个 - 172.19.0.11,第三个 - 172.19.0.12,等等......从一个范围内随机选择 IP 地址也是可以的,但是, #3 要求也应该满足。
  2. 它们的主机名也应具有序列模式 - 假设第一个容器的主机名为 dirlist1,第二个容器的主机名为 dirlist2,等等...
  3. 对于依赖于 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 容器无法发现有多少副本,但如果它知道它们遵循这种特定模式,它可以简单地遍历主机名直到失败。