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

时间:2019-03-18 11:42:36

标签: docker docker-compose

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

  • 为什么?
  • 它怎么知道它已经使用了Ip .0并跳转到.1然后是.2等等?
  • 有什么办法说:嘿,不要离开IP x?

谢谢

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

2 个答案:

答案 0 :(得分:1)

有关此方面的最佳文档,请参见技术细节。 docker中的联网是通过libnetwork实现的,而IP地址分配是由IPAM执行的。记录在:https://github.com/docker/libnetwork/blob/master/docs/ipam.md

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

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

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

答案 1 :(得分:1)

BMitch给了您答案,为什么它可以这样工作,这是我的带有硬编码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