AWS/Docker+CICD
Docker Compose로 여러 개의 컨테이너를 한 번에 관리해요
sehunbang
2024. 4. 5. 12:04
Docker Compose란?
Docker Compose 를 통해 여러 개의 컨테이너를 관리합니다.
Docker Compose 를 사용하는 이유는?
- 편하게 설정하기: Docker Compose는 여러 컨테이너를 한 파일에 적어서 설정할 수 있어요. 이 파일에는 컨테이너가 무슨 이미지를 쓸지, 어떤 포트를 사용할지, 환경 변수는 뭐가 필요한지 등을 적어둬요. 이렇게 하면 여러 컨테이너를 한 번에 쉽게 설정할 수 있죠.
- 자동으로 배포하기: 설정 파일이 있으면, Docker Compose가 알아서 컨테이너들을 만들어 주고 실행해 줘요. 개발자가 일일이 명령어를 입력할 필요가 없어요.
- 의존성 관리: 컨테이너들이 서로 의존하는 관계가 있으면, Docker Compose가 이를 관리해 줘요. 예를 들어, A 컨테이너가 B 컨테이너를 필요로 하면, A를 먼저 켜고 나서 B를 실행하는 식이죠.
- 모니터링과 로깅: Docker Compose는 컨테이너들이 어떻게 돌아가는지 지켜보고, 로그도 모아줘요. 이렇게 하면 문제가 생겼을 때 빨리 찾아서 고칠 수 있어요.
- 확장성: 여러 컨테이너를 하나의 그룹으로 관리할 수 있어요. 이게 좋은 이유는, 예를 들어 웹 앱을 만드는 여러 컨테이너를 한꺼번에 관리하고 확장하기 쉽기 때문이에요.
- 유연성: Docker Compose는 개발 환경, 테스트 환경, 실제 운영 환경에서도 같은 설정 파일을 써서 일관성을 유지할 수 있어요.
- 보안 강화: 컨테이너들의 네트워크를 분리해서 외부로부터의 접근을 제한할 수도 있어요. 이렇게 하면 보안이 더 강화돼요.
- 유지보수가 쉬워요: 설정 파일 하나로 컨테이너들을 관리하기 때문에, 뭔가 바꿀 일이 있으면 파일만 수정하면 돼요. 그러면 Docker Compose가 알아서 변경사항을 적용해 줘요.
Docker Compose를 사용하면 여러 컨테이너를 더 쉽게 관리하고, 자동으로 설정하고, 확장하고, 보안을 강화할 수 있어요. 개발자 입장에서는 이런 도구가 엄청나게 편리하죠!
어디에 사용하나요?
- 개발 환경에서
- 앱을 개발할 때, 앱을 따로 떼어 놓고 실행하고 테스트할 수 있는 환경이 필요해요. Docker Compose를 쓰면 이런 환경을 쉽게 만들고 관리할 수 있어요.
- Compose 파일은 앱이 필요로 하는 모든 서비스들(데이터베이스, 큐, 캐시, 웹 API 등)을 정리해주고, docker compose up 명령어로 이 모든 것을 한 번에 시작할 수 있어요.
- 이런 기능들 덕분에 개발자가 새 프로젝트를 시작할 때 시간을 많이 절약할 수 있어요. 여러 페이지에 걸친 설명서 대신에 Compose 파일 하나로 모든 설정을 할 수 있으니까요.
- 자동화된 테스트 환경에서
- 자동화된 테스트는 앱이 잘 돌아가는지 확인하는 데 중요해요. Docker Compose는 이런 테스트를 위한 별도의 환경을 쉽게 만들고 없앨 수 있어요.
- Compose 파일에 테스트 환경을 정의해두고, 간단한 명령어 몇 개로 테스트 환경을 만들고 테스트를 실행한 다음, 다시 환경을 없앨 수 있어요. 예를 들어 다음과 같은 명령어를 사용하면 돼요.
docker compose up -d
./run_tests
docker compose down
- 단일 호스트 배포에서
- Docker Compose는 주로 개발과 테스트에 많이 쓰이지만, 실제로 앱을 운영하는 환경(프로덕션)에도 쓸 수 있어요. 매번 새 버전이 나올 때마다 이런 용도로도 쓰기 좋게 계속 개선되고 있어요.
- 한 번에 여러 컨테이너 설정하기:
- Docker Compose는 여러 컨테이너의 설정을 하나의 YAML 파일에 넣어서 관리해요. 이 파일 하나로 여러 컨테이너의 모든 환경을 설정하고, 그걸로 여러 컨테이너를 한 번에 실행할 수 있죠.
- 빠른 서비스 실행:
- 설정 값들을 저장해 두고 다시 쓸 수 있어요. 만약 설정이 바뀌지 않았다면, Docker Compose는 이전에 저장해둔 정보를 다시 사용해서 서비스를 더 빨리 시작할 수 있어요.
- 같은 네트워크에서 쉽게 연결:
- docker-compose.yaml 파일에 있는 애플리케이션들은 모두 같은 네트워크에 자동으로 연결돼요. 이렇게 하면 복잡한 네트워크 설정 없이도 여러 컨테이너가 서로 쉽게 통신할 수 있어요.
이런 특징들 덕분에 Docker Compose는 여러 컨테이너를 관리하고 실행하는 데 정말 편리한 도구예요. 설정도 간편하고, 빠르게 실행할 수 있고, 컨테이너들끼리의 연결도 쉽게 할 수 있죠.
- Docker Compose 실행하기
- 각 애플리케이션의 Dockerfile 작성하기
- 보통 내가 만든 애플리케이션을 실행하기 위한 Dockerfile 만 작성
- docker-compose.yaml 파일 작성하기
- 내가 만든 애플리케이션을 실행하기 위해 필요한 database라든지 redis라든지 다른 서비스들을 한꺼번에 정의하는 파일을 작성
- docker compose up 으로 실행하기
- 각 애플리케이션의 Dockerfile 작성하기
여태 까지 많이 썻지만 YAML file 이란?
- YAML 파일이란?
- YAML 파일은 컴퓨터가 읽을 수 있는 설정 파일이에요. 사람이 읽기에도 쉬운 텍스트 형식으로 되어 있죠. 'YAML Ain't Markup Language'의 줄임말이에요, 즉 'YAML은 마크업 언어가 아니다'라는 뜻이죠.
- 어떻게 생겼나요?
- YAML 파일은 일반 텍스트로 쓰여 있어요. 설정이나 데이터를 쉽게 알아볼 수 있는 형식으로 나열해요. 예를 들어, 목록이나 키-값 쌍 같은 것들이죠.
- 왜 쓰나요?
- YAML 파일은 설정을 정리하고 관리하기에 아주 좋아요. 예를 들어, Docker Compose에서는 YAML 파일을 사용해서 여러 컨테이너의 설정을 한 곳에 쉽게 정리할 수 있어요.
- YAML은 읽기 쉽고, 쓰기도 간단해서 많은 프로그램과 도구에서 선호하는 설정 파일 형식이에요.
- 특징은?
- YAML 파일은 구조가 명확하고 간단해서, 사람이 보기에도 이해하기 쉬워요. 들여쓰기를 사용해서 각 설정의 관계를 나타내죠.
YAML은 다음과 같은 문법을 사용해요
- 키-값 쌍: 키와 값으로 이루어진 쌍으로 구성됩니다. 키와 값은 콜론(:)으로 구분됩니다.
- 리스트: 쉼표(,)로 구분된 값들의 리스트로 구성됩니다.
- 딕셔너리: 중괄호({})로 둘러싸인 키-값 쌍의 리스트로 구성됩니다.
- 불린 값: true, false, yes, no 등의 값으로 표현됩니다.
- 문자열: 큰 따옴표("")나 작은 따옴표('')로 둘러싸인 문자열로 표현됩니다.
‼️ 주의사항 ‼️
- 보통 들여쓰기가 잘못된 경우 yaml 파일을 의도와 다르게 해석하게 되니 들여쓰기에 주의하셔야 합니다.
https://www.yamllint.com/ 에서 들여쓰기를 검사할 수 있어요.
example

