gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:34:33 24 4
gpt4 key购买 nike

所以我在 docker 容器中运行了一个 Nginx,我在 localhost 上运行了一个 mysql,我想从我的 Nginx 中连接到 MySql。 MySql 在 localhost 上运行并且没有向外界公开端口,因此它绑定(bind)在 localhost 上,而不是绑定(bind)在机器的 ip 地址上。

有没有办法从这个 docker 容器中连接到这个 MySql 或本地主机上的任何其他程序?

这个问题与“如何从 docker 容器内部获取 docker 主机的 IP 地址”不同,因为 docker 主机的 IP 地址可能是网络中的公共(public) IP 或私有(private) IP,这可能是也可能是无法从 docker 容器中访问(如果托管在 AWS 或其他地方,我的意思是公共(public) IP)。即使您拥有 docker 主机的 IP 地址,这并不意味着您可以从容器内连接到 docker 主机,因为您的 Docker 网络的 IP 地址可能是覆盖、主机、网桥、macvlan、none 等,这限制了那个IP地址。

最佳答案

编辑:
如果您使用 Docker-for-macDocker-for-Windows 18.03+,只需使用主机 host.docker.internal 连接到您的 mysql 服务(而不是连接字符串中的 127.0.0.1)。
如果您使用的是 Docker-for-Linux 20.10.0+,您还可以使用主机 host.docker.internal 如果 您使用 --add-host host.docker.internal:host-gateway 启动了 Docker 容器选项。
否则,请阅读下文

TLDR
使用--network="host"在您的 docker run命令,然后 127.0.0.1在您的 docker 容器中将指向您的 docker 主机。
注意:此模式仅适用于 Docker for Linux,per the documentation .

docker 容器网络模式注意事项
Docker 提供 different networking modes运行容器时。根据您选择的模式,您将连接到在 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: <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 主机的 IP 地址是 172.17.42.1docker0网络接口(interface)。
现在启动一个新容器并在其上安装一个 shell: docker run --rm -it ubuntu:trusty bash在容器类型 ip addr show eth0 内了解它的主网络接口(interface)是如何设置的:
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主机的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
搬运工运行--network =“主机”
或者,您可以使用 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 --network=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 容器共享完全相同的网络接口(interface),因此具有相同的 IP 地址。

从容器连接到 MySQL
桥接模式
要从容器以桥接模式访问在 docker 主机上运行的 MySQL,您需要确保 MySQL 服务正在监听 172.17.42.1 上的连接。 IP地址。
为此,请确保您拥有 bind-address = 172.17.42.1bind-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.0您的 MySQL 服务器将监听所有网络接口(interface)上的连接。这意味着可以从 Internet 访问您的 MySQL 服务器;确保相应地设置防火墙规则。
注2:如果您使用 bind-address = 172.17.42.1你的 MySQL 服务器不会监听到 127.0.0.1 的连接。 .在 docker 主机上运行的想要连接到 MySQL 的进程必须使用 172.17.42.1 IP地址。
主机模式
要在主机模式下从容器访问 docker 主机上运行的 MySQL,可以保留 bind-address = 127.0.0.1在您的 MySQL 配置中,您需要做的就是连接到 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 套接字进行连接。

关于nginx - 从 Docker 容器内部,如何连接到机器的本地主机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61986076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com