linux本机请求ip映射到本机,从Docker容器内部,如何连接到本机的本地主机?

编辑:如果您使用的是Docker-for-mac或Docker-for-Windows 18.03+,只需使用主机连接到您的mysql服务即可host.docker.internal。

从Docker 18.09.3开始,这不适用于Docker-for-Linux。一个修复已三月提交的8日,2019年将有望被合并到代码库。在此之前,解决方法是使用qoomon的答案中描述的容器。

TLDR

--network="host"在您的docker run命令中使用,然后127.0.0.1在您的docker容器中将指向您的docker主机。

注意:根据文档,此模式仅适用于Docker for Linux 。

关于docker容器网络模式的注意事项

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

docker run --network =“bridge”(默认)

Docker创建一个docker0默认命名的网桥。docker主机和docker容器都在该网桥上有一个IP地址。

在Docker主机上输入sudo ip addr show docker0你会看到如下输出:

[vagrant@docker:~] $ sudo ip addr show docker0

4: docker0: 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主机172.17.42.1在docker0网络接口上有IP地址。

现在启动一个新容器并在其上获取一个shell:docker run --rm -it ubuntu:trusty bash并在容器类型ip addr show eth0中发现它的主网络接口是如何设置的:

root@e77f6a1b3740:/# ip addr show eth0

863: eth0: 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主机的IP地址172.17.42.1被设置为默认路由,可以从容器中访问。

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 --network =“host”

或者,您可以运行设置为的网络设置host的docker容器。这样的容器将与docker主机共享网络堆栈,并且从容器的角度来看,localhost(或127.0.0.1)将引用docker主机。

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

我的docker主机上的IP配置:

[vagrant@docker:~] $ ip addr show eth0

2: eth0: 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 --network=host ubuntu:trusty ip addr show eth0

2: eth0: 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.1IP地址上的连接。

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

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

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

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

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

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

主机模式

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

[vagrant@docker:~] $ docker run --rm -it --network=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>

注意:不要使用mysql -h 127.0.0.1,而不是mysql -h localhost; 否则MySQL客户端将尝试使用unix套接字进行连接。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值