- version: Docker Compose의 버전을 정의합니다.
- services: 네 개의 서비스를 정의합니다.
- web 서비스는 Nginx 이미지를 사용하며, 포트 80번을 호스트 머신에 노출합니다.
- api 서비스는 Java 이미지를 사용하며, 포트 8080번을 호스트 머신에 노출합니다.
- redis 서비스는 Redis 이미지를 사용하며, 포트 6379번을 호스트 머신에 노출합니다.
- mysql 서비스는 MySQL 이미지를 사용하며 포트 3306번을 호스트 머신에 노출합니다.
- volumes: web 서비스는 현재 디렉토리 내 web 디렉토리를 컨테이너에 연결합니다. api 서비스는 현재 디렉토리 내 api 디렉토리를 컨테이너에 연결합니다. mysql 서비스는 현재 디렉토리 내 mysql 디렉토리를 사용하여 MySQL 데이터를 영구적으로 저장하게 합니다.
- depends_on: 각 서비스 간의 의존성을 정의합니다. web 서비스는 api서비스에 의존합니다. api 서비스는 mysql과 redis 서비스에 의존합니다.
- links: 각 서비스 간의 링크를 정의합니다. web 서비스는 api서비스에 링크됩니다. api 서비스는 mysql과 redis 서비스에 링크됩니다.
- 이 예제에서는 web 서비스와 api 서비스가 각각 독립적인 컨테이너로 실행됩니다. web 서비스는 api 서비스에 의존하며, api 서비스는 mysql과 redis 서비스에 의존합니다. redis와 mysql 서비스는 각각 독립적인 컨테이너로 실행됩니다.
version : docker engine 의 버전과 연관
https://docs.docker.com/compose/compose-file/compose-versioning/
Compose file versions and upgrading
Compose file reference
docs.docker.com
services: 컨테이너 대신 서비스 개념으로 간주

volumes:
- 도커 볼륨 혹은 호스트 볼륨을 마운트하여 사용합니다. 도커 볼륨의 경우 docker-compose.yml 파일에 선언된 볼륨만 docker-compose.yml에서 사용할 수 있습니다.

networks:
- 서비스(컨테이너)가 소속된 네트워크 입니다. 따로 지정하지 않을 경우 default_${project}와 같이 지정됩니다. 기본적으로 컨테이너는 같은 네트워크에 있어야 서로 통신이 가능합니다.
healthcheck
- 서비스 컨테이너가 “healthy”한지 계속 체크
- Dockerfile에 정의된 것을 먼저 따르지만 docker-compose 파일에서 재지정 가능
- 예제
