본문 바로가기

공부기록/클라우드

Docker 공식 튜토리얼 따라해보기 (3) Multi-Conatiner _ MySQL 연결

DB를 분리해보자. MySQL을 이용할 예정.

여러 Container가 동일한 네트워크 상에 있다면, 그 container들은 서로 대화할 수 있다.

MySQL 시작하기

1. network 생성하기

생성할 네트워크의 이름은 todo-app 이다.

docker network create todo-app

2. MySQL container를 시작하고 network 에 attach

그리고 database 를 초기화할 때 사용할 환경변수 정의

docker run -d \
    --network todo-app --network-alias mysql \
    -v todo-mysql-data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=secret \
    -e MYSQL_DATABASE=todos \
    mysql:5.7

-v todo-mysql-data:/var/lib/mysql : volume을 따로 만들어주지 않아도, 해당 volume이 없으면 docker 에서 자동으로 만들어 mount 시켜준다.

 

3. database가 작동하고 있음을 확인하기

docker exec -it <mysql-container-id> mysql -p

exec : 실행중인 container에서 명령을 실행

password 로 secret 입력

database 목록 확인. (todos 데이터베이스가 있으면 잘 연결된 것이다)

mysql > SHOW DATABASES;

결과

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| todos              |
+--------------------+
5 rows in set (0.00 sec)

 

MySQL 에 연결하기

nicolaka/netshoot container (networking issue 를 해결해주는 tool들을 다수 포함) 를 활용해 같은 네트워크상의 다른 container를 찾아보자. 참고로, 각 container는 고유한 IP 주소를 갖고 있다. 

 

1. nicolaka/netshoot image를 이용해 새로운 container를 하나 만든다. 이 container 는 todo-app 네트워크에 연결된다.

docker run -it --network todo-app nicolaka/netshoot

2. container 내부에서, dig 명령어를 이용할 것이다. 

dig : 유용한 DNS 도구

hostname mysql의 IP 주소를 알아보자

dig mysql

결과

; <<>> DiG 9.14.12 <<>> mysql
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52511
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;mysql.				IN	A

;; ANSWER SECTION:
mysql.			600	IN	A	172.19.0.2

;; Query time: 6 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Sun Aug 16 10:04:16 UTC 2020
;; MSG SIZE  rcvd: 44

"ANSWER SECTION"을 보면, IP 주소가 172.19.0.2 인 것을 확인할 수 있다. mysql은 유효한 hostname이 아닌데도, 처음에 --network-alias 플래그로 해줬던 설정 덕분에 docker는 IP 를 찾을 수 있었다. 이게 무슨 뜻이냐면, 이제 app을 간단히 mysql 이란 hostname을 가진 곳에 연결해주기만 하면, database와 대화를 나눌 수 있다는 뜻이다. 더이상 간단할 수는 없다 !

 

MySQL 과 함께 App 구동하기

todo app 은 MySQL 설정을 위한 환경변수를 몇 가지 지원한다.

  • MYSQL_HOST - the hostname for the running MySQL server
  • MYSQL_USER - the username to use for the connection
  • MYSQL_PASSWORD - the password to use for the connection
  • MYSQL_DB - the database to use once connected

1. 환경변수를 포함해서 container 만들기 

docker run -dp 3000:3000 \
  -w /app -v "$(pwd):/app" \
  --network todo-app \
  -e MYSQL_HOST=mysql \
  -e MYSQL_USER=root \
  -e MYSQL_PASSWORD=secret \
  -e MYSQL_DB=todos \
  node:12-alpine \
  sh -c "yarn install && yarn run dev"

2. App 이 mysql 에 잘 연결되었는지 확인

docker logs <container-ID>

Connected to mysql db at host mysql  문구를 통해 db 가 연결되어 있음을 알 수 있다.

 

3. App 실행 후 todo 아이템 등록

4. database 에 해당 아이템들이 존재하는지 확인

docker exec -ti <mysql-container-id> mysql -p todos

결과

mysql> select * from todo_items;
+--------------------------------------+-----------------+-----------+
| id                                   | name            | completed |
+--------------------------------------+-----------------+-----------+
| 5725a240-273e-4cea-96eb-fc8d704453b7 | docker Tutorial |         0 |
| 35ea77e2-ec89-476f-a43d-453f405709da | read books      |         0 |
+--------------------------------------+-----------------+-----------+
2 rows in set (0.01 sec)

 

Recap

네트워크 생성

container 시작

환경변수 명시