7

--name1.docker命令和--hostnamein有什么区别run

2.为什么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

barhostfoo终端ping

ping -c2 barhost

给出结果:

错误地址“barhost”

但 pingbarfoo

ping -c2 bar

成功:

PING bar (172.31.0.2):56 个数据字节 64 个字节来自 172.31.0.2:seq=0 ttl=64 time=0.260 ms 64 个字节来自 172.31.0.2:seq=1 ttl=64 time=0.155 ms

--- bar ping 统计 --- 2 个数据包传输,2 个数据包接收,0% 丢包

3.如果你不能从它那里达到,bar为什么可以从内部做到这一点?hostnamefoobar

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

barhostbar终端ping

ping -c2 barhost

成功:

PING barhost (172.31.0.2):56 个数据字节 64 个字节来自 172.31.0.2:seq=0 ttl=64 时间=0.135 ms 64 个字节来自 172.31.0.2:seq=1 ttl=64 时间=0.127 ms

--- barhost ping 统计 --- 发送 2 个数据包,接收 2 个数据包,0% 数据包丢失

4

1 回答 1

9

1.docker run命令中的--name和--hostname有什么区别?

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

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

同样,当创建 docker 容器时,主机名默认为容器在 Docker 中的 ID。您可以使用覆盖主机名--hostname。我从Docker 文档中获取了这个。

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

2.为什么 foo 不能通过它的 hostname = barhost 到达 bar ?

答:正如上面提到的 stackoverflow 帖子中所指定的,--hostname它并没有真正改变 docker 容器的主机名,因此可以使用相同的主机名从外部访问它。它的用例类似于您为什么要使用--name标志,即您期望某个值,否则在创建容器时会生成该值。

3.如果您无法通过 foo 的主机名访问 bar,为什么可以从 bar 中执行此操作?

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

于 2018-12-23T23:15:06.390 回答