如何访问 Docker 容器?IP 地址还是容器名?

序言

本文包括了多种访问 Docker 容器的情况,探讨了每种情况应该使用容器的 IP 地址还是容器名。本文的内容对于熟练使用 Docker 的人不值一提,但在实践中,我常常忘记这些基本概念,浪费了不少时间。因此,我决定以 cheat sheet 的形式写一篇博文。本文的大部分内容由 ChatGPT 生成的。

总的来说,记住以下两点就够了:

  • 尽管我们喜欢用容器名访问容器,但这个 DNS 服务是由 docker 提供的,因此只能被容器使用
  • 对于端口映射 -p 8080:80 :用容器名/容器 IP 访问容器时,用容器的端口 80;用主机访问容器时,用主机的端口 8080

从容器中访问目标容器

此时要区分两个容器是否在一个 docker network 中。

两者在同一个网络中

情况一:两个容器属于同一个 Compose

1
2
3
4
5
6
7
8
version: '3'
services:
web:
image: mywebapp
ports:
- "8080:80"
db:
image: mysql

情况二:创建容器时使用 --network 选项使两个容器在一个网络中。

1
2
3
docker network create my_network
docker run -d --name web --network my_network mywebapp
docker run -d --name db --network my_network mysql

两种情况下,都可以通过容器名访问(使用容器端口)。

1
curl http://web:80

注意,如果目标容器在 bridge 网络中,则不属于这种情况。需要通过 IP 访问。

两者不在同一个网络中

需要使用目标容器的 IP。

首先获得容器 IP,然后通过 IP 访问:

1
2
CONTAINER_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器)
curl http://$CONTAINER_IP:80

从本地主机访问目标容器

有两种方式:

一、通过容器 IP 访问。

二、使用本地端口访问:

1
curl http://localhost:8080

注意,这里是本机端口,不再是容器端口。

从外部主机访问目标容器

使用本地主机的 IP 访问:

1
curl http://host_ip:8080

参考

  • ChatGPT