터칭 데이터
다수의 Container 프로그램 실행하기, Docker-Compose 개념 본문
앞서 매뉴얼하게 실행해본 voting application를 docker-compose를 통해 실행해보자
1. Docker 명령 정리와 2장 퀴즈
2. Docker Volume이란?
3. 다수의 Container로 구성된 소프트웨어 실행
4. Docker-Compose로 다수 Container로 실행해보기
5. Airflow Docker docker-compose.yml 리뷰
지난 시간 1~3번을 진행했습니다. 이번에는 4, 5번 과정을 진행하겠습니다.
Docker-Compose란 무엇인가? (1)
다수의 Container로 소프트웨어가 구성되는 경우 사용할 수 있는 툴 + 환경설정파일
docker-compose.yml로 설정
여기서 다양한 테스트등도 수행가능
다양한 버전을 만드는 것도 일반적 (dev, test, prod 등등)
개별 Container를 따로 관리하는 것보다 훨씬 더 생산성이 높음
환경설정 파일의 이름은 docker-compose.yml이나 docker-compose.yaml
Docker-Compose란 무엇인가? (2)
하지만 그만큼 배워야할 것도 많고 복잡해짐
사용법 자체는 간단: 소프트웨어를 구성하는 모든 컨테이너에게 적용됨
docker-compose build
docker-compose up
- 가장 많이 쓰이고 개별 컨테이너들에게 쓰이던 run을 일괄적으로 모든 컨테이너에게 적용된다고 이해하면 편합니다.
docker-compose pull
- docker hub에서 읽어 올수 있는 이미지들을 읽어옵니다.
docker-compose ps
docker-compose down
- Container들을 중지하고 삭제하는 편리한 기능입니다. 단 Image는 로컬에 계속 남아있습니다.
docker-compose start
docker-compose stop
docker-compose rm
Docker-Compose
Docker Desktop의 일부로 설치가 됨
Docker Engine을 실행하고 먼저 터미널에서 버전 확인
만일 docker-compose가 없다고 나오면 먼저 docker-compose부터 실행
Docker Compose v.1.27+ 부터 v2와 v3가 합쳐짐
docker-compose --version으로 버전 확인
$ docker-compose --version
Docker Compose version v2.15.1
1.27 이상이면 괜찮습니다. yaml파일이 최신 형태이기 때문입니다.
docker-compose.yml 작성
다양한 버전이 존재하는데 우리는 v2와 v3가 합쳐진 버전 사용 예정
services: 다음으로 프로그램을 구성하는 서비스들을 지정
각 서비스는 별개의 Docker Image 지정과 Docker Container 실행으로 구성됨
즉 각 서비스는 자신의 Dockerfile을 갖고 있어야함 아니면 docker hub등에서 이미지를 다운로드
서비스별로 포트번호, 환경변수, 디스크 볼륨, 네트워크 등을 지정해야함
서비스 이름은 아무 이름이나 가능하나 서비스 이름은 네트워크 상에서 host 이름이 되므로 유의
volumes: 앞서 사용된 docker volume들을 지정
networks: 앞서 사용된 network들을 지정
network은 지정하지 않으면 같은 docker-compose 그룹 내에서는 모두 연결이 됨
“default”라는 이름으로 기본 네트웍이 만들어짐
docker-compose vs. docker compose
v1: docker-compose
대시(-)를 붙여줌
v2: docker compose
더 이상 대시(-) 없이 공백만 붙여도 괜찮음
Docker 1.27부터 docker에 명령으로 compose가 추가됨
docker-compose 보다는 “docker compose”를 쓰는 것이 더 좋음
별도로 docker-compose를 설치할 필요가 없음.
하지만 아직까지 대부분의 문서가 docker-compose 중심으로 만들어져 있음
docker-compose.yaml or docker-compose.yml
docker-compose와 확장자 yaml 사이에 pord, dev, test 등을 붙여 프로덕션, 개발, 테스트용인지 구분하여 사용 가능
docker compose 명령의 위 둘 중의 하나를 찾음
만일 둘다 존재한다면 에러 발생함
만일 다른 이름의 파일을 사용하고 싶다면 -f 옵션 사용
docker-compose -f docker-compose.mac.yml up
docker-compose.yml 작성 예
services:
frontend:
build: ./frontend
ports:
- 3000:3000
backend:
build: ./backend
ports:
- 3001:3001
environment:
DB_URL: mongodb://database/vidly
database:
image: mongo:4.0-xenial
ports:
- 27017:27017
volumes:
- vidly: /data/db
volumes:
vidly:
services아래에 Docker container가 표현됩니다. frontend, backend, database 3개의 컨테이너가 실행된다는 얘기이며 이미지가 필요할 것입니다.
필요한 Image는 build:와 image:로 지정합니다. frontend와 backend는 각각 frontend와 backend 디렉토리 아래에서 이미지를 찾고 database는 mongo:4.0-xenial라는 로컬 혹은 Docker hub에서 Official 이미지를 찾겠다는 뜻입니다.
ports로 포트 맵핑을 정해줍니다.
database는 vidly로 컨테이너의 /data/db를 volume으로 지정해줬습니다. /data/db의 내용들을 Data Persistency하게 보관한다는 뜻입니다. 최하단의 volumes에는 services안에서 사용한 모든 네임드 Docker volume의 이름을 적어줍니다.
services에 속한 database는 backend 서비스의 환경변수 DB_URL에 적힌 database와 같습니다. database라는 서비스 이름을 DB_URL 환경변수에서 호스트명으로 사용하고 있습니다.
networks를 최하단의 volumes와 같은 레벨로 적어주고 기술할 수 있는데 이는 이후 과정에서 설명드리겠습니다. 다만 같은 docker-compose에 속한 컨테이너들을 자동으로 네트워크로 연결되기 때문에 굳이 compose내의 컨테이너들 사이의 네트워크를 분리하고 싶을 때 사용합니다.
docker-compose로 이미지 생성과 관리 (1)
docker-compose build
build 키로 지정된 것들을 대상으로 합니다.
위에서 본 yaml 예시에서 frontend와 backend는 이미지 빌드를 build:로 적어주었지만 database 서비스는 imgae:로 적었기 때문에 docker-compose build는 frontend와 backend의 이미지만 빌드하게 됩니다.
docker-compose pull
docker hub에서 이미지들을 읽어오려고 함
image키로 지정된 것들을 대상으로 합니다.
database 서비스는 imgae:로 적었기 때문에 docker-compose build는 database의 이미지만 빌드하게 됩니다.
docker images
각 개별 이미지 앞에 폴더 이름을 prefix로 붙임 (docker hub에서 읽어온 것 제외)

