본문 바로가기
Data-driven Methodology/Data Engineering

[Data Engineering] 다중 컨테이너 앱

by goatlab 2024. 1. 23.
728x90
반응형
SMALL

다중 컨테이너 앱

 

어플리케이션 스택에 MySQL을 추가하게 된다. 여기서 MySQL은 어디에서 실행되는지, 동일한 컨테이너에 설치하거나 별도로 실행하는지의 의문이 생긴다. 일반적으로 각 컨테이너는 한 가지 일을 잘 수행해야 한다. 컨테이너를 별도로 실행하는 몇 가지 이유는 다음과 같다.

 

  • API와 프런트엔드를 데이터베이스와 다르게 확장해야 할 가능성이 높다.
  • 별도의 컨테이너를 사용하면 버전을 별도로 버전화하고 업데이트할 수 있다.
  • 로컬에서 데이터베이스용 컨테이너를 사용할 수 있지만 프로덕션 환경에서는 데이터베이스용으로 관리형 서비스를 사용할 수 있다. 그러면 데이터베이스 엔진을 앱과 함께 제공하고 싶지 않을 것이다.
  • 여러 프로세스를 실행하려면 프로세스 관리자 (컨테이너는 하나의 프로세스만 시작)가 필요하므로 컨테이너 시작/종료가 더 복잡해진다.

 

따라서, 다음 다이어그램과 같이 여러 컨테이너에서 앱을 실행하는 것이 가장 좋다.

 

 

컨테이너 네트워킹

 

컨테이너는 기본적으로 격리되어 실행되며 동일한 시스템의 다른 프로세스나 컨테이너에 대해 아무것도 모른. 그렇다면 한 컨테이너가 다른 컨테이너와 통신할 수 있도록 하기 위해 두 컨테이너를 동일한 네트워크에 배치하면 서로 통신할 수 있다. 네트워크에 컨테이너를 배치하는 방법에는 두 가지가 있다.

 

  • 컨테이너를 시작할 때 네트워크를 할당한다.
  • 이미 실행 중인 컨테이너를 네트워크에 연결한다.

 

다음 단계에서는 먼저 네트워크를 생성한 다음 시작 시 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:8.0

 

데이터베이스가 실행 중인지 확인하려면 데이터베이스에 연결하고 연결되는지 확인한다.

 

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

 

 

비밀번호 프롬프트가 나타나면 secret 를 입력한다. MySQL 셸에서 데이터베이스를 나열하고 todos 데이터베이스가 표시되는지 확인한다.

 

mysql> SHOW DATABASES;

 

MySQL 셸을 종료하여 컴퓨터의 셸로 돌아간다.

 

mysql> exit

 

이제, todo 데이터베이스가 생겼고 사용할 준비가 되었다.

 

MySQL에 연결

 

이제 MySQL이 실행 중임을 알았으므로 이를 사용할 수 있다. 동일한 네트워크에서 다른 컨테이너를 실행하는 경우 해당 컨테이너를 어떻게 찾는지, 어떻게 사용하는지는 각 컨테이너에는 고유한 IP 주소가 있다는 점을 기억해야 한다. 컨테이너 네트워킹을 더 잘 이해하기 위해 nicolaka/netshoot를 활용하게 된다. 네트워킹 문제를 해결하거나 디버깅하는 데 유용한 많은 도구와 함께 제공되는 컨테이너이다.

 

nicolaka/netshoot 이미지를 사용하여 새 컨테이너를 시작한다. 반드시 동일한 네트워크에 연결해야 한.

 

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

 

컨테이너 내부에서는 유용한 DNS 도구인 dig 명령을 사용하게 다. 호스트 이름 mysql에 대한 IP 주소를 조회하게 된다.

 

dig mysql

 

이것이 의미하는 바는 앱이 이름이 지정된 mysql 호스트에만 연결하면 데이터베이스와 통신한다는 것이다.

 

MySQL로 앱 실행

 

Todo 앱은 MySQL 연결 설정을 지정하기 위해 몇 가지 환경 변수 설정을 지원한다.

 

MYSQL_HOST 실행 중인 MySQL 서버의 호스트 이름
MYSQL_USER 연결에 사용할 사용자 이름
MYSQL_PASSWORD 연결에 사용할 비밀번호
MYSQL_DB 연결되면 사용할 데이터베이스

 

이전 환경 변수를 각각 지정하고 컨테이너를 앱 네트워크에 연결한다. 이 명령을 실행할 때 해당 디렉터리 getting-started-app에 있는지 확인해야 한다.

 

docker run -dp 127.0.0.1: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:18-alpine `
  sh -c "yarn install && yarn run dev"

 

docker logs -f <container-id> 명령으로 컨테이너에 대한 로그를 보면다음과 유사한 메시지가 표시되어야 한다. 이는 해당 컨테이너가 mysql 데이터베이스를 사용하고 있음을 나타낸다.

 

 

 

http://127.0.0.1:3000/ 브라우저에서 앱을 열고 할 일 목록에 몇 가지 항목을 추가한다.

 

 

mysql 데이터베이스에 연결하고 항목이 데이터베이스에 기록되고 있음을 확인한다.

 

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

 

그리고 mysql 셸에서 다음을 실행한다.

 

select * from todo_items;

 

https://docs.docker.com/get-started/07_multi_container/

 

Multi container apps

Using more than one container in your application

docs.docker.com

 

728x90
반응형
LIST