每次启动docker-compose机器时,它都会以一个新的IP地址启动,我想知道以下几点:
谢谢
我希望您能回答原因,因为它可以解释其他原因。请参考有关它的文档。谢谢
答案 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