금일은 docker section 에서의 building and managing containerized application 에 대해 알아 보겠습니다.
Multi Container 의 대표적인 Docker Compose 를 활용해서 관리하는 방법에 대해 알아보겠습니다.
목차
주로 MSA 구축 프로젝트에서 inner, outer architecture 로 구분하여 컨테이너화 해서 운영하는 경우가 있다.
컨테이너를 관리하기 위해서 docker compose 를 활용합니다.
더 나아가 컨테이너의 리소스와 오케스트레이션을 위해 kubernetes 를 활용하기도 합니다.
단 kubernetes 는 docker 와 같은 컨테이너 기술이 없으면 작동하지 않는다.
정의
docker compose 작성 방법
docker compose 파일은 docker-compose.yml 로 작성하며 커스텀을 하게되면 docker-compose-kafka.yml 해당 방식으로 가능합니다.
아래의 코드외에도 다양한 옵션이 존재한다. 때문에 가장 기본적인 것들만 작성해 보겠습니다.
version: "3.1"
services:
servicename:
image: #optional
command: #optional
environment: #optional
volumes : #optional
servicename2:
volumes : #optional
network: #optional
실행 커멘드
docker-compose up
docker-compose -f docker-compose-kafka.yml up
이밖에도 yml 파일안에 원하는 컨테이너만 실행가능합니다.
docker-compose.yml 예제
version: "3.1"
services:
my-db:
platform: linux/amd64 # for apple chip
image: nginx:latest
ports:
- 80:80
docker-compose -f docker-compose1.yml up
해당 예제는 하나의 이미지로 하나의 컨테이너를 실행하는 예제이다.
docker-compose.yml 파일 작성 명령어
명령어 | 설명 |
---|---|
image | Docker Image 지정 |
build | Dockerfile을 이용하여 Docker Image 빌드 |
command/entrypoint | 컨테이너 안에서 작동하는 명령어 지정 |
ports/expose | 컨테이너 간 통신을 위한 Port 설정 |
depends_on | 서비스 간 의존 관계 정의 (절대적 X) |
environment/env_file | 컨테이너 환경변수 지정 |
container_name/labels | 컨테이너 정보 설정 |
volumes/volumes_from | 컨테이너 데이터 관리 |
docker-compose OPTIONS
Options | 설명 |
---|---|
up | 컨테이너 생성/시작 |
ps | 컨테이너 목록 표시 |
logs | 컨테이너 로그 출력 |
run | 컨테이너 실행 |
stop | 컨테이너 정지 |
port | 공개 포트 번호 표시 |
rm | 컨테이너 삭제 |
config | 구성 확인 |
down | 컨테이너/리소스 삭제 |
해당 옵션들과 명령어를 활용하여 DB(mariaDB) 를 구축하는 docker compose 파일을 작성해보겠습니다.
version: "3.1"
services:
my-db:
platform: linux/amd64 # for apple chip
image: mariadb:latest
environment:
- MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=true
- MARIADB_DATABASE=mydb
ports:
- 3306:3306
volumes:
- C:\work\git\docker-examples\docker-compose\data:/var/lib/mysql # for windows
# - /Users/edowon/Desktop/Work/14.online/devops-docker/docker-compose/data:/var/lib/mysql # for macos
networks:
- my-network
my-backend:
image: edowon0623/my-backend:1.0
environment:
- spring.datasource.url=jdbc:mariadb://my-db:3306/mydb
- spring.datasource.password=
ports:
- 8088:8088
depends_on:
- my-db
networks:
- my-network
networks:
my-network:
external: true
external : docker-compose.yml 파일을 down 해도 해당 네트워크는 남아있도록 하는 역할
my-db, my-backend : 파일에서 정의한 서비스 이름으로 서비스 간의 네트워크 통신에서 이름으로 사용됩니다. 예를 들어 spring.datasource.url=jdbc:mariadb://my-db:3306/mydb
해당 코드에서 my-backend 컨테이너는 my-db 라는 이름으로 mariaDB 에 접근 가능한 것입니다.
docker-compose -f docker-compose3.yml logs [my-db or my-backend]
docker network inspect my-network
해당 명령어를 통해 실행중인 컨테이너 실시간 로그와 생성한 네트워크의 컨테이너들을 확인 가능하다.
docker-compose -f docker-compose4.yml up -d my-db
해당 명령어는 docker-compose.yml 파일 안의 개별 컨테이너를 실행하기 위한 명령어 입니다.
docker-compose -f docker-compose4.yml rm my-backend
해당 명령어는 docker-compose.yml 파일 안의 개별 컨테이너를 중지하기 위한 명령어 입니다.
docker-compose -f docker-compose4.yml ps
해당 명령어를 통해 Container Name 대신에 정의해 놓은 Service Name 이 나오는 것을 볼 수 있다.
참고자료
inflearn