프로그래밍/기타

docker mysql DB와 django 연동

김선국 강사 2022. 6. 26. 19:31
728x90

django로 간단한 서비스를 만들던 중, 로컬 mysql db가 여러군데 사용이 되고 있어서, docker로 db를 띄워 연동해보고자 한다.

 

docker-compose를 사용했고, 아래와 같이 docker-compose.yml에는 기본설정만 하여 db를 생성했다.

 

version: "3.7" # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의 ( 컴포즈에서 컨테이너 : 서비스 )
  mysql_todo: # 서비스 명
    platform: linux/x86_64
    image: mysql:5.7 # 사용할 이미지
    restart: always
    container_name: mysql_todo # 컨테이너 이름 설정
    ports:
      - "3308:3306" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)  <- 컨테이너 내부는 무조건 3306
    environment: # -e 옵션
      - MYSQL_DATABASE=todo_app #db명
      - MYSQL_ROOT_PASSWORD=test00!!  # MYSQL 패스워드 설정 옵션
      - TZ=Asia/Seoul
    volumes:
      - /Users/사용자명/data/mysql-test:/var/lib/mysql # -v 옵션 (다렉토리 마운트 설정)

 

django로 프로젝트 생성 후 settings.py 에는 아래와 같이 databases를 설정하였다.

 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'todo_app',
	    'USER': 'root',
	    'PASSWORD': 'test00!!',
	    'HOST': 'localhost', 
	    'POST': '3308',
    }
}

 

결론부터 말하면 POST가 오타여서 PORT로 바꿔주면 접속이 잘 된다.

 

그러나, 나는 오타가 있었으므로, 그 과정에서 알게 된것을 추가적으로 정리해보겠다.

 

오타있는 상태로 설정후 python manage.py migrate 명령어를 시도 했더니, 아래와 같은 정체불명의 에러가 발생.

 

django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'172.19.0.1' (using password: YES)")

 

먼저 계정에 대해 의심했다. 일단 root 계정에 대한 권한을 확인하러 docker컨테이너로 접속했다.

 

1.도커컨테이너접속 : docker exec -it 도커컨테이너id bash

2.db접속 : mysql -u root -p

3.사용자조회

use mysql;

select host, user from user;

mysql> select host, user from user;
+-----------+---------------+
| host      | user          |
+-----------+---------------+
| %         | root          |
| localhost | mysql.session |
| localhost | mysql.sys     |
| localhost | root          |
+-----------+---------------+
4 rows in set (0.01 sec)

root계정은 localhost와 %를 통해 모든 host로부터의 접근을 허용하고 있다. 

 

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; 이걸 해보았으나, 여전히 접속이 안되길래,

 

show grants for root@'localhost';  를 통해 권한도 확인해보니, 애초에 처음 db생성시부터 해당 권한이 들어가 있었던것 같다.

 

계정에 문제가 없는 것을 보고, 에러에서 찍힌 172.19.0.1  이것을 의심했다.

 

그래서 도커 컨테이너에 들어가서, hostname -i 명령어를 쳐 보았더니,(또 다른 방법 docker inspect 컨테이너id)

 

ip가 172.27.0.2가 찍혀 있는게 아닌가? 어떻게 된일이지? 이것을 통해 뭔가 ip/port가 잘못됐음을 인지하여 오타를 수정하게 됐다.

 

도커는 컨테이너를 생성할때 고유의 내부 ip를 할당하고, 우리가 서비스를 통해 localhost:port로 입력하여 접속하게 되면 내부적으로는 port와 매핑된 도커고유의 ip를 찾아서 접속을 하게 된다는 것을 알게 되었다. 

 

 

 

728x90

'프로그래밍 > 기타' 카테고리의 다른 글

C언어 포인터와 call by reference  (0) 2022.02.13
파이썬의 함수, 클래스, 인스턴스  (0) 2022.01.22