如何启动具有主机名和IP地址的容器,使它们可以串行运行?

问题描述 投票:1回答:1

这里是示例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,第二个容器必须具有IP地址172.19.0.11,第三个容器-172.19.0.12,依此类推...从范围中随机选择IP地址也是可以的,但是,#3要求也必须相识。
  2. 它们的主机名也应该显示为串行模式-例如第一个容器的主机名是dirlist1,第二个容器的主机名是dirlist2,依此类推
  3. [dirlist的所有此类容器也应显示为extra_hosts(及其相应的名称和IP地址),这取决于dirlist(即,根据示例为curlcmd)。
docker docker-compose docker-container docker-networking
1个回答
0
投票
您描述的所有网络功能,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映像中,并且还假定Dockerfile具有正确的[C0 ] 已经。我跳过了所有的WORKDIR设置,以使用默认设置,并且不需要特别设置每个容器networks:(它在容器自身外部不做任何可见的操作)。

单独编写并不直接支持复制服务。如果将此功能与Docker的Swarm集群服务结合使用,则可以为hostname:服务指定replicas:,我认为这基本满足您的要求,但是对于单个主机,您可能不想设置Swarm。

您可以做的另一件事是使用文本模板工具创建replicas:文件。例如,使用dirlist,我可能会写:

docker-compose.yml

在Compose中,Jinja容器无法发现有多少个副本,尽管如果知道它们遵循此特定模式,则可以简单地遍历主机名,直到失败为止。
© www.soinside.com 2019 - 2024. All rights reserved.