출처 : https://docs.docker.com/get-started
웹 아키텍쳐에서는 여러 개의 애플리케이션이 구동되기도 한다. 특히 데이터베이스를 따로 구동하는 경우가 많다. 그렇다면 도커에서는 데이터베이스를 어디에서 구동할까? 하나의 컨테이너안에 node.js 애플리케이션과 같이 구동할까?
정답은 새로운 컨테이너에서 구동한다 이다. 보통 하나의 컨테이너에는 하나의 애플리케이션이 구동 되는 것이 좋다. 그 이유는 아래와 같다.
그렇다면 여러 개의 컨테이너를 사용하는 경우에 컨테이너간 통신은 어떻게 가능할까? 그것은 컨테이너 네트워킹으로 해결할 수 있다. MySQL을 활용하여 컨테이너간 통신을 해보자.
이전에 앞서 도커 볼륨을 생성했었다. 하지만 볼륨 이외에도 네트워크라는 도커 객체가 존재한다. 네트워크를 만들어서 각 컨테이너들을 하나의 네트워크로 묶고 컨테이너 간 통신을 할 수 있다.
우선 docker network create todo-app
명령어로 네트워크를 하나 생성해보자.
MySQL 컨테이너를 실행해보자. 이미지가 없더라도 자동으로 도커 엔진이 다운받아온다. 명령어는 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
이다.
여기서 -e 플래그는 Enviromnemt 정보를 입력하는데 MySQL의 경우에는 MYSQL_ROOT_PASSWORD, MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD 등이 있다.
이렇게 실행된 MySQL 컨테이너에 접속해서 간단한 조회를 해보자. 명령어는 docker exec -it <mysql-container-id> mysql -u root -p
이다. 비밀번호는 컨테이너 생성시 초기에 설정해두었던 secret으로 입력하면 된다.
이와 같이 데이터베이스를 todo-app 이라는 네트워크에 잘 실행했다.
예제로 사용하고 있는 node.js 애플리케이션을 실행해보자. 당연히 MySQL과 다른 컨테이너, 같은 네트워크로 실행할 것이다. 명령어는 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"
이다.
이렇게 잘 실행된 컨테이너에서 구동되는 앱으로 접속한다. 그리고 아래의 그림과 같이 Mouse라는 아이템을 Add 했다.
그리고 나서 MySQL로 다시 접속해보자. 명령어는 위와 같다.
아래와 같이 name이 Mouse인 아이템이 잘 저장된 것을 확인할 수 있다.