【问题标题】:Cannot access MySQL from another container?无法从另一个容器访问 MySQL?
【发布时间】:2021-12-28 14:57:59
【问题描述】:

我已经阅读了this thread 和许多其他教程,但仍然无法使连接正常工作。

我创建了两个容器,它们在同一个网络net_a,MySQL容器是使用这个命令创建的:

docker run -itd --name mysql_a -p 3319:3306 -e MYSQL_ROOT_PASSWORD=passwd --network net_a mysql:latest 

在另一个容器中,我想使用 PyMySQL 访问 MySQL 数据库 db_a,我尝试了这个:

import pymysql.cursors
connection = pymysql.connect(
    host="mysql_a",
    user="root",
    password="passwd",
    database="db_a",
    port=3319, charset="utf8")
cur = connection.cursor()

但出现错误:

--> 353 self.connect() 354 355 def 进入(自我):

/usr/local/lib/python3.8/dist-packages/pymysql/connections.py 在 连接(自我,袜子) 662 如果调试: 第663章 --> 664 提高 exc 665 666 # 如果e既不是DatabaseError也不是IOError,这是一个bug。

OperationalError: (2003, "Can't connect to MySQL server on 'mysql_a' ([Errno 111] 连接被拒绝)")

我以为是因为它们不在同一个网络上,然后我从另一个容器 ping 容器名称 mysql_a,它显示如下:

PING mysql_a (172.18.0.3) 56(84) bytes of data.
64 bytes from mysql_a.net_a (172.18.0.3): icmp_seq=1 ttl=64 time=0.078 ms
64 bytes from mysql_a.net_a (172.18.0.3): icmp_seq=2 ttl=64 time=0.068 ms
64 bytes from mysql_a.net_a (172.18.0.3): icmp_seq=3 ttl=64 time=0.061 ms
64 bytes from mysql_a.net_a (172.18.0.3): icmp_seq=4 ttl=64 time=0.061 ms

我想知道为什么它不起作用?也许单主机桥接网络在这种情况下不起作用,我应该学习一些关于多主机覆盖网络的知识?

【问题讨论】:

    标签: python mysql docker containers pymysql


    【解决方案1】:

    我添加这个问题和答案只是为了那些可能和我犯过同样错误的人。我花了三个晚上才弄清楚。如果您通过将 3306 映射到主机接口上的某个端口 N 将 3306 发布到 Docker 外部的服务,则不应使用端口 N,并且 3306 应该没问题,因为两个容器位于同一主机和网络中(通过设置 --network arg)。

    主机可以配置为容器名称或其 IP。下面是一个使用 PyMySQL 的 Python 场景案例:

    import pymysql.cursors
    connection = pymysql.connect(
        host="mysql_a", # or 172.18.0.3 in this case
        user="root",
        password="passwd",
        database="db_a",
        port=3306, charset="utf8")
    cur = connection.cursor()
      
    

    如文档所述:

    要使端口可用于 Docker 外部的服务,或 Docker 容器未连接到容器网络,请使用 --publish 或 -p 标志。这将创建一个防火墙规则,该规则将容器端口映射到 Docker 主机上的端口到外部世界

    【讨论】:

      猜你喜欢
      • 2019-11-02
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 2017-07-12
      • 2020-07-26
      • 2019-06-13
      • 2019-04-28
      • 2021-12-23
      相关资源
      最近更新 更多