无法从同一 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