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를 찾아서 접속을 하게 된다는 것을 알게 되었다.
'프로그래밍 > 기타' 카테고리의 다른 글
C언어 포인터와 call by reference (0) | 2022.02.13 |
---|---|
파이썬의 함수, 클래스, 인스턴스 (0) | 2022.01.22 |