如何更改Docker容器的子网和IP地址?

时间:2019-01-18 09:24:20

标签: docker docker-compose docker-networking docker-network

我有一个在主机上运行的docker-compose创建的docker容器。

获得的Docker容器具有自己的网络:

docker exec -it containername /bin/bash

root@4913fd78f383:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
155: eth0@if156: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:14:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.20.0.2/16 brd 172.20.255.255 scope global eth0
       valid_lft forever preferred_lft forever

因此,容器在主机中占据IP 172.20.0.2/16。

我的问题是,以这种方式我的主机无法在连接主机的网络中真正的172.20.x.y主机上连接

因此,容器(具有自己的ip)隐藏了其他真实地址。

我需要更改现有容器的IP地址,可能无需删除/重新创建它。

我已使用docker compose创建了容器,因此我使用以下命令来运行/停止容器:

docker start containername
docker stop containername

谢谢。

1 个答案:

答案 0 :(得分:0)

通常,您有两个选择:

  1. 使用docker。使用自定义子网创建网络,然后从docker-compose加入该网络。 for more details

  2. 使用docker-compose。定义网络设置。 for more details

具体而言,您必须执行以下操作:

  1. 使用docker cli创建网络。
    docker network create -d bridge --subnet 172.25.0.0/16 my_custom_network
  1. 使容器加入网络
    docker network connect my_custom_network my_running_container
  1. 从旧网络中删除容器
  

您可以使用docker inspect my_running_container

来获得旧网络的名称。
    docker network disconnect old_network my_running_container
  1. 删除docker-compose创建的不需要的网络。
    docker network rm old_network
  1. 重新配置docker-compose.yml以使用新网络,以便在有人再次使用docker-compose up时保持相同的设置。

有关上述选项的更多详细信息,请检查Work with Networks

  

请注意,您还可以按照here

中的说明配置默认的docker0。