docker-compose.yml 파일이 속한 폴더의 이름이 원래 이미지 이름인 worker, vote, result 컨테이너 앞에 prefix로 붙은 모습입니다.
postgres와 redis는 docker hub에서 Official Image로 읽어와 prefix가 붙지 않았습니다.
docker-compose로 이미지 생성과 관리 (2)
docker-compose images
컨테이너에 의해 실행되고 있는 이미지들만 보여줌
docker images는 시스템 전체의 이미지 목록을 보여주는 반면, docker-compose images는 현재 Docker Compose 프로젝트에 정의된 이미지 목록만을 보여줍니다.
docker images는 Docker CLI의 일부이며, 독립적으로 사용 가능하지만, docker-compose images는 Docker Compose 프로젝트에서만 사용할 수 있습니다.
요약하면, 두 명령어는 이미지를 관리하고 확인하는 데 사용되지만, docker images는 시스템 전체 이미지를 보여주고, docker-compose images는 현재 Docker Compose 프로젝트의 이미지를 보여줍니다.

docker-compose push
docker build 혹은 docker pull했던 이미지들을 docker hub으로 푸시하려고 함
당연히 Official Image로 받은 이미지들은 push되지 않습니다. (위에서 본 postgres, redis) docker images에서 prefix가 붙은 이미지들은 권한이 있다면 푸시가 가능합니다.
docker-compose로 소프트웨어 시작과 중단 (1)
docker-compose up (build → create → start)
가장 많이 쓰이는 명령어입니다.
이미지가 없으면 build하고 로컬에 없다면 Docker hub에서 pull로 다운하는 기능을 build가 묵시적으로 담당합니다.
docker-compose create
docker-compose start
docker-compose down
docker container들을 stop하고 remove합니다.
한번에 컨테이너들을 중지하고 삭제할 수 있어 편리합니다.
docker-compose stop
컨테이너들을 중단해 stopped 상태로 만듭니다.
docker-compose rm
stopped 상태의 Docker 컨테이너들을 삭제합니다.
docker-compose로 소프트웨어 시작과 중단 (2)
docker-compose ls

docker-compose를 그룹별로 보여줌
docker-compose로 관리되는 컨테이너들을 그룹핑해 보여줍니다.
이미지에서는 example-voting-app이라는 docker-compose로 관리되는 소프트웨어가 조회되는군요. 현재 5개의 Containers가 실행 중이고 config files의 위치도 조회됩니다.
docker-compose로 관리되는 다른 프로그램이 있다면 더 조회될 것입니다.
docker-compose ps

docker-compose ps는 docker-compose를 통해 실행 중인 Docker Container들의 상태를 개별적으로 보여줍니다.
이름과 이미지, 어떻게 실행되었는지 커맨드와 서비스이름(호스트 이름)과 상태를 보여줍니다. Up 상태는 실행 중이라는 뜻입니다.
docker-compose 네트워킹
docker끼리 네트워크 연결이 필요한 경우
같은 docker-compose로 구성된 컨테이너들은 services에 준 이름으로 호스트 이름이 생성됨
내부에 DNS 서버가 하나 생성되어 이름을 내부 IP로 변환해줌
별도로 네트워크를 구성하고 싶다면
networks에 네트워크를 나열하고 네트워크를 적절하게 서비스에 지정해주어야함
docker-compose.yml 파일 안에서 networks:를 이용해 적절하게 분리 지정하면 됩니다.
이후 과정에서 따로 설명드리겠습니다.
docker network ls
명령어를 통해 Docker Engine에 어떤 네트워크가 존재하는 조회합니다.

기본적으로는 3개의 네트워크 bridge, host, none이 주어집니다. 이 3개의 디폴트 네트워크는 Docker에서 가장 복잡한 부분이라 설명은 생략하겠습니다. 참고로 K8S를 배울 때 이 3개의 네트워크들이 연결이 되는 부분이 있을겁니다.
docker-compose를 통해 프로그램을 실행시켰다면 docker-compose.yaml파일이 속한 디렉토리의 이름이 prefix되고 언더스코어(_) 뒤에 default가 붙은 네트워크가 위의 이미지와 같이 자동으로 생성됩니다. 그리고 docker-compose로 묶인 컨테이너들이 그 네트워크로 들어가게 됩니다.
'Docker & K8S' 카테고리의 다른 글
Docker-Compose로 다수의 Container 프로그램 실행하기 (실습) (0) | 2023.12.21 |
---|---|
Docker-Compose로 다수의 Container 프로그램 실행하기 (실습 개요) (0) | 2023.12.21 |
Docker & K8S - dockerignore와 맥 port 5000 에러 (0) | 2023.12.21 |
10주차 - 3 [Docker & K8S] (0) | 2023.12.20 |
Docker & K8S - 다수의 Container로 구성된 소프트웨어 실행 (0) | 2023.12.20 |