如何使用 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 作为密码可能不太好)。
我正在使用 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 作为密码可能不太好)。