每次我启动一个docker-compose机器时,它都会以新的IP地址启动,我想知道几件事:
谢谢
我希望你能回答原因,因为它可以解释其他人。请参阅有关它的文档。谢谢
关于此的最佳文档涉及技术细节。 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地址。
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