如何访问 Docker 容器?IP 地址还是容器名?
序言
本文包括了多种访问 Docker 容器的情况,探讨了每种情况应该使用容器的 IP 地址还是容器名。本文的内容对于熟练使用 Docker 的人不值一提,但在实践中,我常常忘记这些基本概念,浪费了不少时间。因此,我决定以 cheat sheet 的形式写一篇博文。本文的大部分内容由 ChatGPT 生成的。
总的来说,记住以下两点就够了:
- 尽管我们喜欢用容器名访问容器,但这个 DNS 服务是由 docker 提供的,因此只能被容器使用。
- 对于端口映射
-p 8080:80
:用容器名/容器 IP 访问容器时,用容器的端口80
;用主机访问容器时,用主机的端口8080
。
从容器中访问目标容器
此时要区分两个容器是否在一个 docker network 中。
两者在同一个网络中
情况一:两个容器属于同一个 Compose
1 | version: '3' |
情况二:创建容器时使用 --network
选项使两个容器在一个网络中。
1 | docker network create my_network |
两种情况下,都可以通过容器名访问(使用容器端口)。
1 | curl http://web:80 |
注意,如果目标容器在 bridge 网络中,则不属于这种情况。需要通过 IP 访问。
两者不在同一个网络中
需要使用目标容器的 IP。
首先获得容器 IP,然后通过 IP 访问:
1 | CONTAINER_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器) |
从本地主机访问目标容器
有两种方式:
一、通过容器 IP 访问。
二、使用本地端口访问:
1 | curl http://localhost:8080 |
注意,这里是本机端口,不再是容器端口。
从外部主机访问目标容器
使用本地主机的 IP 访问:
1 | curl http://host_ip:8080 |
参考
- ChatGPT