2017-02-08 121 views
1

我想運行2個碼頭容器使用docker-compose並將mysql容器連接到應用程序container.Mysql容器正在運行,但應用容器未能以錯誤啓動錯誤:2003:Can not連接到'127.0.0.1:3306'(111連接被拒絕)上的MySQL服務器 好像我的應用程序容器正試圖連接我的主機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容器啓動後,應用程序容器仍然會給出相同的錯誤。我使用了restrat:除非 - 使用應用程序容器重新啓動 – guri

回答

2

有兩個問題,我可以看到:

  1. 嘗試

    links: 
        - mysql:mysql 
    

    添加到app服務在您的碼頭工人撰寫的文件。這將確保您可以從app到達mysql容器。它會在您的app容器中設置一個主機名映射(DNS),因此當您從appping mysql時,它會將其解析爲mysql容器的IP地址。

  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作爲默認值。如果你使用了不同的端口,你可以在'connect'調用中使用額外的'port = XXX'參數來提供它。 – nwinkler