지난 시간에는 todo app 컨테이너와 mysql 컨테이너를 같은 네트워크 상에서 실행시켜 네트워크 내 DNS를 통해 손쉽게 mysql 연결을 해보았다.
결국 하나의 앱에는 기본적으로 UI+비즈니스 로직 소스코드을 담은 앱과 DB를 담당하는 소프트웨어 2개가 최소로 배포된다.
여기서는 YAML 파일을 통해 하나의 명령어로 이런 컨테이너들을 한번에 묶어서 배포하는 방법에 대해서 배우게 된다.
YAML은 "YAML Ain't Markup Language"의 약어로, 데이터를 인간이 쉽게 읽을 수 있도록 하는 언어이다. 주로 설정 파일과 데이터 전송 형식으로 사용되며, 들여쓰기를 통해 계층 구조를 표현한다.
이 때 도커파일에 들어가는 정보는 베이스 이미지, 컨테이너 실행후 실행될 명령어, 컨테이너 워킹 디렉토리 설정 등이 있었다.
내 앱의 파일시스템과 컨테이너의 파일시스템을 연동하기 위해 volume mount를 사용한다.
bind mount를 통해 호스트의 소스코드 변화를 실시간 반영하게 할 수 있다. 환경에 제약받지 않으므로 개발 컨테이너 만들기에 용이하다
데이터 베이스를 개별 컨테이너로 실행하고 기존의 앱과 연동하기 위해 network를 사용한다.
mysql:8.0 이미지로 컨테이너를 실행하고, network alias를 통해 DNS를 mysql로 설정한다. 이에 따라 host에 컨테이너 IP 주소가 아닌 mysql이라는 텍스트로 호스트 설정이 가능해진다.
mysql의 비밀번호, 루트 사용자 등과 같은 설정을 위해 내 앱을 실행할 때 환경 변수 설정하여 docker run을 해준다.
이를 한번에 처리하려면 두 가지가 필요하다.
이를 compose file에 한번에 처리해보자
이전에 실습했던 앱에 compose.yaml 파일을 만든다.
그리고 그 안에 다음과 같이 명세한다
이 때 들어가는 이미지 이름이 network alias로 자동으로 사용된다.
services:
app:
image: node:18-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 127.0.0.1:3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
command: sh -c "yarn install && yarn run dev"
: 컨테이너 내부에서 실행할 명령어를 설정. yarn install로 필요한 패키지를 설치하고, yarn run dev로 애플리케이션을 실행함.
ports: 호스트와 컨테이너 간의 포트 매핑을 설정. 호스트의 3000번 포트와 컨테이너의 3000번 포트를 연결.
mysql 컨테이너의 환경변수에 mysql 패스워드와 db 그리고 network alias를 설정했었다.
이것을 아래처럼 명세한다
mysql:
image: mysql:8.0
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
mysql의 volumes 부분을 보자. todo-mysql-data의 로컬 볼륨 주소를 :/var/lib/mysql로 마운트한다.
주의
docker run에서는 자동으로 volume을 앱 내에 만들어주었다. 하지만 여기서는 volume 섹션을 따로 만들어서 명세를 해주어야한다. 이전의 코드를 잠깐보면
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
이전에는 mysql 실행시 docker volume create를 하지 않아도 이렇게 volume을 mount할 주소를 입력하면 도커가 알아서 volume을 만들어주었다.
services:
app:
image: node:18-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 127.0.0.1:3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql:
image: mysql:8.0
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
명세서에는 다음이 담겨있다.
아래 명령어 수행
docker compose up -d
jisujang@Jisuui-MacBookPro getting-started-app-main % docker compose up -d
[+] Building 0.0s (0/0) docker:desktop-linux
[+] Running 2/2
✔ Container getting-started-app-main-app-1 Started 0.1s
✔ Container getting-started-app-main-mysql-1 Started
명령어 수행시 네트워크 설정과 볼륨을 설정하는 것을 볼 수 있다.
이후 docker ps를 통해서 실행중인 컨테이너를 보면 mysql과 todo-app을 볼 수 있다.
todo-app을 중단하고 다시 실행해도 데이터가 보존되는 것을 확인할 수 있고 mysql에도 잘 저장되고 있음을 확인할 수 있다.
여러 컨테이너를 yaml이라는 형식으로 한 파일안에 명세하여 깔끔하게 처리해보았다.