如何使用 pymysql 连接到 docker 容器上的 mariadb

How to connect to mariadb on a docker container using pymsql

我正在使用 Docker 容器连接到 mysql,但出现以下错误。

错误:

pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 99] Cannot assign requested address)")

我不确定 'localhost' 我正在使用 linode/Digital Ocean 实例。

测试class (test_mysql.py)

import pymysql
class TestDBConnectionFromDocker(object):
    def test_docker(self):
        connection = pymysql.connect(
                host='localhost', 
                user='root', 
                password='myodesi123', 
                port=6603)
        assert connection == True

docker-compose.yaml

version: '3.1'
services:
  test:
    build: .
    links:
      - mariadb
    volumes:
      - .:/sp_odesi_report_project
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=sp_odesi
      - MYSQL_USER=odesi
      - MYSQL_PASSWORD=myodesi123
    stdin_open: true
    ports:
      - 6603:3306
    depends_on:
      - mariadb
    tty: true

  mariadb:
    image: mariadb:latest
    restart: unless-stopped
    container_name: mariadb-odesi
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=sp_odesi
      - MYSQL_USER=odesi
      - MYSQL_PASSWORD=myodesi123
    expose:
      - 3306

Docker文件

 FROM python:3.7.6-buster

 RUN mkdir /sp_odesi_report_project/
 COPY ./test_mysql.py /sp_odesi_report_project/

 RUN pip install --upgrade pip
 RUN pip3 install pymysql==0.9.3
 RUN pip3 install pytest

 WORKDIR /sp_odesi_report_project/

 CMD "pytest"
 ENV PYTHONDONTWRITEBYTECODE=true

命令行

docker-compose build

docker-compose run test sh

pytest -v

检查

[root@li1975-241 sp_odesi]# docker container inspect c3e | grep -C 2 '3306'
            "AttachStderr": false,
            "ExposedPorts": {
                "3306/tcp": {}
            },
            "Tty": false,
--
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "3306/tcp": null
            },

使用 mariadb(即容器的主机名 运行 您的数据库)而不是 localhost

您的连接设置不太正确。你有:

connection = pymysql.connect(
                host='localhost', 
                user='root', 
                password='myodesi123', 
                port=6603)

然而,这与您在 docker-compose 文件中为 MariaDB 服务设置 dB 的方式不符。相反,它应该是:

connection = pymysql.connect(
                host='mariaDB', 
                user='root', 
                password='root', 
                port=3306)

或者,您可以使 docker-compose 与连接字符串中的设置相匹配。 (使用 root 作为密码可能不太好)。