私はdockerを初めて使用します。現在、docker-composeを介してdockerでmariadbを使用してdjangoを実行しようとしていますが、常に次のエラーが発生します。
私は使用しますDocker version 17.09.1-ce, build 19e2cf6
、docker-compose version 1.18.0, build 8dd22a9
django.db.utils.OperationalError:(2003、 'Ca n \' t connect to MySQL server on \ 'mariadb55 \'(111 "Connection refused") ')
docker-compose up db
ローカルまたはリモートで実行した後、dbに正しく接続できます。また、以下のようにsettings.pyファイルのパラメーターを設定するpython manage.py runserver 0.0.0.0:6001
ことで、anaconda仮想環境で正しく実行してdockerでdb
サービスに接続することもできます。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'belter',
# 'HOST': 'mariadb55',
'HOST': '127.0.0.1',
'PORT': '3302',
'PASSWORD': 'belter_2017',
'default-character-set': 'utf8',
'OPTIONS': {
'sql_mode': 'traditional',
}
}
}
これは私のdocker-compose.ymlファイルです
version: '3'
services:
db:
image: mariadb:5.5
restart: always
environment:
- MYSQL_HOST=localhost
- MYSQL_PORT=3306
- MYSQL_ROOT_HOST=%
- MYSQL_DATABASE=test
- MYSQL_USER=belter
- MYSQL_PASSWORD=belter_2017
- MYSQL_ROOT_PASSWORD=123456_abc
volumes:
- /home/belter/mdbdata/mdb55:/var/lib/mysql
ports:
- "3302:3306"
web:
image: onlybelter/django_py35
command: python3 manage.py runserver 0.0.0.0:6001
volumes:
- /mnt/data/www/mysite:/djcode
ports:
- "6001:6001"
depends_on:
- db
links:
- db:mariadb55
私は見つけることができるすべてをほとんど試しましたが、それでもそれを理解することはできません、どんな助けもいいでしょう!
私が試したこと:
最後に、私はそれを理解しました!重要な点は、@ SangminKimが言ったように、3306
not 3302
insettings.py
を使用しdb
、HOST
notとして使用する必要があるということ127.0.0.1
です。
これが私のdocker-compose.ymlファイルです。
version: '3'
services:
db:
image: mariadb:5.5
restart: always
environment:
- MYSQL_HOST=localhost
- MYSQL_PORT=3306 # cannot change this port to other number
- MYSQL_ROOT_HOST=%
- MYSQL_DATABASE=test
- MYSQL_USER=belter
- MYSQL_PASSWORD=belter_2017
- MYSQL_ROOT_PASSWORD=123456_abc
volumes:
- /home/belter/mdbdata/mdb55:/var/lib/mysql
ports:
- "3302:3306"
web:
image: onlybelter/django_py35
command: python3 manage.py runserver 0.0.0.0:6001
volumes:
- .:/djcode
ports:
- "6001:6001"
depends_on:
- db
だから今、私たちは、この接続できるドッキングウィンドウ-mysqlのことでmysql -h 127.0.0.1 -P 3302 -u root -p
、直接シェルでは、私たちが使用する必要がありますdb
し、3306
ジャンゴでのsettings.py
ファイル:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'belter',
# 'HOST': 'mariadb55',
'HOST': 'db', #<---
'PORT': '3306', #<---
'PASSWORD': 'belter_2017',
'default-character-set': 'utf8',
'OPTIONS': {
'sql_mode': 'traditional',
}
}
}
また、docker-compose.yml
ファイルで追加のコマンドを実行することで、このポートが開いているかどうかを確認できます。
...
web:
image: onlybelter/django_py35
command: /bin/sh -c "python check_db.py --service-name mysql --ip db --port 3306"
volumes:
- .:/djcode
...
これがcheck_db.pyファイルです:
# check_db.py
import socket
import time
import argparse
""" Check if port is open, avoid docker-compose race condition """
parser = argparse.ArgumentParser(description='Check if port is open, avoid\
docker-compose race condition')
parser.add_argument('--service-name', required=True)
parser.add_argument('--ip', required=True)
parser.add_argument('--port', required=True)
args = parser.parse_args()
# Get arguments
service_name = str(args.service_name)
port = int(args.port)
ip = str(args.ip)
# Infinite loop
while True:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex((ip, port))
if result == 0:
print("{0} port is open! Bye!".format(service_name))
break
else:
print("{0} port is not open! I'll check it soon!".format(service_name))
time.sleep(3)
ちなみに、これはビルド用の私のDockerfileですdjango-py35
:
FROM python:3.5-alpine
MAINTAINER Xin Xiong "[email protected]"
ENV PYTHONUNBUFFERED 1
RUN set -e; \
apk add --no-cache --virtual .build-deps \
gcc \
libc-dev \
linux-headers \
mariadb-dev \
python3-dev \
postgresql-dev \
freetype-dev \
libpng-dev \
g++ \
;
RUN mkdir /djcode
WORKDIR /djcode
ENV REFRESHED_AT 2017-12-25
ADD requirements.txt /djcode/
RUN pip install --no-cache-dir -r /djcode/requirements.txt
RUN pip install uwsgi
ADD . /djcode/ # copy . to /djcode/
EXPOSE 6001
詳細については、https://github.com/OnlyBelter/django-composeをご覧ください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加