홍카나의 공부방

[Docker] Docker Compose란? + 명령어 본문

Data Engineering/Docker

[Docker] Docker Compose란? + 명령어

홍문관카페나무 2023. 7. 2. 17:31

Docker Compose란?

 

docker-compose는 다수의 docker container로 소프트웨어가 구성되는 경우 사용할 수 있는 툴 및 환경설정 파일이다.

docker desktop의 일부로 함께 설치된다.

 

docker-compose 버전 확인

 

docker-compose.yml 혹은 docker-compose.yaml로 설정한다.

docker-compose파일로 환경을 만들어두면

개별 컨테이너를 관리하는 것보다 훨씬 생산성이 높지만, 복잡도도 높아진다는 단점이 있다.

 

연계하여 사용하는 명령어들은 다음과 같다.

docker-compose build
docker-compose up
docker-compose pull
docker-compose ps
docker-compose down
docker-compose start
docker-compose stop
docker-compose rm

docker-compose build . : 해당 명령어는 .yml에서 build 키로 지정된 서비스들만 빌드를 진행한다.

docker-compose pull : docker hub에서 이미지들을 읽어오려고 시도한다.

docker images : 각 개별 이미지 앞에 폴더 이름을 prefix로 붙인다.(dockerhub에서 불러온 것 제외)

docker-compose images : 컨테이너에 의해 실행되고 있는 이미지들만 보여준다.

docker-compose push : docker hub로 이미지들을 푸시한다.

docker-compose up : build -> create -> start의 과정을 모두 실행하여 컨테이너들을 구성한다.

docker-compose stop : 컨테이너를 중단하여 stop 상태로 만든다.

docker-compose rm : stop 상태인 컨테이너를 삭제한다.

docker-compose down : stop과 remove 과정을 모두 진행한다.

 

Docker 1.27부터 docker의 subcommand로 compose를 사용해도 된다. ( docker-compose -> docker compose )


Docker-Compose.yml의 구성

 

Docker-Compose는 크게

services, volumes, networks로 구성된다.

services, networks, volumes

 

services : 프로그램을 구성하는 서비스들을 지정한다.

각 서비스는 별개의 Docker Image 지정과 Docker Container 실행으로 구성되어 있다.

즉, 각 서비스는 자신의 Dockerfile을 가지고 있어야 한다.

(그렇지 않으면, dockerhub 등에서 공식 이미지를 다운로드 하게된다.)

서비스별로 서비스 이름, 포트번호, 환경변수, 디스크 볼륨등을 지정해야 한다.

 

volumes : docker volume들을 지정한다.

 

networks : docker network들을 지정한다.

networks를 지정하지 않으면, 같은 Docker-Compose 그룹 내에서 모두 연결이 된다.

또한, default라는 이름으로 기본 네트워크가 만들어진다.

 


 

yaml 코드 예시 

 

코드는 아래 링크에서 볼 수 있다.

https://github.com/dockersamples/example-voting-app/blob/main/docker-compose.yml

 

GitHub - dockersamples/example-voting-app: Example distributed app composed of multiple containers for Docker, Compose, Swarm, a

Example distributed app composed of multiple containers for Docker, Compose, Swarm, and Kubernetes - GitHub - dockersamples/example-voting-app: Example distributed app composed of multiple containe...

github.com

이 코드를 살펴보면,

먼저 network를 front-tier, back-tier로 구분지었다.

사용자들을 위한 프론트단의 컨테이너들의 통신은 front-tier,

로직 처리를 위한 컨테이너들의 통신은 back-tier로 구성했다.

 

유저가 DB에 직접 접근할 이유가 없고

DB또한 직접 front에 접근할 이유가 없기에 ( Worker가 대신한다. )

보안 및 유연성을 생각하여 네트워크를 나눈 것 같다.

 

또한 해당 프로젝트는 컨테이너가 중지되어도 데이터가 계속해서 저장될 필요가 있기 때문에

docker volume을 사용해야 했고, 사용했다.

 

그리고 컨테이너가 정상 상태인지를 확인하기 위해

depends_on : healthcheck를 서비스에 추가해주면서

올바르게 작동하고 필요한 응답을 제공하는지 확인했다.

healthy 상태가 아니라면 Docker-Compose가 해당 컨테이너를 재시작하거나, 장애로 처리할 수 있도록한다.

(healthcheck는 dockerfile에도 기술 가능한 명령어다.)

 

depends_on의 condition 값으로는 service_healthy를 줬지만,

추후 airflow에 적용하기 위해서 service_completed_successfully와 같은 옵션도 있다는 것을 알아두자.

 

worker서비스에도 build: 에 context를 지정해주면서

빌드 관련 정보를 더 많이 넘기려고 시도했다.

(context를 사용하면 더 많은 빌드 관련 정보를 넘겨줄 수 있다.)

 

그리고 environment를 지정해주면서 서비스가 컨테이너 안에서 실행될 때

필요한 환경변수들을 지정해줬다.

 

마지막으로 yaml을 기반으로 프로그램을 실행하기 위해서는

docker-compose up을 입력하면 된다!

반응형