从 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 守护进程的主要内容,如果未能解决你的问题,请参考以下文章