mysql 이미지를 docker-compose.yml을 이용해 컨테이너로 띄우고,
Host 컴퓨터에서 컨테이너 mysql에 접속하는 방법에 대해 정리하고자 합니다.
docker-compose로 Mysql Image 띄우기
저는 frontend, backend 서비스를 mysql 이미지와 함께 띄울 예정이었기에, docker-compose.yml 파일을 이용하기로 결정했습니다.
제 docker-compose.yml 파일은 아래와 같습니다.
패스워드와 데이터베이스명은 직접 입력해주시면 되겠습니다.
version: '3.8'
services:
frontend:
# ...
backend:
# ...
db:
image: mysql:8.1.0
volumes:
- mysql-data:/var/lib/mysql
ports:
- 3307:3306
environment:
MYSQL_ROOT_PASSWORD: [MYSQL_PASSWORD]
MYSQL_DATABASE: [DATABASE_NAME]
volumes:
mysql-data:
간단히 설명하자면, mysql:8.1.0 이라는 이미지를 docker-hub에서 받아와서 컨테이너로 띄우게 됩니다.
조금 주의해서 볼 점은 port 부분입니다.
1. docker-compose port 설정
저는 이미 제 로컬 컴퓨터에 mysql을 설치하고 이용하고 있기에 mysql 기본 포트인 3306번은 사용하고 있었습니다.
따라서 docker-compose.yml 에서 컨테이너 내부 포트 3306을 호스트 외부 포트 3307로 포워딩 해주었습니다.
ports
- [HOST 외부포트]:[컨테이너 내부포트]
2. docker-compose 컨테이너
docker-compose up -d 명령어를 통해 yml파일에 제가 설정한 서비스들을 컨테이너로 띄워줍니다.
docker-compose up -d
참고로 위의 -d 옵션은 Detached 모드로 컨테이너를 실행 시킨다는 것을 의미합니다.
Detached 모드는 말그대로 터미널에서 떼어내서 백그라운드로 컨테이너를 실행시키는 것을 의미합니다.
3. docker container 확인
docker ps 명령어를 통해 컨테이너가 정상적으로 떠있는지 확인해봤습니다.
docker ps // 구동중인 docker container 확인
정상적으로 떠있고, 3306 포트가 3307로 포워딩 되고 있는 부분도 확인할 수 있습니다.
docker-compose로 Mysql Image 띄우기
정상적으로 컨테이너가 올라간 것을 확인 했으니, 컨테이너 내부로 들어가서 확인하고 Host 컴퓨터에서도 확인해 봅시다.
1. docker container 접속
컨테이너 내부는 exec 명령어를 통해 접속할 수 있습니다. (공식문서 참고자료)
docker exec -it [container Id] [shell]
//example -> docker exec -it ffdf0dd7a319 /bin/sh
-it 옵션을 통해, container 내부에 접속해서 우리가 여러가지 input을 입력하고 output을 볼 수 있습니다. (즉, interactive 하게 도와줍니다.)
2. docker container mysql 접속
컨테이너 내부에서 mysql -u root -p 명령어를 통해 mysql에 접속해 port를 확인해 봤습니다.
우리가 예상한 대로 mysql 기본 포트인 3306인 것을 확인 할 수 있었습니다.
3. host에서 docker mysql 접속하기 (feat. port 지정)
포트 지정은 -P 옵션을 통해 쉽게 할 수 있습니다.
mysql -u root -p -P 3307
사실, host 컴퓨터에서 기존에 3306 port를 사용하지 않는다면 큰 문제가 없겠지만, 전 사용하고 있기에 3307번으로 포워딩 해줬습니다.
하지만 단순하게 -P 옵션으로 port를 지정해준다고 하더라도 컨테이너 쪽 mysql 에 접속할 수 없습니다.
정확히 말하면, 우리가 원하는 포트가 아니라 3306 기본 포트로만 접속되게 됩니다.
그 이유는 mysql에서 hostname을 명시하지 않거나 localhost로 지정해서 접속하게 되면, 조금은 특별한 방식으로 처리되기 때문입니다.
자세한 내용은 mysql 공식문서, stackoverflow 답변 을 참조하시면 되지만,
요약하자면 localhost에 대한 연결의 경우 MySQL 프로그램은 유닉스 소켓 파일을 사용하여 로컬 서버에 연결을 시도합니다.
즉, 우리가 원하는 대로 127.0.0.1에 TCP/IP로 연결하는 것이 아니라는 뜻입니다.
이를 해결하고자 한다면 2가지 방법이 있습니다.
1. mysql hostname 지정
호스트는 따로 지정하지 않으면 localhost이며, 이렇게 되면 유닉스 소켓파일을 사용하여 연결시도를 한다고 했습니다.
바꿔 말하면 127.0.0.1 과 같이 지정 해 준다면, 우리가 원하는 TCP 방식으로 연결을 한다는 뜻입니다.
mysql -h 127.0.0.1 -u root -p -P 3307
이제 정상적으로 컨테이너 내부의 mysql에 접속이 되고, 제가 지정한 database명인 HABITS가 있는 것을 확인 할 수 있습니다.
2. mysql 통신 방식 지정
다른 방법으로는 TCP 방식으로 통신하도록 지정 할 수도 있습니다.
mysql -u root -p -P 3307 --protocol=TCP
역시나 제가 생성한 데이터베이스 HABITS가 있는 것을 확인 하실 수 있습니다.
(실제 호스트 컴퓨터에 mysql에는 훨씬 많은 DB가 있습니다.)
여기까지 docker-compose.yml 파일로 mysql 컨테이너를 띄우고 접속하는 방법까지 정리 해 봤습니다.
궁금한 점이 있거나 잘못된 사항이 있다면 언제든지 알려주세요!
'Docker' 카테고리의 다른 글
[Docker] 컨테이너 빌드 시 prisma migrate하기 (0) | 2023.10.11 |
---|---|
[Docker]docker-compose로 db, 백엔드 컨테이너 연결 (1) | 2023.10.10 |
[Solved] docker container에서 local db 접속하기 (host.docker.internal) (1) | 2022.10.29 |
[Docker] Docker 설치하기 (특정 버전 docker 설치) (1) | 2022.10.07 |
[Docker - 3] Dockerfile 작성법 (with example) (1) | 2022.09.24 |