首页 > 解决方案 > 无法通过 docker 容器中的 Jyputer 读取 mysql(错误:DatabaseError: 2005 (HY000): Unknown MySQL server host 'localhost:3306' (22))

问题描述

我的代码如下:

import mysql.connector
mydb = mysql.connector.connect(host="localhost:3306",user="root",password="example")
print("Connected")

Docker 为 mysql 和 jyputer 文件编写:

# Use root/example as user/password credentials
version: '3.1'

services:

  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
      AWS_ACCESS_KEY_ID: "A"
      AWS_SECRET_ACCESS_KEY: "k"

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

电脑:

version: "3"
services:
  pyspark:
    image: "jupyter/all-spark-notebook"
    volumes:
      - c:/code/pyspark-data:/home/jovyan
    ports:
      - 8888:8888
    environment:  
        AWS_ACCESS_KEY_ID: "5H"
        AWS_SECRET_ACCESS_KEY: "0oRBJk"  

我还使用此命令创建了一个网络并将所有容器保存在一个网络下

码头工人网络连接我的网络929cd60b08df

在 jyputer 网络中执行时收到错误:

 DatabaseError: 2005 (HY000): Unknown MySQL server host 'localhost:3306' (22)

我尝试了什么:

mysql 错误 2005 - 未知的 MySQL 服务器主机 'localhost'(11001) 127.0.0.1 localhost 这个网络已经存在于 etc/hosts 文件夹中。不知道现在该怎么办

标签: mysqlpython-3.xdockerdocker-composemysql-python

解决方案


创建网络时,您需要连接两个容器

docker network create mynetwork
docker network connect mynetwork db_container_id
docker network connect mynetwork pyspark_container_id

然后获取它的配置

docker network inspect mynetwork

它给出了这个桥接网络的 IP 地址

[
    {
        "Name": "t11",
        "Id": "bb203079ab3e48badacb3bb53181dd6871b2f60f22b4079729bc069e1739bbe0",
        "Created": "2021-05-21T04:46:48.591105541Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.28.0.0/16",
                    "Gateway": "172.28.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "3ff678e8ddeb600b1af38a06dda053c8bf6544b136bfca91363379df1d40c69a": {
                "Name": "t1_db_1",
                "EndpointID": "deefd7c8a187b9513fd074f9632f961312a3bdaa8aa568be6223f3d301389808",
                "MacAddress": "02:42:ac:1c:00:03",
                "IPv4Address": "172.28.0.3/16",
                "IPv6Address": ""
            },
            "9c95f68416586d3f1a87376a4a669df834d7b25eb22e3b3f33afb0ce1918d6cc": {
                "Name": "t2_pyspark_1",
                "EndpointID": "0fcbf15530f5b0a526c2036d26890e087f3becdd6eae1896e58a6a67efe2f676",
                "MacAddress": "02:42:ac:1c:00:02",
                "IPv4Address": "172.28.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

你需要 db 容器的 IP,在这个例子中它是172.28.0.3

随它去

mydb = mysql.connector.connect(port="3306", host="172.28.0.3", user="root", password="example")
print("Connected")
cursor = mydb.cursor()
query = ("select 1;")
cursor.execute(query)
for r in cursor:
    print(r)
cursor.close()


推荐阅读