46

我已经设置了 Docker 容器,以便将我的机器 docker 容器访问到本地的另一台机器。

在命令下面创建一个容器:

    docker run -it -d --name containerName -h www.myhost.net -v /var/www/html -p 7000:8000 --net mynetwork --ip 172.11.0.10 --privileged myimagename bash

创建容器详细信息后:

        CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES

        1e1e5e9b74b4        myimgaename         "bash"              21 minutes ago      Up 6 minutes        0.0.0.0:7000->8000/tcp   containername

网络详情:

     "NetworkSettings": {
        "Bridge": "",
        "SandboxID": "fe357c54c816fff0f9d642037dc9a173be7f7e42a80776d006572f6a1395969e",
        "HairpinMode": false,
        "LinkLocalIPv6Address": "",
        "LinkLocalIPv6PrefixLen": 0,
        "Ports": {
            "8000/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "7000"
                }
            ]
        }

如果我在 mymachine(hostmachine) 中访问 docker ipaddr(172.11.0.10) 或主机名(www.myhost.net) 它工作

但是,如果我使用端口访问不起作用:hostmachine ip: 192.168.1.1

  go to the browser  192.168.1.1:7000  hostmachine and locally connected anoter machine also.

但我的 7000 端口在主机中监听:

        # ps aux | grep 7000
        root     10437  0.0  0.2 194792 24572 pts/0    Sl+  12:33   0:00 docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 7000 -container-ip 172.11.0.10 -container-port 8000
        root     10941  0.0  0.0 118492  2324 pts/3    R+   12:44   0:00 grep --color=auto 7000

更新1:

      $ docker version
        Client:
         Version:      1.11.2
         API version:  1.23
         Go version:   go1.5.4
         Git commit:   b9f10c9
         Built:        Wed Jun  1 21:39:21 2016
         OS/Arch:      linux/amd64

        Server:
         Version:      1.11.2
         API version:  1.23
         Go version:   go1.5.4
         Git commit:   b9f10c9
         Built:        Wed Jun  1 21:39:21 2016
         OS/Arch:      linux/amd64

建议我为什么无法将我的容器访问到另一台机器。如何解决这个问题

4

10 回答 10

117

一个非常常见的问题可能是这样的:

将 Docker 内的应用程序绑定到0.0.0.0,而不是127.0.0.1地址,让 Docker 访问容器内的应用程序。

于 2019-08-09T10:05:33.127 回答
24

7000主机上的端口正在重定向到容器中的端口8000,但是容器中的该端口上是否有任何监听?

您的docker run命令有点奇怪:-it用于在附加终端的情况下以交互方式运行容器;-d用于在后台分离运行;bash最后覆盖图像配置为启动命令的任何内容,这就是为什么我认为在 port 上没有任何监听8000

尝试运行最简单的 NGINX 容器:

docker run -d -p 8081:80 nginx:alpine

然后验证您是否可以访问主页:

curl http://localhost:8081

如果那行得通,那么我会看看你是如何运行你的图像的。

于 2016-09-16T12:43:06.247 回答
2

使用 Docker for Mac 发生在我身上。单击 Docker 图标,然后Restart成功了。

于 2019-07-11T18:50:32.903 回答
0

我使用 Docker Wordpress 容器遇到了这个问题。

故障排除:

curl -Is http://192.168.X.X在 Docker 主机本身上执行将按预期返回结果,但在我的笔记本电脑上在不同子网上执行的相同命令只会挂起。

与 相同telnet 192.168.X.X 80:这将在 Docker 主机本身的端口 80 上按预期连接,但不在 Docker 主机之外;它也会挂起。

docker logs containerName没有提供有用的线索。

在路由器的防火墙上,我允许 Docker 主机和我的笔记本电脑之间的一切,以确保路由器的防火墙不会破坏端口 80 上的连接。

解决方案:

为了清除错误,我决定从docker run命令中删除我的自定义网络以降低复杂性。

与 OP 一样,我在docker run命令中指定了自己的自定义网络和 IP 地址。但是当我从命令中删除时--net,容器使用默认网桥和 Docker DHCP 分配的地址上升。--ipdocker run

测试解决方案:

我使用以下方法找到了我的 Wordpress 容器的 IP:

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' wordpressContainerName

并尝试在我笔记本电脑的浏览器中加载 Wordpress。现在可以在不同子网上的 Docker 主机外部的转发端口 80 上联系容器。

结论:

从命令中删除--net并解决了我的问题;当然是 YMMV。--ipdocker run

于 2021-12-01T11:39:46.397 回答
0

嗨,我在使用 Dockerfile 构建映像时遇到了这个问题。我意识到更改后我无法将地址设置为特定的 IP 地址含义

    srv := &http.Server{
    Handler: s,
    Addr:    "127.0.0.1:5000",
}

    srv := &http.Server{
    Handler: s,
    Addr:    ":5000",
}

该命令docker run -dp 5000:5000 --name myapiserver api_server:v1工作正常。我可以毫无问题地访问容器端口 5000。所以要在容器中得出结论,您只能设置服务器的端口?

更新

127.0.0.1 是您的主机不会发送到外部的 IP 地址,处理方式的正确方法是通过所有 IP 地址发送,即 0:0:0:0 或简称仅端口。

于 2021-05-29T12:44:30.323 回答
0

经过数千小时挖掘这个问题,我终于用这种愚蠢的方式解决了它:

  1. 卸载的码头工人:

sudo yum 删除 docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine docker-ce

  1. 更新我的centos系统:

    yum -y 更新

  2. 重启

  3. 重新安装docker

  4. 重新安装容器/映像

现在它就像一个魅力。

于 2021-12-20T15:13:38.807 回答
0

您可以使用docker run -d -p 127.0.0.1:9000:4000 --name some-container some-image-name,也可以使用-it标志

于 2021-12-04T22:54:53.200 回答
0

对于在 docker 容器内运行 serverless-offline 的任何人:

我试图将我的 mac 上的 localhost:3000 映射到默认的 serverless-offline 应用程序端口 3000(在 docker 中运行),达到了预期的结果,如下所示:

(1) 添加--host:0.0.0.0到通常的无服务器离线命令中,如下所示:

serverless offline --host 0.0.0.0

(2) 然后用通常的端口映射运行 docker 容器:

docker run -p 3000:3000 <your-image-name>

注意:需要重建我的图像(在运行它之前)以使一切正常工作。

于 2021-09-10T03:32:27.210 回答
-1

当我遇到这个问题时(使用 docker-compose 管理的一组 docker 实例),我发现删除 docker-compose 解决了问题的网络:

docker-compose stop
# find the network related to my docker-compose setup
docker network ls
docker network rm NETWORKNAME
# let docker-compose recreate the network:
docker-compose up -d
于 2017-11-08T18:01:52.963 回答
-1

部分答案:

现在我部分解决了这个问题,虽然我尝试不使用bash创建容器并将端口更改为 3000(-p 3000:80),但它对我有用。

命令前:

     docker run -it -d --name containerName -h www.myhost.net -v /var/www/html -p 3000:80 --net mynetwork --ip 172.11.0.10 --privileged myimagename  bash

命令后:

    docker run -it -d --name containerName -h www.myhost.net -v /var/www/html -p 3000:80 --net mynetwork --ip 172.11.0.10 --privileged myimagename

然后,

使用bin/bash执行容器

  docker exec -it containerName bin/bash

现在,在本地工作连接另一台机器。

 hostmachineip:3000 


I don't know docker have any port restrictions.But This solution works for me.
于 2016-09-17T05:17:46.997 回答