如何将在 docker compose 内部运行的 mariadb 与在主机上 docker 外部运行的 python 脚本连接起来

问题描述 投票:0回答:1

我编写了一个 docker compose 文件并使用了

docker compose up -d
命令。然后我写了一个简单的 python 脚本来连接 maria db,但每次都会出错。

我的虚拟环境中的mariadb版本是1.0.11

pip install mariadb==1.0.11

version: '3.8'

services:
  mariadb:
    image: mariadb:latest
    container_name: my_mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: myrpass  
      MYSQL_DATABASE: db1   
      MYSQL_USER: user          
      MYSQL_PASSWORD: mypass  
    volumes:
      - mariadb-data:/var/lib/mysql  
    ports:
      - "3307:3307"  
volumes:
 mariadb-data: {} 

我的Python代码:

import mariadb

host = "mariadb"
port = 3307
user = "user"
password = "mypass"
database = "db1"

try:
    conn = mariadb.connect(
        host=host,
        port=port,
        user=user,
        password=password,
        database=database
    )
    cursor = conn.cursor()
    cursor.execute("SELECT VERSION()")
    version = cursor.fetchone()[0]
    print(f"Connected to MariaDB server version: {version}")
except mariadb.Error as e:
    print(f"Error connecting to database: {e}")
else:
    print('Connection found attempting to close it now')
    if conn:
        conn.cursor().close()
        conn.close()
finally:
    print('Code execution complete')

我使用 mariadb 作为主机时出错:

Error connecting to database: Unknown MySQL server host 'mariadb' (-3)
Code execution complete

当我使用 localhost 作为主机时出现错误:

Error connecting to database: Access denied for user 'user'@'localhost' (using password: YES)
Code execution complete
python python-3.x mariadb
1个回答
0
投票

如果我们尝试连接到本地主机上的 MariaDB 服务器,客户端 将绕过网络并尝试使用 本地文件系统中的套接字文件。但是,当 MariaDB 在容器内运行,因为服务器的文件系统 与主机隔离。客户端无法访问socket文件 它位于容器内部,因此无法连接。

因此必须使用 TCP 与 MariaDB 服务器建立连接, 即使客户端与服务器在同一台机器上运行 容器。

https://mariadb.com/kb/en/installing-and-using-mariadb-via-docker/#connecting-to-mariadb-from-outside-the-container

MariaDB-Site 上有关于如何将其与 docker 一起使用的详细说明,也列出了您的问题。请在创建问题之前进行适当的研究。

通常,您应该考虑使用 docker 网络并在专用容器中运行 python 脚本,以便两者可以在共享网络中进行通信。

© www.soinside.com 2019 - 2024. All rights reserved.