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 시작
환경변수 명시
'공부기록 > 클라우드' 카테고리의 다른 글
Docker 공식 튜토리얼 따라해보기(2) Volume 에 대하여 (0) | 2020.08.15 |
---|---|
Docker 공식 튜토리얼 따라해보기(1) image build, app update (0) | 2020.08.13 |