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


当前回答

这不是对实际问题的回答。这就是我解决类似问题的方法。解决方案完全来自:定义Docker容器网络,以便容器可以通信。感谢Nic Raboy

这里留给其他可能希望在一个容器和另一个容器之间进行REST调用的人。回答问题:在docker环境中使用什么来代替localhost?

了解您的网络看起来像docker网络

创建一个新的网络docker网络创建-d我的网络

启动第一个容器docker运行-d-p 5000:5000--network=“my net”--name“first_container”<MyImage1:v0.1>

查看第一个集装箱码头工人检查first_container的网络设置。“网络”:应该有“我的网”

启动第二个容器docker运行-d-p 6000:6000--network=“my net”--name“second_container”<MyImage2:v0.1>

检查第二个集装箱码头的网络设置,检查second_container。“网络”:应该有“我的网”

ssh到第二个容器docker exec-it secondcontainer sh或docker exec-it secondtainer bash中。

在第二个容器内部,可以通过ping first_container ping第一个容器。此外,您的代码调用如http://localhost:5000可以替换为http://first_container:5000

其他回答

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

通过注释将本地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

对于我来说,在主机上执行此命令以获取ip的做法是:

docker run busybox ping -c 1 host.docker.internal | awk 'FNR==2 {print $4}' | sed s'/.$//'

或在mac上

docker run busybox ping -c 1 docker.for.mac.localhost | awk 'FNR==2 {print $4}' | sed s'/.$//'

码头组合.yml

version: '3.8'

services:
  spring-app-container:
    image: spring-app:1
    build:
      context: ./
      dockerfile: Dockerfile
    ports:
      - "50800:50800"

在host.docker.internal为每个平台工作之前,您可以使用我的容器作为NAT网关,而无需任何手动设置:

https://github.com/qoomon/docker-host

在修复程序未合并到主分支之前,只需从容器内部运行主机IP即可:

ip -4 route list match 0/0 | cut -d' ' -f3

(正如@Mahoney在这里所建议的)。

Linux解决方案(内核>=3.6)。

好的,本地主机服务器有一个默认的docker接口docker0,IP地址为172.17.0.1。容器以默认网络设置--net=“bridge”启动。

为docker0接口启用route_localnet:$sysctl-w net.ipv4.conf.docker0.route_localnet=1将这些规则添加到iptables:$iptables-t nat-I预路由-I docker0-d 172.17.0.1-p tcp--dport 3306-j DNAT--to 127.0.0.1:3306$iptables-t filter-I INPUT-I docker0-d 127.0.0.1-p tcp--dport 3306-j ACCEPT创建具有从“%”访问权限的MySQL用户,这意味着-来自任何人,不包括本地主机:CREATE USER“USER”@“%”IDENTIFIED BY“password”;在脚本中将mysql服务器地址更改为172.17.0.1。

从内核文档中:

route_localnet-BOOLEAN:在路由时,不要将环回地址视为火星源或目的地。这允许将127/8用于本地路由目的(默认为FALSE)。