我可以从命令行在已经运行的容器的同一网络中启动一个新的Docker容器吗?
原始容器未使用定义的网络运行(没有--network
参数(。
下面是一个我希望发生的事情的例子:
# Start a 1st container named host1.
$ docker run --name host1 -dit alpine ash
…
# Start a 2nd container and open a shell.
$ docker run -it --rm alpine
# Try to ping the 1st container from inside the 2nd container.
/ ~ ping host1
ping: bad address 'host1'
如何更改第二个命令以使第二个容器看到host1
?
我可以从命令行启动一个新的Docker容器吗已经在运行的容器的网络?
是。实际上,在您的示例中,您可能已经在这么做了:您在默认的bridge
网络中创建了两个容器——尽管您没有指定--network
,Docker还是在这个默认网络中创建它们。
您不能使用host1
主机名从第二个容器访问第一个容器,因为默认bridge
网络中的DNS解析不会解析此默认网络中容器的主机名。(它将在使用--network
指定的非默认网络中工作,因为DNS解析不同(
然而,你可以通过它的IP直接访问它,例如:
# Start a 1st container named host1.
$ docker run --name host1 -dit alpine ash
# Get host1 IP
$ docker inspect host1 --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
172.17.0.2
# Start a 2nd container and open a shell.
$ docker run -it --rm alpine
# Try to ping the 1st container from inside the 2nd container.
# Won't work with hostname
/ ~ ping host1
ping: bad address 'host1'
# Will work with IP
/ ~ ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.322 ms
...
看起来,您真正想要的是通过默认bridge
网络中的主机名来联系容器。您的问题可能会重新表述为
我可以在默认bridge
网络中启动一个容器,并从同一网络中的另一个容器解析其主机名吗
您可以使用--add-host
指定host1
IP,例如:
$ docker run -it --rm
--add-host host1:$(docker inspect host1 --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}')
alpine
/ ~ ping host1
PING host1 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.322 ms
它将把host1
的IP作为可用主机名传递给新容器
也就是说,你可能会更好地使用自定义网络,例如:
docker network create mynetwork
docker run --name host3 -dit --network mynetwork alpine ash
docker run -it --network mynetwork alpine ping host3
是。如果未指定网络,则使用默认网络。因此,在不指定网络的情况下启动一个新容器将使其处于默认状态。
这是可能的。您必须在每个容器中为/etc/hosts
添加主机分辨率:
# docker exec -it host2 ash -c "echo `docker inspect host1 --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'` host1 >> /etc/hosts"
# docker exec -it host2 ping -c 1 host1
PING host1 (192.168.128.2): 56 data bytes