首页 > 其他分享 >在Docker容器内,我如何连接到机器的本地主机?

在Docker容器内,我如何连接到机器的本地主机?

时间:2023-10-29 21:22:54浏览次数:46  
标签:容器 主机 host ff Docker docker

内容来自 DOC https://q.houxu6.top/?s=在Docker容器内,我如何连接到机器的本地主机?

我有一个运行在Docker容器内的Nginx。我的主机系统上运行着一个MySql。我想从我的容器内连接到MySql。MySql只绑定到本地主机设备。

有没有办法从这个Docker容器内连接到这个MySql或其他在本地主机上的程序?

这个问题与“如何从Docker容器内部获取Docker主机的IP地址”不同,因为Docker主机的IP地址可能是公共IP或网络中的私有IP,这可能可以从Docker容器内部访问(我的意思是AWS等托管的公共IP)。即使你有Docker主机的IP地址,也不能保证你可以使用该IP地址从容器内部连接到Docker主机,因为你的Docker网络可能是覆盖、主机、桥接、macvlan、无等,这些限制了该IP地址的可访问性。


编辑:

如果您使用的是 Docker-for-macDocker-for-windows 18.03+,请使用 host host.docker.internal(而不是连接字符串中的 127.0.0.1)连接到您的mysql服务。

如果您使用的是 Docker-for-Linux 20.10.0+,您也可以使用 host host.docker.internal 如果您使用--add-host host.docker.internal:host-gateway选项启动了Docker容器,或者在docker-compose.yml文件中添加以下代码片段:

extra_hosts:
    - "host.docker.internal:host-gateway"

否则,请阅读以下内容。


TLDR

docker run 命令中使用 --network="host",然后在docker容器中,127.0.0.1 将指向您的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: <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,然后在容器内键入 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主机的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"

如果您想从Docker容器连接到宿主机的MySQL服务,请使用 --network="host" 参数运行 docker run 命令。这将使您的容器与宿主机共享网络栈,从而使您可以从容器内部访问宿主机上的MySQL服务。请注意,此方法仅适用于Docker for Linux,并且需要确保在启动Docker容器时添加了 --add-host host.docker.internal:host-gateway 选项,或者在docker-compose.yml文件中添加了相应的片段。
你可以选择使用 --network="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: <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

host模式下的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容器共享完全相同的网络接口,因此具有相同的IP地址。


从容器连接到MySQL

桥接模式

要从桥接模式下的Docker主机上的容器访问MySQL,需要确保MySQL服务正在监听172.17.42.1 IP地址上的连接。

为此,请确保您的MySQL配置文件(my.cnf)中有以下设置之一:bind-address = 172.17.42.1bind-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服务器可以从Internet访问,请相应地设置防火墙规则。

注意2:如果您使用bind-address = 172.17.42.1,则MySQL服务器不会监听连接到127.0.0.1的连接。需要在Docker主机上运行并希望连接到MySQL的进程必须使用172.17.42.1 IP地址。

主机模式

要从主机模式下的Docker主机上的容器访问MySQL,您可以在MySQL配置中保持bind-address = 127.0.0.1,并从容器连接到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套接字连接。

标签:容器,主机,host,ff,Docker,docker
From: https://www.cnblogs.com/xiaomandujia/p/17796492.html

相关文章

  • 在Docker上搭建ELK+Filebeat日志中心
    当前环境1.系统:centos 72.docker1.12.1介绍ElasticSearchElasticsearch是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎ApacheLucene基础上的搜索引擎,使用Java语言编写。LogstashLogstash是一个具有实时渠道......
  • Ubuntu环境下docker的安装和基本使用
    docker是一个基于GoLang的应用容器引擎,它轻量级的沙箱化特性让它在服务器运维方面不可或缺。docker的优势和特性本篇不再赘述,着重记录Ubuntu环境下docker快速安装和基本使用。docker引擎本身是跨平台的,在不同Linux、Mac和win环境有不同的实现,而win环境则依托于vbox和hyper-v的虚拟......
  • nexus3 作为docker仓库与镜像缓存的记录
    因为搞k8s拉取镜像太慢,不同版本每次都要等待半天,用nexus3作为docker镜像的缓存与仓库镜像,虽然权限控制弱一些,够用,记录用法及踩坑。1作为镜像缓存,唯一的坑,就是第一次拉取及后续拉取镜像,没有缓存,也不晓得为啥配置了 insecure-registries和 registry-mirrors没生效,iftop观察流......
  • 收藏从未停止,练习从未开始——MYSQL游标存储过程IDEA快捷键配置SpringBoot入门到入土G
    “收藏从未停止,练习从未开始”,或许有那么一些好题好方法,在被你选中收藏后却遗忘在收藏夹里积起了灰?今天请务必打开你沉甸甸的收藏重新回顾,分享一下那些曾让你拍案叫绝的好东西吧!本人详解:(提醒:随笔)本人详解作者:王文峰,参加过2020年度博客之星,《Java王大师王天师》作者采购供应链共享......
  • 【SpringBoot】Docker部署
    docker部署是主流的部署方式,极大的方便了开发部署环境,保持了环境的统一,也是实现自动化部署的前提。1项目的目录结构package:点击打包,生成xxx-SNAPSHOT.jartarget目录:打包生成目录,生成的jar存放位置Dockerfile:跟项目根目录同级2创建Dockerfile#Docker镜像构......
  • "阿贝云"免费虚拟主机
    第一次使用"阿贝云"的免费虚拟主机,实际体验让我很惊讶。我的网站在他们的服务器上运行得很稳定,速度也很快。很推荐"阿贝云",让更多人享受这一好处。了解更多信息,请访问他们的官方网站:https://www.abeiyun.com。"阿贝云"有免费的虚拟主机,让我省去了不少开支。这对于小型网站运营者......
  • nfs-client-provisioner 启动失败(容器日志:panic: error creating self-signed certifi
    1、NFS服务部署#cat/etc/exports/data/kubernetes/*(insecure,rw,sync,no_root_squash)/data/nfs/*(insecure,rw,sync,no_root_squash)在node-1-231验证nfs服务#showmount-e192.168.1.230Exportlistfor192.168.1.230:/data/nfs/*/data/kubernetes/*......
  • Cannot connect to the Docker
    执行docker基础命令失败!CannotconnecttotheDockerdaemonatunix:///var/run/docker.sock.Isthedockerdaemonrunning?原因:docker服务没有启动。解决方法:执行systemctlstartdocker即可。......
  • 这是我在51CTO博客的第一篇博文Loki 实现 Kubernetes1.24 容器日志监控
    使用Loki实现Kubernetes1.24容器日志监控一、基本介绍1.Loki架构2.Loki工作原理二、使用Loki实现容器日志监控1.安装Loki2.安装Promtail3.安装Grafana4.验证一、基本介绍Loki是由GrafanaLabs团队开发的,基于Go语言实现,是一个水平可扩展,高可用性,多租户的日志聚合系......
  • Linux 下使用 Docker 安装 Redis
    1、下载redisdockerpullredis:6.2.62、提前创建挂载目录mkdir-p/mydata/redis/confmkdir-p/mydata/redis/datamkdir-p/mydata/redis/logtouch/mydata/redis/conf/redis.conftouch/mydata/redis/log/redis.logchmod777/mydata/redis/log/redis.log3、启......