在 Docker 容器内部连接到 Docker 守护进程

19

我正在尝试配置Docker守护进程,以便我可以从我启动的Docker容器内部连接到它。

所以我更改了/etc/docker/daemon.json为

{
   "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}

所以我通过Docker桥接连接到它。但是,当我重新启动Docker时,我会收到以下错误信息:

netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         
State       PID/Program name
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      3728/mysqld     
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      24253/redis-server 
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3756/nginx      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3634/sshd       
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      3756/nginx      
tcp6       0      0 :::8010                 :::*                    LISTEN      4230/apache2    
tcp6       0      0 :::9200                 :::*                    LISTEN      26824/java      
tcp6       0      0 :::9300                 :::*                    LISTEN      26824/java      
tcp6       0      0 :::22                   :::*                    LISTEN      3634/sshd       
tcp6       0      0 :::2375                 :::*                    LISTEN      1955/dockerd    

起初,我认为问题在于它监听的是ipv6而不是ipv4。根据使用IPv4绑定端口的方法,它应该仍然可以工作,但事实并非如此。当我尝试时……

telnet 172.17.0.1(docker host) 2375

它在连接时失败了。

telnet 172.17.0.1(docker host) 80

如何连接到运行在主机上的 Docker?我使用的操作系统是 Ubuntu 14.04.5,Docker 版本为 17.06.2-ce。


{btsdaf} - Tarun Lalwani

ifconfig

eth0 链路类型: 以太网 硬件地址: 02:42:AC:11:00:02
inet 地址:172.17.0.2 广播:0.0.0.0 掩码:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX 数据包:14 错误:0 丢弃:0 过载:0 帧数:0 TX 数据包:0 错误:0 丢弃:0 过载:0 载波:0 冲突:0 txqueuelen:0 RX 字节:1108 (1.0 KiB) TX 字节:0 (0.0 B)
- darthShana
我原以为容器的IP地址应该是172.17.0.2,而默认路由应该是主机IP地址172.17.0.1。我可以使用主机IP地址172.17.0.1连接在其上运行的端口。但是,我无法连接到监听0.0.0.0而不是:::的其他服务。 - darthShana
2个回答

23

您可以通过将主机的docker套接字挂载到容器中来启动您的容器。

docker run -v /var/run/docker.sock:/var/run/docker.sock ...

使用此设置,容器内的Docker客户端将使用主机上的Docker守护程序。您的容器将能够使用在主机上运行的守护程序进行构建、运行、推送等操作。请注意,使用这些设置时,所有操作都发生在主机上,因此如果您启动新的容器,它们将成为“同级”容器。

编辑

如果您正在使用桥接网络,则可以使用主机IP地址连接到任何在主机上运行的服务。

例如,我在主机上运行mysqld,并具有IP地址10.0.0.1,从容器中我可以执行以下操作:

mysql -u user -p -h 10.0.0.1

诀窍在于从容器中找到主机的IP地址。

在Docker for Mac中(我正在运行版本17.07.0),只需连接到特殊主机“docker.for.mac.localhost”即可。

另一个选项是将别名IP添加到您的回环接口中。

sudo ifconfig lo0 alias 192.168.1.1

然后,在运行容器时为此别名IP添加主机。

docker run --rm -ti --add-host host-machine:192.168.1.1 mysql:5.7 bash

有了这个设置,你应该能够在容器内进行操作。

mysql -u user -p -h host-machine

好的,很酷。这是一个选项。但总的来说,我想能够连接到运行在主机上的端口。像 Redis 等等这样的东西。 - darthShana
@darthShana,请查看我的编辑并告诉我是否符合您的要求。如果正确,请编辑您的问题以指定您想使用TCP/IP连接。 - Luciano Afranllie
嗨@luciano-afranllia,我尝试按照您建议的将Docker套接字挂载为卷,但是出现了以下错误:Caused by: java.lang.UnsatisfiedLinkError: /tmp/libjunixsocket-native-2.0.46148114015950108127.so: libstdc++.so.6: 无法打开共享对象文件:没有那个文件或目录。 - darthShana
这个IP地址怎么样:172.17.0.1? - Dani
1
我也想知道它如何与默认的Docker IP 172.17.0.1配合使用。有些人说,任何在主机上运行的服务(例如localhost:1234)都应该通过host.docker.internal:1234从Docker容器内部访问。但是它不起作用,会出现“连接被拒绝”的错误。 - Moongazer
显示剩余3条评论

1
这个答案可能有点晚了,但是迟到总比没有好,因为我们永远无法预测谁会遇到类似的问题。我刚刚通过禁用不必要的ufw规则来阻止内部通信来解决了它。
示例:
sudo ufw allow from <IP address or range> to any port  [desired port]

sudo ufw allow from 172.16.0.0/12 to any port  3421.

对我来说,我使用以下命令完全禁用了UFW服务。

sudo ufw disable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接