从Docker容器内部连接到Docker守护程序

dar*_*ana 4 ip networking tcp docker

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

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

{
   "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以通过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    
Run Code Online (Sandbox Code Playgroud)

所以首先我虽然是问题所在,但事实是它在ipv6而不是ipv4上监听。并根据 使docker使用IPv4进行端口绑定, 它应该仍然可以正常工作,但是没有。

telnet 172.17.0.1(docker host) 2375
Run Code Online (Sandbox Code Playgroud)

它在连接时失败

telnet 172.17.0.1(docker host) 80
Run Code Online (Sandbox Code Playgroud)

作品。如何连接到在主机上运行的Docker?我在Ubuntu 14.04.5 docker版本上运行:17.06.2-ce

Luc*_*lie 5

您可以开始将主机Docker套接字安装到容器中的容器。

docker run -v /var/run/docker.sock:/var/run/docker.sock ...
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

例如,我在主机上使用IP 10.0.0.1运行mysqld,并且可以从容器中运行

mysql -u user -p -h 10.0.0.1
Run Code Online (Sandbox Code Playgroud)

诀窍是从容器中找出主机IP地址。

在Mac的Docker中(我正在运行版本17.07.0)就像连接到特殊主机“ docker.for.mac.localhost”一样简单。

另一种选择是向回送接口添加别名IP

sudo ifconfig lo0 alias 192.168.1.1
Run Code Online (Sandbox Code Playgroud)

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

docker run --rm -ti --add-host host-machine:192.168.1.1 mysql:5.7 bash
Run Code Online (Sandbox Code Playgroud)

通过此设置,您应该能够在容器内部执行操作

mysql -u user -p -h host-machine
Run Code Online (Sandbox Code Playgroud)