当前位置: 首页 > 知识库问答 >
问题:

Docker:使用主机中的--net=host选项访问Docker容器中的mysql

楚涵润
2023-03-14

我正在运行带有--net=host选项的2个docker容器,因此网络是透明的(docker容器使用与主机相同的网络设备)。

    docker network inspect host
[
    {
        "Name": "host",
        "Id": "32ddf8f58d520e49a0b3f296d6d03134b24d7c503309e1c35e04c248010aa64b",
        "Scope": "local",
        "Driver": "host",
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": []
        },
        "Containers": {
            "0e41eb0b07d2751db99a204a3a69a2446bf5b869150bc5741df670e56dbce670": {
                "Name": "sleepy_goldstine",
                "EndpointID": "cc8f2c4da055ae7e608c127552f67753c319aeb603234c418a0ebe8958c1025a",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            },
            "71de826121e7222020eec8be8b3a737f3297f8c3aa99d21f0f7016d6aca6f668": {
                "Name": "tender_goodall",
                "EndpointID": "2da0468dbaf1e6b877984cbeb6b2a775786259fec7e83eb373c1d25fe715e16f",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            }
        },
        "Options": {}
    }
]

我可以从外部访问docker容器中的多个服务。然而,有一件事是行不通的,我开始用剪刀在上面跑。。。

在docker主机上有一个运行在端口3306上的mysql数据库。没有问题。

Docker容器1在端口3307上运行mysqld,Docker容器2在端口3308上运行mysqld

然而,使用

mysql-p3307-u user-pdbname

我无法从主机访问mysqlhtml" target="_blank">数据库。即使我为运行在第一个docker实例中的mysql提供端口,它也总是将我指向主机上的mysql数据库。目前还没有可能导致此类行为的iptables规则。关闭防火墙不会改变行为。

在my.cnf中,mysql服务器绑定到0.0.0.0(127.0.0.1)也不起作用。

所以我迷路了,希望有人能找到解决办法。删除--host=net选项并使用端口公开不是一个选项,因为这会降低容器中的网络性能。

编辑:忘记提到docker容器中的数据库是可访问的,并且按照设计工作。唯一不起作用的是来自主机的连接-

共有1个答案

袁宜民
2023-03-14

我猜这与Docker网络无关。MySQL客户端只是倾向于在MySQL服务器暴露的主机上使用Unix套接字。只需向客户端提供主机IP地址-h127.0.0.1,以强制其使用TCP。

 类似资料:
  • 我有一个jupyterhub运行在一个容器与network_mode:主机由于一些要求。但是,在我的docker-comment文件中将network_mode设置为主机后,我无法使用主机ip: 8000从外部主机访问jupyterhub。 我的理解是 如果对容器使用主机网络模式,则该容器的网络堆栈不会与Docker主机隔离(容器共享主机的网络名称空间),并且容器不会获得分配的自己的IP地址。例如

  • 问题内容: 我正在开发服务,并在那里使用docker compose来旋转诸如postgres,redis,elasticsearch之类的服务。我有一个基于RubyOnRails的Web应用程序,并从所有这些服务中进行读写操作。 这是我的 我可以在此网络中ping容器 到目前为止,一切都很好。现在我想在主机上的Rails应用程序上运行ruby,但是能够像目前这样使用url访问postgres实例

  • 我有一个docker应用程序,我使用以下docker compose。yml运行它: 我有一个没有docker化的服务器在我的机器上运行,我可以通过访问它。我希望我的服务能够访问它。 我发现有人建议在我的服务配置中添加以下内容: 但是当我添加这个时,并尝试,我得到。当我尝试<code>curl时,也会出现同样的错误http://host.docker.internal:3000。 我拼命地尝试将端

  • 我在本地机器(Mac)上工作,其中有一个名为sqlvm的遗留虚拟机(这意味着我可以通过http://sqlvm:从本地主机访问这个虚拟机)。现在,我在应该连接到vm的同一个本地主机(我的Mac)中设置了几个docker容器(使用docker-compose)。< code>pymysql会引发一个异常: 如何将外部的“sqlvm”公开给内部 Docker 网络? 编辑:我尝试在yml文件中为相关容

  • 问题内容: 我是Docker的新手。 我运行了一个10节点的图像,并在运行的容器中克隆了一个存储库,运行了使用文件监视程序启动服务器的应用程序。我需要访问容器内的代码库,并在Windows主机上运行的IDE中打开它。如果完成了,那么我还希望当我在IDE中更改文件时,这些更改会在容器中引起文件监视程序。 任何帮助表示赞赏。谢谢, 问题答案: 您正在寻找的概念称为卷。您需要启动一个容器并在其中安装主机

  • 问题内容: 使用ubuntu tusty,在远程计算机上运行了一项服务,我可以通过SSH隧道通过端口转发访问该服务。 我正在运行一个Docker容器。我需要通过主机的隧道从容器内部访问该远程服务。 我尝试使用进行从容器到主机的隧道传输,然后从容器内部通过访问服务失败。为了检查端口映射是否打开,我尝试了 在此之后,parag。2,但即使 在集装箱处也没有察觉的交流 我还尝试通过映射端口,但是这报告绑