django가 도커에서 mysql을 연결할 수 없습니다.
저는 도커에 매우 익숙하지 않습니다.도커에서 mariadb를 사용하여 django를 docker-compose에서 실행하려고 하는데 항상 다음 오류가 발생합니다.
사용하고 있다Docker version 17.09.1-ce, build 19e2cf6,docker-compose version 1.18.0, build 8dd22a9
django.db.db.ss.Operation Error: (2003, 'mariadb55\'에서 MySQL 서버에 접속할 수 없습니다'(111 "접속 거부")
실행 후 DB를 올바르게 연결할 수 있습니다.docker-compose up db로컬이든 리모트든 상관없이python manage.py runserver 0.0.0.0:6001접속할 수 있도록 아나콘다 가상 환경에서 올바르게 설정dbsettings.py 파일의 파라미터를 다음과 같이 설정하여 도커에서 서비스를 제공합니다.
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
내가 찾을 수 있는 건 다 해봤는데 아직도 모르겠어. 어떤 도움이라도 주면 좋을 텐데!
내가 시도한 것:
docker-compose를 사용한django 및 mysql 컨테이너 링크
드디어 알아냈어!요점은 @Sangmin Kim이 말했듯이3306것은 아니다.3302에settings.py, 및 사용db~하듯이HOST것은 아니다.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
이 Docker-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)
덧붙여서, 이것은 빌드용 Docker 파일입니다.django-py35:
FROM python:3.5-alpine
MAINTAINER Xin Xiong "xiongxin20008@126.com"
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 를 참조해 주세요.
로컬 호스트(또는 127.0.0.1) 대신 컨테이너 이름을 사용해야 합니다.settings.py파일. 컨테이너 이름을 입력해 보십시오.db의 서비스docker-compose.yml파일을 작성하다container_nameAtribute 및 치환된 호스트 이름settings.py의 가치로container_name(도커가 작성하는 네트워크와 같은 네트워크상에 있는 것을 확인해 주세요).
다음을 사용하여 컨테이너 빌드:
docker run --name mysql-latest \
-p 3306:3306 -p 33060:33060 \
-e MYSQL_ROOT_HOST='%' -e MYSQL_ROOT_PASSWORD='strongpassword' \
-d mysql/mysql-server:latest
확인하다MYSQL_ROOT_HOST='%'즉, 루트는 임의의 IP에서 접속할 수 있습니다.
언급URL : https://stackoverflow.com/questions/47979270/django-cannot-connect-mysql-in-docker-compose
'source' 카테고리의 다른 글
| 느린 쿼리 로그(MariaDB)에 시간이 많이 걸린다 (0) | 2022.11.02 |
|---|---|
| 목록에서 첫 번째 항목을 제거하려면 어떻게 해야 합니까? (0) | 2022.11.02 |
| MariaDB 연결 상태 확인(python) (0) | 2022.11.02 |
| .java 파일에서 JAR을 만들려면 어떻게 해야 하나요? (0) | 2022.11.02 |
| dict 리터럴을 사용하는 것과 dict 컨스트럭터를 사용하는 것에는 차이가 있습니까? (0) | 2022.11.02 |