为什么docker compose启动新的IP地址?

为什么docker compose启动新的IP地址?,docker,docker-compose,Docker,Docker Compose,每次我启动docker compose机器时,它都会以一个新的IP地址启动,我想知道一些事情: 为什么? 它如何知道它已经使用了Ip.0并跳到了.1,然后跳到了.2,依此类推 有没有办法说:嘿,不要离开IP x 谢谢 我希望你能回答为什么,因为它可以解释其他的原因。请参阅相关文档。谢谢关于这一点的最佳文档将进入技术细节。docker中的联网由libnetwork实现,IP地址分配由IPAM完成。该文件记录在: 每个容器通过设计从网络池中获得一个新的IP地址,这是一个有用的设计。如果可以避免的

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

  • 为什么?
  • 它如何知道它已经使用了Ip.0并跳到了.1,然后跳到了.2,依此类推
  • 有没有办法说:嘿,不要离开IP x
谢谢


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

关于这一点的最佳文档将进入技术细节。docker中的联网由libnetwork实现,IP地址分配由IPAM完成。该文件记录在:

每个容器通过设计从网络池中获得一个新的IP地址,这是一个有用的设计。如果可以避免的话,您不希望突然出现另一个容器,它的IP地址与以前连接的容器相同。这最多可能导致错误,最坏可能导致恶意模拟容器

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


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

关于这方面的最佳文档将进入技术细节。docker中的联网由libnetwork实现,IP地址分配由IPAM完成。该文件记录在:

每个容器通过设计从网络池中获得一个新的IP地址,这是一个有用的设计。如果可以避免的话,您不希望突然出现另一个容器,它的IP地址与以前连接的容器相同。这最多可能导致错误,最坏可能导致恶意模拟容器

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

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

回答了为什么它会以这种方式工作,下面是一个使用硬编码IP的docker compose示例。我相信这不是一个好的实践,但在我的案例中,这是一个允许的解决方案(这是实验室环境):

下面是我的docker compose和硬编码IP的一个示例。我相信这不是一个好的实践,但在我的案例中,这是一个允许的解决方案(这是实验室环境):


因为docker就是这样设计的。也许可以描述一下这会给你带来的问题,这样我们可以帮助你解决这个问题。因为docker就是这样设计的。请描述一下这会给您带来的问题,以便我们可以帮助您解决。谢谢您回答@Bmith。你能补充一下问题3吗?因为我找不到如何清除Ip 192.168.99.100,以便docker可以再次使用它(没有colusion案例)。或者,您希望我提出一个关于如何释放地址(此API用于释放IP地址)和释放池的新问题吗。我在你提到的文档中找不到如何做?再次感谢。塞格孔德的回答涵盖了如何用作曲来完成它。还有一个问题是,是否可以使用Docker工具箱中的命令来执行此操作?再次感谢汉克斯,谢谢你回答@Bmith。你能补充一下问题3吗?因为我找不到如何清除Ip 192.168.99.100,以便docker可以再次使用它(没有colusion案例)。或者,您希望我提出一个关于如何释放地址(此API用于释放IP地址)和释放池的新问题吗。我在你提到的文档中找不到如何做?再次感谢。塞格孔德的回答涵盖了如何用作曲来完成它。还有一个问题是,是否可以使用Docker工具箱中的命令来执行此操作?再次感谢
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