컨테이너간 통신

고재석·2021년 5월 31일
0

출처 : https://docs.docker.com/get-started

여러 개의 컨테이너를 사용하는 이유


웹 아키텍쳐에서는 여러 개의 애플리케이션이 구동되기도 한다. 특히 데이터베이스를 따로 구동하는 경우가 많다. 그렇다면 도커에서는 데이터베이스를 어디에서 구동할까? 하나의 컨테이너안에 node.js 애플리케이션과 같이 구동할까?

정답은 새로운 컨테이너에서 구동한다 이다. 보통 하나의 컨테이너에는 하나의 애플리케이션이 구동 되는 것이 좋다. 그 이유는 아래와 같다.

  1. 데이터베이스와는 달리 프론트 엔드나 API 서버는 변동사항이 발생하는 경우가 많다.
  2. 분리된 컨테이너는 분리된 버전 관리가 가능하다.
  3. 데이터베이스가 실행되고 있는 컨테이너에는 따로 데이터베이스 관리 서비스를 실행할 수 있다.
  4. 한 컨테이너에는 한 프로세스만 동작하는데, 여러 프로세스가 동작하면 복잡도가 증가한다.

그렇다면 여러 개의 컨테이너를 사용하는 경우에 컨테이너간 통신은 어떻게 가능할까? 그것은 컨테이너 네트워킹으로 해결할 수 있다. MySQL을 활용하여 컨테이너간 통신을 해보자.


컨테이너 통신 해보기

네트워크 생성

이전에 앞서 도커 볼륨을 생성했었다. 하지만 볼륨 이외에도 네트워크라는 도커 객체가 존재한다. 네트워크를 만들어서 각 컨테이너들을 하나의 네트워크로 묶고 컨테이너 간 통신을 할 수 있다.

우선 docker network create todo-app 명령어로 네트워크를 하나 생성해보자.

MySQL 컨테이너 실행

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 앱 실행

예제로 사용하고 있는 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인 아이템이 잘 저장된 것을 확인할 수 있다.

profile
명확하게 말하고, 꼼꼼하게 개발하자

0개의 댓글