无法从同一 Docker 容器中的 Python 访问 MySQL 数据库
Can't access a MySQL DB from Python within the same Docker container
我对 Docker 比较陌生,所以请多多包涵。我在同一个 Docker 容器中有一个 Python webapp 和一个 MySQL 数据库 运行。
$ vi Dockerfile
FROM mysql
ENV MYSQL_HOST=127.0.0.1 \
MYSQL_ROOT_PASSWORD=pass
ADD testDB.sql /docker-entrypoint-initdb.d
EXPOSE 3306
FROM python:3.4
RUN pip install Flask
RUN pip install flask_cors
RUN pip install mysql-connector==2.1.6
COPY . /app
WORKDIR /app
ENTRYPOINT ["python"]
CMD ["Api.py"]
这是 API 中的一个片段,它应该连接到数据库:
d_host='127.0.0.1'
d_user='root'
d_password='pass'
d_database='testDB'
@webapp.route('/testGet')
def testGet():
import mysql.connector
conn = mysql.connector.connect(host=d_host,
user=d_user,
password=d_password,
database=d_database, )
cursor = conn.cursor()
SQL = """SELECT text FROM testing ORDER BY testID DESC LIMIT 1;"""
cursor.execute( SQL )
c = cursor.fetchone()
conn.commit()
cursor.close()
conn.close()
return c[0]
但是,我不断收到以下错误:
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on '127.0.0.1:3306' (111 Connection refused)
非常感谢任何 help/ideas。
编辑
MySQL 不是 运行。现在是 运行,但我仍然遇到同样的错误。此外,我的 .sql 转储文件未被导入。更新后的代码:
$ vi Dockerfile:
FROM mysql
ADD dump.sql /docker-entrypoint-initdb.d
FROM python:3.4
RUN pip install Flask
RUN pip install flask_cors
RUN pip install mysql-connector==2.1.6
COPY . /app
WORKDIR /app
ENTRYPOINT ["python"]
CMD ["Api.py"]
我觉得我应该在这个文件中导入 MySQL:
$ vi docker-compose.yml
version: '2.1'
services:
web:
build: .
ports:
- "5000:5000"
links:
- mysql
container_name: flask_app
mysql:
image: mysql
container_name: db
environment:
- MYSQL_ROOT_PASSWORD=root
ports:
- "3306:3306"
当前代码基于这个问题:
我认为您的 MySQL 服务不 运行ning。这就是您无法连接到 MySQL 的原因。
要确认这一点,您可以打开容器的终端并检查 MySQL 服务是否 运行ning。
如果您想 运行 在一个容器中提供多项服务,您需要做一些事情。 Read here for a detail explanation.
或者你可以有两个单独的容器,使用 docker-compose 很容易得到这个 运行ning。使用以下内容创建一个 docker-compose.yml 文件:
version: '3'
services:
main:
image: mysql
container_name: db
environment:
- MYSQL_DATABASE=db_name
- MYSQL_ROOT_PASSWORD=root
- MYSQL_USER=user
- MYSQL_PASSWORD=pass
volumes:
- ./data/db:/docker-entrypoint-initdb.d # here you can import your dump
ports:
- "3306:3306"
flask:
build: .
container_name: flask_app
然后为您的 flask_app 创建一个 Dockerfile 并将其放置在与您的 docker-compose.yml 相同的级别。有关如何 运行 烧瓶与 docker-compose check here
的更详细说明
编辑
我现在向 docker-compose.yml - ./data/db:/docker-entrypoint-initdb.d
添加了一个卷。将您的转储放在此文件夹下:./data/db,在您的主机中。
例如:
|- docker-compose.yml
|- Dockerfile
|- data/
|- db/
|- dump.sql
我的问题最终出在 API 本身。该行 d_host='127.0.0.1'
应该是 d_host='mysql'
.
现在可以了。对于后代,这里是基于 lloiacono 帮助的其他修改文件。我选择了他们的答案作为正确的答案,因为没有他们的帮助我不会走到这个阶段! Dockerfile
:
FROM python:3.4
RUN pip3 install Flask
RUN pip3 install flask_cors
RUN pip3 install mysql-connector-python
COPY . /app
WORKDIR /app
ENTRYPOINT ["python"]
CMD ["api.py"]
和docker-compose.yml
:
version: '3'
services:
mysql:
image: mysql
container_name: db
environment:
- MYSQL_ROOT_PASSWORD=root
volumes:
- ./data/db:/docker-entrypoint-initdb.d
ports:
- "3306:3306"
web:
build: .
ports:
- "5000:5000"
container_name: flask_app
我对 Docker 比较陌生,所以请多多包涵。我在同一个 Docker 容器中有一个 Python webapp 和一个 MySQL 数据库 运行。
$ vi Dockerfile
FROM mysql
ENV MYSQL_HOST=127.0.0.1 \
MYSQL_ROOT_PASSWORD=pass
ADD testDB.sql /docker-entrypoint-initdb.d
EXPOSE 3306
FROM python:3.4
RUN pip install Flask
RUN pip install flask_cors
RUN pip install mysql-connector==2.1.6
COPY . /app
WORKDIR /app
ENTRYPOINT ["python"]
CMD ["Api.py"]
这是 API 中的一个片段,它应该连接到数据库:
d_host='127.0.0.1'
d_user='root'
d_password='pass'
d_database='testDB'
@webapp.route('/testGet')
def testGet():
import mysql.connector
conn = mysql.connector.connect(host=d_host,
user=d_user,
password=d_password,
database=d_database, )
cursor = conn.cursor()
SQL = """SELECT text FROM testing ORDER BY testID DESC LIMIT 1;"""
cursor.execute( SQL )
c = cursor.fetchone()
conn.commit()
cursor.close()
conn.close()
return c[0]
但是,我不断收到以下错误:
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on '127.0.0.1:3306' (111 Connection refused)
非常感谢任何 help/ideas。
编辑
MySQL 不是 运行。现在是 运行,但我仍然遇到同样的错误。此外,我的 .sql 转储文件未被导入。更新后的代码:
$ vi Dockerfile:
FROM mysql
ADD dump.sql /docker-entrypoint-initdb.d
FROM python:3.4
RUN pip install Flask
RUN pip install flask_cors
RUN pip install mysql-connector==2.1.6
COPY . /app
WORKDIR /app
ENTRYPOINT ["python"]
CMD ["Api.py"]
我觉得我应该在这个文件中导入 MySQL:
$ vi docker-compose.yml
version: '2.1'
services:
web:
build: .
ports:
- "5000:5000"
links:
- mysql
container_name: flask_app
mysql:
image: mysql
container_name: db
environment:
- MYSQL_ROOT_PASSWORD=root
ports:
- "3306:3306"
当前代码基于这个问题:
我认为您的 MySQL 服务不 运行ning。这就是您无法连接到 MySQL 的原因。
要确认这一点,您可以打开容器的终端并检查 MySQL 服务是否 运行ning。
如果您想 运行 在一个容器中提供多项服务,您需要做一些事情。 Read here for a detail explanation.
或者你可以有两个单独的容器,使用 docker-compose 很容易得到这个 运行ning。使用以下内容创建一个 docker-compose.yml 文件:
version: '3'
services:
main:
image: mysql
container_name: db
environment:
- MYSQL_DATABASE=db_name
- MYSQL_ROOT_PASSWORD=root
- MYSQL_USER=user
- MYSQL_PASSWORD=pass
volumes:
- ./data/db:/docker-entrypoint-initdb.d # here you can import your dump
ports:
- "3306:3306"
flask:
build: .
container_name: flask_app
然后为您的 flask_app 创建一个 Dockerfile 并将其放置在与您的 docker-compose.yml 相同的级别。有关如何 运行 烧瓶与 docker-compose check here
的更详细说明编辑
我现在向 docker-compose.yml - ./data/db:/docker-entrypoint-initdb.d
添加了一个卷。将您的转储放在此文件夹下:./data/db,在您的主机中。
例如:
|- docker-compose.yml
|- Dockerfile
|- data/
|- db/
|- dump.sql
我的问题最终出在 API 本身。该行 d_host='127.0.0.1'
应该是 d_host='mysql'
.
现在可以了。对于后代,这里是基于 lloiacono 帮助的其他修改文件。我选择了他们的答案作为正确的答案,因为没有他们的帮助我不会走到这个阶段! Dockerfile
:
FROM python:3.4
RUN pip3 install Flask
RUN pip3 install flask_cors
RUN pip3 install mysql-connector-python
COPY . /app
WORKDIR /app
ENTRYPOINT ["python"]
CMD ["api.py"]
和docker-compose.yml
:
version: '3'
services:
mysql:
image: mysql
container_name: db
environment:
- MYSQL_ROOT_PASSWORD=root
volumes:
- ./data/db:/docker-entrypoint-initdb.d
ports:
- "3306:3306"
web:
build: .
ports:
- "5000:5000"
container_name: flask_app