nginx – 从Docker容器的内部,如何连接到本机的本地主机?

所以我有一个Nginx运行在一个docker容器,我有一个mysql运行在localhost,我想连接到我的Nginx内的MySql。 MySql在localhost上运行,并且不将端口暴露给外部世界,因此其绑定在localhost上,而不是绑定在机器的ip地址上。

有没有办法连接到这个MySql或任何其他程序在localhost从这个docker容器?

最佳答案
关于docker容器网络模式的注意事项

Docker在运行容器时提供different networking modes。根据您选择的模式,您将以不同的方式连接到在Docker主机上运行的MySQL数据库。

docker run –net =“bridge”(默认)

默认情况下,Docker创建一个名为docker0的网桥。 Docker主机和Docker容器在该网桥上都有一个IP地址。

在Docker主机上,键入sudo ip addr show docker0,你将有一个输出看起来像:

[vagrant@docker:~] $ sudo ip addr show docker0
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::5484:7aff:fefe:9799/64 scope link
       valid_lft forever preferred_lft forever

所以这里我的docker主机在docker0网络接口上有IP地址172.17.42.1。

现在启动一个新容器,并获得一个shell:docker run –rm -it ubuntu:trusty bash -il和容器类型ip addr show eth0,以发现它的主要网络接口是如何设置的:

root@e77f6a1b3740:/# ip addr show eth0
863: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 66:32:13:f0:f1:e3 brd ff:ff:ff:ff:ff:ff
    inet 172.17.1.192/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::6432:13ff:fef0:f1e3/64 scope link
       valid_lft forever preferred_lft forever

这里我的容器有IP地址172.17.1.192。现在看看路由表:

root@e77f6a1b3740:/# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.17.42.1     0.0.0.0         UG    0      0        0 eth0
172.17.0.0      *               255.255.0.0     U     0      0        0 eth0

因此,docker主机172.17.42.1的IP地址设置为默认路由,可以从您的容器访问。

root@e77f6a1b3740:/# ping 172.17.42.1
PING 172.17.42.1 (172.17.42.1) 56(84) bytes of data.
64 bytes from 172.17.42.1: icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from 172.17.42.1: icmp_seq=2 ttl=64 time=0.201 ms
64 bytes from 172.17.42.1: icmp_seq=3 ttl=64 time=0.116 ms

docker run –net =“host”

或者,您可以使用network settings set to host运行docker容器。这样的容器将与docker主机共享网络堆栈,从容器的角度来看,localhost(或127.0.0.1)将引用docker主机。

请注意,在docker容器中打开的任何端口都将在docker主机上打开。而这不需要-p or -P docker run option

我的Docker主机上的IP配置:

[vagrant@docker:~] $ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
       valid_lft forever preferred_lft forever

并在主机模式下从docker容器:

[vagrant@docker:~] $ docker run --rm -it --net=host ubuntu:trusty ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
       valid_lft forever preferred_lft forever

正如你可以看到,docker主机和docker容器共享完全相同的网络接口,因此具有相同的IP地址。

从容器连接到MySQL

桥接模式

要以桥接模式从容器访问在docker主机上运行的MySQL,您需要确保MySQL服务正在侦听172.17.42.1 IP地址上的连接。

为此,请确保您的MySQL配置文件(my.cnf)中有bind-address = 172.17.42.1或bind-address = 0.0.0.0。

如果您需要使用网关的IP地址设置环境变量,则可以在容器中运行以下代码:

export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print $2}')

那么在您的应用程序中,使用DOCKER_HOST_IP环境变量来打开与MySQL的连接。

注意:如果使用bind-address = 0.0.0.0,MySQL服务器将侦听所有网络接口上的连接。这意味着你的MySQL服务器可以从互联网到达;请确保相应地设置防火墙规则。

注意2:如果你使用bind-address = 172.17.42.1,你的MySQL服务器将不会监听到localhost或127.0.0.1的连接。在docker主机上运行的想要连接到MySQL的进程必须使用172.17.42.1 IP地址。

主机模式

要在主机模式下从容器访问在Docker主机上运行的MySQL,您可以在MySQL配置中保留bind-address = 127.0.0.1,您所需要做的就是从容器连接到localhost:

[vagrant@docker:~] $ docker run --rm -it --net=host mysql mysql -h 127.0.0.1 -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 5.5.41-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

转载注明原文:nginx – 从Docker容器的内部,如何连接到本机的本地主机? - 代码日志