如何访问 docker 容器中 nginx 网络服务器 运行 提供的网页

How to access web page served by nginx web server running in docker container

我们正在尝试使用 docker 到 运行 nginx 但由于某些原因我无法访问 nginx 网络服务器 运行 在 docker 容器内。

我们已经使用以下 Dockerfile 启动了一个 Docker 容器:https://github.com/dwyl/learn-docker/blob/53cca71042482ca70e03033c66d969b475c61ac2/Dockerfile

(它是一个在端口 8888 上使用 nginx 运行ning 的基本 hello world) 运行 我们使用的容器:

docker run -it ubuntu bash

我们使用 docker inspect 命令确定了容器的 IP 地址:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' a9404c168b21

即:172.17.0.11

当我尝试在浏览器中访问容器的 IP 地址和 nginx 端口时 http://172.17.0.11:8888/ 我们得到 ERR_CONNECTION_TIMED_OUT

或使用 curl:

curl 172.17.0.11:8888
curl: (7) Failed to connect to 172.17.0.11 port 8888: Connection refused

为了尝试解决这个问题,我们广泛地用谷歌搜索,但怀疑我们可能会问 "wrong" 问题...

您不应该尝试访问容器的 IP 地址,您应该使用主机的 IP 地址。

你缺少的是主机端口到容器运行 nginx 服务器端口的映射。

假设你想在主机上使用端口 8888,你需要这样的参数来映射端口:

docker run ... -p 8888:8888 ...

那么您应该可以在 http://<HOST_MACHINE_IP>:8888

访问您的服务器

编辑:如果您 运行 在 Mac 上,还有另一个陷阱。要在 Mac 上使用 Docker,通常使用 boot2docker,但 boot2docker 会添加另一层。您需要确定 boot2docker 容器的 IP 地址,并使用它代替 localhost 来访问 nginx。

$ boot2docker ip

The VM's Host only interface IP address is: <X.X.X.X>

$ wget http://<X.X.X.X>:8888
...
Connecting to <X.X.X.X>:8888... connected.
HTTP request sent, awaiting response... 200 OK

参考:https://viget.com/extend/how-to-use-docker-on-os-x-the-missing-guide

EDIT: ... 或者使用 docker-machine 等效命令将是 docker-machine ip <machine-name> 其中 <machine-name> 可能是 "default".

您可能需要检查您的容器是否 运行ning:

  • docker ps(你应该有一个活动容器)

如果没有容器处于活动状态:

  1. docker 运行 -p 80:80 -it /bin/bash
  2. 您将在您的图像终端上
  3. 启动 nginx - sudo 服务 nginx 启动
  4. ctrl p + ctrl q 退出docker而不退出容器
  5. 如果你在 mac 上并使用 boot2docker,你不能使用 localhost 检查你的 运行ning nginx
  6. 所以使用boot2docker ip
  7. 使用boot2docker ip浏览