Docker直接访问容器IP/Port

rob*_*011 4 docker docker-for-mac

我有用于实验的 docker 容器。所以我不知道我以后在尝试新应用程序时会使用哪些端口。是否可以在不将其暴露在 docker-run 命令中的情况下从主机使用 ip/port 访问 docker 容器应用程序?

tgo*_*gos 6

更新: OP 没有提供它docker-for-mac与原始问题有关,因此如果您使用此版本的 docker,则其余部分无法应用。


原答案:

是的,你可以这样做。

假设您有一个名为的容器boring_pare和一个在端口上运行的 Web 应用程序8080。您可以通过请求从主机访问它http://[ip_of_boring_pare]:8080。如果你使用默认的 docker 网络,这个 ip 可能在这个172.17.0.xxx范围内。

要找到此 IP,您可以inspect使用以下命令来获取容器:

docker container inspect boring_pare
Run Code Online (Sandbox Code Playgroud)

另外,你提到:

是否可以在不暴露在 docker-run 命令中的情况下从主机使用 ip/port 访问 docker 容器应用程序?

这里的正确术语是发布。进一步阅读:

  • 关于EXPOSE/ Dockerfile 的文档

    ...该EXPOSE指令实际上并未发布端口。它充当构建镜像的人和运行容器的人之间的一种文档,关于打算发布哪些端口。要在运行容器时实际发布端口,请使用-pon 标志docker run来发布和映射一个或多个端口,或者使用-P标志来发布所有暴露的端口并将它们映射到高阶端口。

  • docker 中“expose”和“publish”的区别


更新以回答@robie2011的评论:

下面,我运行 3 个命令:

  1. 运行nginx容器而不发布port 80host端口
  2. 检查其 ip address
  3. 使用curlfromhost访问nginx主页

我的控制台输出:

$ docker run --rm --name some-nginx -d nginx
0e53d3b5ef6d65a4731c4066f3523c5ecd3c118abedae44b33e89fdf8e401632

$ docker container inspect --format '{{ .NetworkSettings.IPAddress }}' some-nginx
172.17.0.3

$ curl 172.17.0.3
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
$
Run Code Online (Sandbox Code Playgroud)


rob*_*011 5

Docker for Mac 无法将流量路由到容器,以及从容器返回到主机。

https://docs.docker.com/docker-for-mac/networking/#i-cannot-ping-my-containers