无法在同一个Docker容器中从Python访问MySQL数据库

时间:2018-02-19 16:33:11

标签: mysql docker docker-compose dockerfile mysql-connector

我对Docker比较新,所以请耐心等待。我有一个在同一个Docker容器中运行的Python webapp和MySQL DB。

$ 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)

非常感谢任何帮助/想法。

修改

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"

目前的代码基于这个问题:Docker Compose mysql import .sql

2 个答案:

答案 0 :(得分:1)

我认为你的MySQL服务没有运行。这就是你无法连接到MySQL的原因。

要确认这一点,您可以打开容器的终端并检查MySQL服务是否正在运行。

如果要在一个容器中运行多个服务,则需要执行一些操作。 Read here for a detail explanation

或者你可以有两个单独的容器,使用docker-compose很容易让它运行。使用以下内容创建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

答案 1 :(得分:1)

我的问题最终出现在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