목차
개요
도커 공식홈페이지에서 지원해주는 get_started Tutorial 파일을 가지고 도커를 다뤄보자!
본 포스팅은 아래의 도커 공홈에서 지원해주는 튜토리얼을 토대로 포스팅하였음
https://docs.docker.com/get-started/
Multi container App 이란?
지금까지는 튜토리얼에서 지원해주는 앱 내에 따로 db 파일이 존재하고 있어서 하나의 컨테이너 내에서 전부 구현이 가능했었지만 이 포스팅에서는 아래와 같은 이미지 처럼 SQL 파일과 튜토리얼 내의 Todo 앱을 따로 컨테이너로 구현을 하여 실행하도록 한다.
이와같이 따로 컨테이너를 만들어서 관리를 하는 이유는
- 프론트와 백엔드에 구현한 API 들의 크기 수정이 자유로워 집니다.
- 분리된 컨테이너를 통해 각각의 버전관리를 할 수 있습니다.
- 데이터 베이스를 별도의 컨테이너로 관리를 함으로써 DB 관리 프로그램을 별도로 사용이 가능합니다.
- 여러개의 프로세스가 있는 컨테이너를 관리하는 것이 개별 프로세스가 나누어져있는 컨테이너를 관리하는 것보다 복잡합니다.
MySQL을 추가해보자.
컨테이너를 network에 추가하는 방법은 총 두가지가 있다.
1. 컨테이너 시작할때 옵션을 통해 추가하는 방법
2. 이미 존재하는 컨테이너에 연결을 하는 방법.
이 튜토리얼에서는 네트워크를 먼저 만들고 뒤에 MySQL 컨테이너를 추가하는 방식을 이용하겠다.
1. 네트워크를 생성하여준다.
docker network create todo-app
*todo-app앱은 도커 공식 홈페이지에서 지원해주는 튜토리얼을 위한 프로젝트이다. 아래에서 확인해보자
2023.01.16 - [Docker] - 튜토리얼(1) Dockerfile 생성, 컨테이너 이미지 만들기
2. MySQL 컨테이너를 실행하고 네트워크에 attach 해준다.
또한 MySQL의 데이터베이스 구축을 위한 환경 변수등을 정의해준다.
https://hub.docker.com/_/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
-v 옵션으로 볼륨의 이름을 todo-mysql-data로 지정해주었고 그 마운트위치를 /var/lib/mysql 로 지정해주었다.
하지만 여기서는 docker volume create 등으로 따로 볼륨 마운트를 설정해주지 않았는데 굳이 지정해주지 않아도 DB는 볼륨마운트 형식으로 도커에서 자동으로 인식하여 마운팅을 해준다.
2023.01.21 - [Docker] - 튜토리얼(4) 볼륨 마운트(Volume mount)로 Persist DB관리 <<< 같이 읽으면 좋은글
3. 데이터 베이스를 도커로 실행시키고 연결을 확인한다.
docker exec -it <mysql-container-id> mysql -u root -p
docker ps 명령어로 mysql 컨테이너 ID를 얻자
이후에 패스워드를 입력하라고 하면 2번에서 지정하였던 패스워드인 secret 를 집어넣어주자 그럼 todos DB를 볼수 있을것이다.
위의 mysql> 터미널에 대문자로 SHOW DATABASES; 로 DB를 확인해보자
exit로 DB에서 나올수 있다.
그럼 todos 를 위한 MySQL 형식의 DB가 준비가 되었다!
MySQL 에 todo 앱 연결하기
1. 새로운 netshoot을 지원하는 컨테이너 이미지를 시작하고 todo-app 과 같은 네트워크에 연결한다.
이때 nicolaka/netshoot 컨테이너를 사용하는데 이유는 도커와 쿠버네티스에서 일어날수 있는 주요한 네트워크 이슈들을 해결해주는 문제해결 프로세스(trubleshooting) 가 적용되어 있기 때문이다.
https://github.com/nicolaka/netshoot
2. getting-start/app 폴더 위에서 아래 명령어를 실행한다.
docker run -dp 3000:3000 \
-w /app --mount type=bind,src="$(pwd)",target=/app \
node:18-alpine \
sh -c "yarn install && yarn run dev"
app 로컬 경로가 src = 옵션의 $(pwd) 에 들어간다 target 옵션에는 도커 파일을 실행하는 앱의 소스 위치가 들어가야한다.
위의 명령어를 분석하여 보면
- -dp 3000:3000 작동할 포트를 맵핑해준다.
- -w /app 해당 명령어가 작동할 디렉토리를 설정하여준다.
- --mount type=bind 바인드 마운트를 진행한다.
- src="$(pwd)" 호스트의 해당 디렉토리에서 소스를 가져온다
- target=/app 가져올 최종 디렉토리
- node:18-alpine 실행을 하는 이미지 선정
- sh -c "yarn install && yarn run dev" 각각 패키지 설치와 서버를 실행하는 명령어이다.
- (추가로 패키지는 package.json을 참고하고 dev 스크립트는 nodemon을 실행한다.)
3. docker log 명령어를 이용해서 서버 실행 로그도 볼 수 있다.
docker logs -f <container-id>
ctrl + c 로 로그 출력을 종료할 수 있다.
4. Bind mount 가 잘되었는지 확인하기 위해서 소스코드를 고쳐보자
로컬의 src/static/js/app.js의 출력 텍스트 를 조금 고쳐보자
- {submitting ? 'Adding...' : 'Add Item'}
+ {submitting ? 'Adding...' : 'Add'}
http://localhost:3000/에 가서 전 후 변화를 살펴보게 된다면
상당히 딜레이 없이 변경이 되는 것을 확인 해볼수 있었다.
마무리
여기까지 도커 튜토리얼을 리뷰해보았다.
도커를 처음 배우는 사람들에게 도움이 되었으면 좋겠고 혹시나 설명이 부자연스럽거나 틀린 경우에는 댓글 부탁드립니다.
'Docker' 카테고리의 다른 글
도커로 MySQL 실행 - DockerCompose 파일 뜯어보기 (0) | 2023.04.05 |
---|---|
도커로 MySQL 설치하고 접속하기, MySQLWorkBench로 관리 (0) | 2023.04.05 |
튜토리얼(5) 바인드 마운트(Bind mount)로 소스 코드 업데이트 (0) | 2023.01.21 |
튜토리얼(4) 볼륨 마운트(Volume mount)로 Persist DB관리 (0) | 2023.01.21 |
튜토리얼(3) Docker Hub를 통해서 이미지 배포, 다른 환경에서 실행 (0) | 2023.01.19 |