代码之家  ›  专栏  ›  技术社区  ›  GuyIncognito23

无法在同一Docker容器中从Python访问MySQL DB

  •  2
  • GuyIncognito23  · 技术社区  · 8 年前

    我对Docker还比较陌生,所以请容忍我。我有一个Python webapp和一个MySQL DB在同一个Docker容器中运行。

    $ 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的一个片段,它应该连接到DB:

    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 回复  |  直到 8 年前
        1
  •  1
  •   lloiacono Suresh Kumar Amrani    8 年前

    我认为您的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\u应用程序创建Dockerfile,并将其放置在与docker compose相同的级别。yml。有关如何使用docker compose运行flask的详细说明 check here

    编辑

    我现在向docker compose添加了一个卷。yml公司 - ./data/db:/docker-entrypoint-initdb.d . 将转储放在此文件夹下:/数据/数据库,在主机中。

    例如:

    |- docker-compose.yml
    |- Dockerfile
    |- data/
    |-     db/
    |-        dump.sql
    
        2
  •  1
  •   GuyIncognito23    8 年前

    我的问题最终在于API本身。生产线 d_host='127.0.0.1' 应该是 d_host='mysql' .

    现在可以了。为子孙后代着想,以下是基于略亚科诺帮助的其他修订文件。我选择了正确的答案,因为如果没有他们的帮助,我将无法进入这个阶段! 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