从 docker 容器内部连接到 docker 守护进程

Posted

技术标签:

【中文标题】从 docker 容器内部连接到 docker 守护进程【英文标题】:connect to docker daemon from inside docker container 【发布时间】:2018-04-05 14:54:27 【问题描述】:

我正在尝试配置 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。并根据 Make docker use IPv4 for port binding 它应该仍然有效,但它没有..当我尝试时

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

【问题讨论】:

您使用的是网桥 IP 而不是 HOST IP。 ifconfig 的输出是什么? / # ifconfig eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02 inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU: 1500 度量:1 RX 数据包:14 错误:0 丢弃:0 超限:0 帧:0 TX 数据包:0 错误:0 丢弃:0 超限:0 运营商:0 冲突:0 txqueuelen:0 RX 字节:1108 (1.0 KiB)发送字节:0 (0.0 B) 我虽然容器 ip 是 172.17.0.2 并且默认路由是主机 ip 172.17.0.1.. 我可以使用它的 ip 172.17.0.1 连接到主机上运行的端口。我可以连接到与 ::: 相对的其他正在监听 0.0.0.0 的服务 【参考方案1】:

您可以启动容器,将主机 docker 套接字安装到您的容器中。

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

通过此设置,容器内的 Docker 客户端将使用主机中的 Docker 守护程序。您的容器将能够使用在主机中运行的守护程序来构建、运行、推送等。请注意,通过这些设置,一切都发生在主机上,因此如果您启动新容器,它们将成为“兄弟”容器。

编辑

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

例如,我在 IP 为 10.0.0.1 的主机上运行了 mysqld,并且从我可以做的容器中运行

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,请查看我的编辑,如果您想要的话,请告诉我。如果正确,请编辑您的问题以指定您要使用 TCP/IP 进行连接。 嗨@luciano-afranllia 我尝试按照您的建议将 docker 套接字安装为卷,但我得到了原因:java.lang.UnsatisfiedLinkError:/tmp/libjunixsocket-native-2.0.46148114015950108127.so: libstdc++.so.6:无法打开共享对象文件:没有这样的文件或目录 您的主机中似乎没有/var/run/docker.sock。检查 docker daemon 是否在主机上运行,​​并在该位置启用并配置了本地套接字。 我确实有那个文件..而且我可以使用主机上的套接字..在我将文件作为卷安装后,我不能从 docker 容器

以上是关于从 docker 容器内部连接到 docker 守护进程的主要内容,如果未能解决你的问题,请参考以下文章

无法从 docker 容器连接到数据库 [重复]

可以从docker容器外部连接到数据库,但不能从内部(在laravel中)连接到数据库

尝试从Docker容器内部连接到DB时,“连接被拒绝”

docker从容器连接到主机隧道

从容器内部连接到 PostgreSQL 容器的问题

如何从 Docker 容器连接到本地 Redis 服务器?