2017-02-08 3 views
1

Я пытаюсь запустить 2 контейнера докеров, используя docker-compose и подключаю контейнер mysql к контейнеру приложения. Контейнер Mysql запущен, но контейнер приложения не запускается с ошибкой Ошибка: 2003: невозможно подключитесь к серверу MySQL на «127.0.0.1:3306» (111 Connection отказано) Кажется, что мой контейнер приложения пытается подключить мой mysql-узел вместо контейнера mysql.Docker скомпоновать соединение mysql

докер-compose.yml

version: '2' 
services: 
    mysql: 
    image: mysql:5.7 
    container_name: database 
    environment: 
     MYSQL_ROOT_PASSWORD: root 
     MYSQL_DATABASE: malicious 
     MYSQL_USER: root 
     MYSQL_PASSWORD: root 

    app: 
    build: . 
    restart: unless-stopped 
    volumes: 
     - .:/Docker_compose_app #app directory 
    depends_on: 
    - "mysql" 
    command: [ "python", "database_update.py"] 
    restart: unless-restart 
    environment: 
    # Environment variables to configure the app on startup. 
    MYSQL_DATABASE: malicious 
    MYSQL_HOST: database 

Dockerfile

FROM python:2.7 
ADD . /Docker_compose_app 
WORKDIR /Docker_compose_app 
RUN apt-get update 
RUN pip install --requirement requirement.txt 

Это мой database_update.py файл.

def create_TB(cursor,connection): 
     query = '''CREATE TABLE {}(malicious VARCHAR(100) NOT NULL)'''.format("url_lookup") 
     cursor.execute(query) 
     connection.commit() 

    def connection():   
    try: 
     cnx = mysql.connector.connect(user="root",password = 'root',database=malicious) 
     cursor = cnx.cursor() 
     create_TB(cursor,cnx) 

    except mysql.connector.errors.Error as err: 
     data = {"There is an issue in connection to DB":"Error: {}".format(err)} 
+0

Может быть, mysql нужно какое-то время? Попробуйте спать 10-30 секунд, прежде чем начать соединение с вашим приложением – dmitryvim

+0

, но оно не решит проблему, потому что даже после появления контейнера mysql контейнер приложения по-прежнему дает ту же ошибку. Я использовал реестр: за исключением перезапуска с приложением conatiner – guri

ответ

2

Есть две проблемы, я вижу:

  1. Попробуйте добавить

    links: 
        - mysql:mysql 
    

    app к службе в вашем Docker сочинить файле. Это позволит убедиться, что вы можете добраться до контейнера mysql от app. Он настроит сопоставление имени хоста (DNS) в вашем контейнере app, поэтому, когда вы ping mysql от app, он разрешит его на адрес IP-адреса mysql.

  2. В файле .py, где вы указываете, к какому хосту подключиться? Добавить host="mysql" в контакт connect. По умолчанию он подключится к 127.0.0.1, и это то, что вы видите.

    cnx = mysql.connector.connect(host="mysql", user="root", password = 'root', database=malicious) 
    

Закрепление оба они должны решить вашу проблему.

+0

Спасибо разрешил проблему. Но я пытаюсь понять, как мой контейнер приложений может подключать соединитель mysql без указания порта? Я имею в виду, что я не указываю порт или не открываю порт mysql. – guri

+0

Контейнер MySQL автоматически предоставляет порт 3306 (порт по умолчанию), а соединитель Python MySQL использует значение 3306 как значение по умолчанию. Если вы использовали другой порт, вы можете предоставить его с помощью дополнительного параметра 'port = XXX' в вашем вызове' connect'. – nwinkler

Смежные вопросы