docker 运行 --name 与 --hostname 区别作为命令行选项(ping:地址错误)

docker run --name vs --hostname difference as command line option (ping: bad address)

1.What是dockerrun命令中--name--hostname的区别吗?

2.Why foo 无法到达 bar hostname = barhost ?

创建网络并连接两个容器:

docker network create test
docker run --rm -dit --name bar --network test --hostname barhost alpine:latest
docker run --rm -it --name foo --network test --hostname foohost alpine:latest

foo 终端

ping barhost
ping -c2 barhost

给出结果:

bad address 'barhost'

但是从 foo

ping bar
ping -c2 bar

成功:

PING bar (172.31.0.2): 56 data bytes 64 bytes from 172.31.0.2: seq=0 ttl=64 time=0.260 ms 64 bytes from 172.31.0.2: seq=1 ttl=64 time=0.155 ms

--- bar ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss

3.If 你不能通过它的 hostnamefoo 到达 bar 为什么可以从 [=21] =]?

# assuming you've created network test from point 2.
docker run --rm -it --name bar --network test --hostname barhost alpine:latest

bar 终端

ping barhost
ping -c2 barhost

成功:

PING barhost (172.31.0.2): 56 data bytes 64 bytes from 172.31.0.2: seq=0 ttl=64 time=0.135 ms 64 bytes from 172.31.0.2: seq=1 ttl=64 time=0.127 ms

--- barhost ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss

1.What is the difference between --name and --hostname in docker run command?

答案:当我们使用docker run命令时docker创建一个容器并为其分配一个UUID类型的Container Id。现在这个 Container Id 可以用来引用创建的容器。但是记住这个 Container Id 可能很困难。

所以我们可以在docker 运行命令中使用--name。现在您可以使用容器 ID 来引用创建的容器,也可以使用容器名称。

类似地,当创建 docker 容器时,主机名默认为 Docker 中容器的 ID。您可以使用 --hostname 覆盖主机名。我从 Docker docs.

中获取了这个

现在考虑这样一个场景,您正在通过代码使用 docker 容器并且您想要引用 docker。由于 docker rid 是在创建时生成的,因此您无法提前知道它,因此您可以使用 --name。要知道何时在 docker 运行 中使用 --hostname,请阅读

2.Why foo can't reach bar by its hostname = barhost ?

答案: 正如在 中指定的那样,--hostname 不会直接更改 docker 容器的主机名,这样就可以用于从外部访问它。它的用例类似于为什么要使用 --name 标志,即您期望某个值,否则该值会在创建容器时生成。

3.If you can't reach bar by its hostname from foo why it is possible to do that from within bar?

答案:这个问题的答案现在应该很清楚了。在容器内,使用 --hostname 提到的主机名存在,但在容器外并非如此。