我有一个Nginx在码头集装箱里运行。我在主机系统上运行了MySql。我想从我的容器中连接到MySql。MySql仅绑定到本地主机设备。

是否有任何方法可以从这个docker容器连接到这个MySql或本地主机上的任何其他程序?

这个问题与“如何从docker容器中获取docker主机的IP地址”不同,因为docker主机IP地址可以是网络中的公共IP或私有IP,而这些IP可能在docker容器内无法访问(如果托管在AWS或其他地方,我指的是公共IP)。即使你有docker主机的IP地址,这并不意味着你可以从容器内连接到docker主机,因为你的docker网络可能是overlay、host、bridge、macvlan、none等,这限制了该IP地址的可达性。


当前回答

你需要知道网关!我使用本地服务器的解决方案是在0.0.0.0:8000下公开它,然后使用子网运行docker并运行容器,如下所示:

docker network create --subnet=172.35.0.0/16 --gateway 172.35.0.1 SUBNET35
docker run -d -p 4444:4444 --net SUBNET35 <container-you-want-run-place-here>

因此,现在您可以通过http://172.35.0.1:8000

其他回答

在Windows 10 Home上使用Docker Toolbox时,没有一个答案对我有效,但10.0.2.2有效,因为它使用VirtualBox,将主机暴露给该地址上的VM。

尽管有很多冗长而令人困惑的答案,但还是有一个简短的答案。如果您的docker网桥网络为172.17.0.0/16,请执行以下操作:

将容器绑定到172.17.0.1,例如-p 172.17.0.1:8080:8080(Docker网桥网络中的网关)只需访问172.17.0.1端口8080,例如curlhttp://172.17.0.1:8080/来自其他容器

主机上的服务器正在监听端口5000;它将从主机发回一个字符串响应作为响应

echo“主机响应”|nc-l-p 5000

docker默认在网桥模式下运行(这比在主机网络模式下运行更安全);docker中的进程获取主机上第一个网络接口的ipv4地址,该地址不是127.0.0.1;这个ipv4地址通过环境变量HOSTIP传递给docker;在docker内部有一个nc命令,该命令连接到主机ip和端口5000上的服务器;该命令还读取服务器的响应。

HOST=$(ifconfig|grep“inet”|grep-v 127.0.0.1|awk“{print$2}”| head-1|sed-n‘s/[^0-9]*\([0-9\.]*\)/\1/p');docker run-e HOSTIP=“${HOST}”--rm-it alpine/bin/sh-c'echo“来自容器的问候语”|nc$HOSTIP 5000-v'

计算第一个列出接口的ipv4地址的表达式在osx和linux上确实有效:

HOST=$(ifconfig|grep“inet”|grep-v 127.0.0.1|awk“{print$2}”| head-1|sed-n‘s/[^0-9]*\([0-9\.]*\)/\1/p')

让它更通用:您可以在另一个docker容器中运行服务器,如下所示:

docker run--expose 5000-p:5000:5000--rm-it alpine/bin/sh-c'echo“来自主机的响应”|nc-l-p 5000'

--暴露5000码头集装箱可以接受端口5000上的连接

-p:5000:5000主机端的docker引擎监听任何接口上的端口5000,并将连接转发到容器网络(nc正在运行)的端口5000。

你需要知道网关!我使用本地服务器的解决方案是在0.0.0.0:8000下公开它,然后使用子网运行docker并运行容器,如下所示:

docker network create --subnet=172.35.0.0/16 --gateway 172.35.0.1 SUBNET35
docker run -d -p 4444:4444 --net SUBNET35 <container-you-want-run-place-here>

因此,现在您可以通过http://172.35.0.1:8000

我通过在MySQL中为容器的ip创建一个用户来解决这个问题:

$ sudo mysql<br>
mysql> create user 'username'@'172.17.0.2' identified by 'password';<br>
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on database_name.* to 'username'@'172.17.0.2' with grant option;<br>
Query OK, 0 rows affected (0.00 sec)

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
<br>bind-address        = 172.17.0.1

$ sudo systemctl restart mysql.service

然后在容器上:jdbc:mysql://<b>172.17.0.1</b>:3306/database_name