2016-07-20 16 views
2

dockerを使用してDjango開発環境を設定しようとしています。ホストマシン上のmysqlに接続することはできますが。Django Dockerコンテナがmysqlコンテナに接続できませんでした。 "db '(111)のMySQLサーバに接続できません")

---------ドッキングウィンドウ-compose.yml--:以下

django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on 'db' (111)") 

がドッキングウィンドウの設定とDjango設定されている。しかし、Webコンテナは、次のエラーでのMySQLの容器への接続に失敗しました-------

version: '2' 
services: 
    web: 
    build: . 
    volumes: 
    - ".:/code/current" 
    ports: 
    - "8000:8000" 
    depends_on: 
    - db 
    - redis 
    links: 
    - db 
    - redis 
    command: ./manage.py runserver 0.0.0.0:8000 

db: 
    image: mysql:5.7 
    volumes: 
    - "./.data/db:/var/lib/mysql" 
    environment: 
    - MYSQL_ROOT_PASSWORD=root 
    - MYSQL_DATABASE=goat_db 
    restart: always 
    ports: 
    - "3306:3306" 

のRedis: 再起動:常に 画像:Redisの:最新 ポート: - "6379:6379"

-------------- Dockerfileウェブ画像について----------------------

FROM ubuntu:14.04 
MAINTAINER Alice 
RUN apt-get update 
RUN apt-get install -y tar git curl wget emacs build-essential python python-dev python-distribute python-pip libpcre3 libpcre3-dev libmysqlclient-dev python-m2crypto openssl libssl-dev swig freetds-dev python-pymssql nginx subversion 
RUN mkdir -p var/www/goat.garenanow.com/current/log 
WORKDIR /var/www/goat.garenanow.com/current 
ADD requirements.txt /var/www/goat.garenanow.com/current 
RUN pip install -r requirements.txt 
ADD . /var/www/goat.garenanow.com/current 
EXPOSE 8000 

- ----- djangoデータベース設定---

DATABASES = { 
'default': { 
    'ENGINE': 'django.db.backends.mysql', 
    'NAME': 'goat_db', 
    'USER': 'root', 
    'PASSWORD': 'root', 
    'HOST': 'db', 
    'PORT': '3306', 
}, 

答えて

0

dbサービスのmy.cnfファイルはどのようなものですか?

bind-addressの値を確認し、許可がWebコンテナからの接続に間違いないことを確認してください。

テストするには、docker exec ...をウェブコンテナに入れ、そこからdbホストに接続しようとしてください。

+0

のようなものを持っているように、あなたのdevの環境ドッキングウィンドウ-compose.ymlでWebコンテナを設定します一晩中それはちょうど動作します(何が起こったか?) – sinsin

+0

ダンノ - 港の衝突があり、他のいくつかのサービスが停止したことがありますか?またはマシンが再起動しましたか? – ldg

+0

はい、ドッカーが問題を解決するために再起動することが判明しました... – sinsin

0

Djangoはデータベースに接続しようとするとMySQLの準備ができていない場合、あなたはおそらく、このエラーが表示されます。

django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on 'db' (111)") 

この場合の解決策は準備ができてDBサーバを待ちですWebサーバーを実行する前に

どうすればいいですか?

Webサーバーを直接実行するのではなく、dbサーバーの準備ができるまで待機するスクリプトを作成して実行します。その後、スクリプトはWebサーバーを実行します。


ドッキングウィンドウ-compose.ymlファイル(私たちはウェブ上書きしたときに関連する部分がある:commandディレクティブを、我々はスクリプトを実行する代わりに、すぐにWebサーバーを実行します)。

version: '3' 
services:  
    db: 
    restart: always 
    image: mysql:5.7 
    container_name: my_db 
    env_file: env_db 
    ports: 
     - "3306:3306" 

    web: 
    restart: always 
    build: ./web 
    env_file: env_web 
    command: ./wait_for_db_and_start_server.sh 
    ports: 
     - "8000:8000" 
    depends_on: 
     - db 

env_webファイル(関連部分はSTART_CMD変数です)。今

# Add Environment Variables 
DB_NAME=docker 
DB_USER=docker_user 
DB_PASS=docker_password 
DB_SERVICE=db 
DB_HOST=db 
DB_PORT=3306 
START_CMD=python manage.py runserver 0.0.0.0:8000 

、当社のウェブDockerfile(私たちはwait_for_db_and_start_server.shを追加するときに、関連する部分があります)。

FROM python:2.7 

ADD wait_for_db_and_start_server.sh . 

ADD requirements.txt . 
RUN pip install -r requirements.txt 

ADD . . 

wait_for_db_and_start_server.shファイル。 (基本的に、env_webファイルに定義された$DB_HOST$DB_PORTのdbサーバーに接続できませんが、3秒待ってからM_LOOPS回再試行します。サーバーに接続できる場合は、$START_CMD当社env_webファイルで定義されている。)

#!/bin/sh 
# Wait for database to get available 

M_LOOPS="10" 

#wait for mysql 
i=0 
# http://stackoverflow.com/a/19956266/4848859 
while ! curl $DB_HOST:$DB_PORT >/dev/null 2>&1 < /dev/null; do 
    i=`expr $i + 1` 

    if [ $i -ge $M_LOOPS ]; then 
    echo "$(date) - ${DB_HOST}:${DB_PORT} still not reachable, giving up" 
    exit 1 
    fi 

    echo "$(date) - waiting for ${DB_HOST}:${DB_PORT}..." 
    sleep 3 
done 

echo "$(date) - ${DB_HOST}:${DB_PORT} Reachable ! - Starting Daemon" 
#start the daemon 
exec $START_CMD 
+0

あなたはコマンドがほとんど動作します。 Webコンテナやサービスからdbコンテナにpingできますが、繰り返して '..! - デーモンを起動して ""、それ以上実行しませんでした。 –

0

あなたは「シン」あなたのWebコンテナを維持しようとしている場合は、あなたのデシベルの準備ができている場合は、単に確認するために、MySQLやPostgresのクライアントパッケージを追加したくない場合があります。そこにある一般的な待機スクリプトには、クライアントの依存関係があります。

DBが機能しているかどうかを確認するためのネイティブコールを作成する単純なPythonスクリプトを作成しました。この場合、有効な資格情報を追加することを避け、単に認証失敗メッセージを探します。ここでの例はPostgres用ですが、MySQLには容易に適合させるべきです。

wait_for_db.py

import psycopg2.extras 
from time import sleep 

connect_str = "dbname='postgres' user='nobody' host='db' " + \ 
       "password='foobar'" 

while True: 
    try: 
     conn = psycopg2.connect(connect_str) 
    except psycopg2.OperationalError as e: 
     if "authentication failed" in e.args[0]: 
      print("Postgres is ready. Launching site.") 
      break 
     else: 
      print("Waiting for postgres...", e.args[0]) 
      sleep(1) 

次にあなたがいずれかの実行中のコンテナを去った後

command: bash -c "python wait-for-postgres.py; python manage.py runserver 0.0.0.0:8000" 
関連する問題