我有一个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地址的可达性。


当前回答

如果使用--net=host运行,localhost应该可以正常工作。如果您使用默认网络,请使用静态IP 172.17.0.1。

看到这个-https://stackoverflow.com/a/48547074/14120621

其他回答

首先查看此答案,了解解决此问题所需的选项。但如果使用docker compose,则可以将network_mode:host添加到服务中,然后使用127.0.0.1连接到本地主机。这只是上述答案中描述的选项之一。下面你可以看到我是如何修改docker-compose.yml的https://github.com/geerlingguy/php-apache-container.git:

 ---
 version: "3"
 services:
   php-apache:
+    network_mode: host
     image: geerlingguy/php-apache:latest
     container_name: php-apache
...

+表示我添加的行。


[附加信息]这在2.2版中也有效。和“host”或“host”都在docker compose中工作。

 ---
 version: "2.2"

 services:
   php-apache:
+    network_mode: "host"
        or
+    network_mode: host
...

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

您可以在主机上简单地进行ifconfig以检查您的主机IP,然后从容器中连接到IP,这对我来说非常有用。

这是我的解决方案:它适用于我的情况

通过注释将本地mysql服务器设置为公共访问#绑定地址=127.0.0.1在/etc/mysql/mysql.conf中重新启动mysql服务器sudo/etc/init.d/mysql重启运行以下命令以打开用户root访问任何主机mysql-uurot-proot将*.*上的所有特权授予“root”@“%”,由“root”标识授予期权;刷新特权;创建sh脚本:run_docker.sh

    #!bin/bash

    HOSTIP=`ip -4 addr show scope global dev eth0 | grep inet | awk '{print \$2}' | cut -d / -f 1`


      docker run -it -d --name web-app \
                  --add-host=local:${HOSTIP} \
                  -p 8080:8080 \
                  -e DATABASE_HOST=${HOSTIP} \
                  -e DATABASE_PORT=3306 \
                  -e DATABASE_NAME=demo \
                  -e DATABASE_USER=root \
                  -e DATABASE_PASSWORD=root \
                  sopheamak/springboot_docker_mysql

  

与docker composer一起运行版本:“2.1”服务:tomcatwar公司:外部主机(_H):-“本地:10.1.2.232”图片:sopheamak/springboot_docker_mysql端口:- 8080:8080环境:-DATABASE_HOST=本地-DATABASE_USER=根-DATABASE_PASSWORD=根-DATABASE_NAME=演示-数据库端口=3306

您可以为计算机使用网络别名

OSX

sudo ifconfig lo0 alias 123.123.123.123/24 up

LINUX操作系统

sudo ifconfig lo:0  123.123.123.123 up

然后从容器中,您可以通过123.123.123.123看到机器