为什么docker-compose会启动一个新的IP地址?

问题描述 投票:0回答:2

每次我启动一个docker-compose机器时,它都会以新的IP地址启动,我想知道几件事:

  • 为什么?
  • 它是如何知道它已经使用了Ip .0然后跳转到.1然后跳转到.2等等?
  • 有没有办法说:嘿,不要从IP x移动?

谢谢

我希望你能回答原因,因为它可以解释其他人。请参阅有关它的文档。谢谢

docker docker-compose
2个回答
1
投票

关于此的最佳文档涉及技术细节。 docker中的网络是通过libnetwork实现的,IP地址分配由IPAM执行。记录在:https://github.com/docker/libnetwork/blob/master/docs/ipam.md

每个容器都通过设计从网络池中获取新的IP地址,这是一个有用的设计。如果可以避免,您不希望突然出现与之前连接的容器相同IP地址的其他容器。这最多可能导致错误,或者最坏的情况是恶意冒充容器。

每次compose创建一个新容器时,即使这是对现有映像的小更新或对需要重新创建的容器属性的更改,它也会通过docker API创建一个新容器,该容器通过IPAM从子网范围获取新IP地址的过程。

最重要的是,这一切都不重要。如果您使用IP地址在应用程序之间进行通信,则您的应用程序可能尚未准备好使用容器。在容器之间,您应该至少使用DNS,最好使用swarm模式VIP或kubernetes服务,以便更好地处理短期容器和滚动更新。 DNS结果很容易因其缓存属性而过时,指向不再运行的容器。无论您使用DNS还是VIP /服务,都可以将其留给容器运行时/编排工具来处理,只需让您的应用程序解析服务名称而不是直接依赖IP地址。


1
投票

BMitch给你答案为什么它以这种方式工作,这里是我的docker compose与硬编码IP的一个例子。我相信,这不是一个好的做法,但在我的情况下,它是允许的解决方案(它是实验室环境):

version: '2'

services:
  consul:
    container_name: consul
    image: consul:1.4.2
    networks:
      consul-dns:
        ipv4_address: 172.31.255.10
    environment:
      CONSUL_ALLOW_PRIVILEGED_PORTS: 1
    volumes:
      - ./config:/consul/config
      - ./data:/consul/data
    restart: on-failure
    command: "agent -data-dir=/consul/data -config-dir=/consul/config -dev -client 0.0.0.0"

networks:
  consul-dns:
    driver: bridge
    ipam:
      config:
        - subnet: 172.31.255.0/24
          gateway: 172.31.255.1
© www.soinside.com 2019 - 2024. All rights reserved.