我编写了一个 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
如果我们尝试连接到本地主机上的 MariaDB 服务器,客户端 将绕过网络并尝试使用 本地文件系统中的套接字文件。但是,当 MariaDB 在容器内运行,因为服务器的文件系统 与主机隔离。客户端无法访问socket文件 它位于容器内部,因此无法连接。
因此必须使用 TCP 与 MariaDB 服务器建立连接, 即使客户端与服务器在同一台机器上运行 容器。
MariaDB-Site 上有关于如何将其与 docker 一起使用的详细说明,也列出了您的问题。请在创建问题之前进行适当的研究。
通常,您应该考虑使用 docker 网络并在专用容器中运行 python 脚本,以便两者可以在共享网络中进行通信。