2-3. Docker Compose 소개 및 사용법
1. Docker Compose의 등장 배경과 필요성
컨테이너 기술은 애플리케이션을 격리된 환경에서 실행하여 이식성과 확장성을 크게 향상시켰습니다. Docker는 이러한 컨테이너를 생성하고 관리하는 데 널리 사용되는 도구입니다. 하지만, 단일 컨테이너를 넘어 여러 컨테이너로 구성된 애플리케이션을 관리하는 것은 복잡한 작업이 될 수 있습니다. 예를 들어, 웹 애플리케이션을 위해 웹 서버, 데이터베이스, 캐시 서버 등 여러 컨테이너를 동시에 실행하고, 컨테이너 간의 네트워크 연결을 설정하며, 볼륨을 사용하여 데이터를 영구적으로 저장해야 할 수 있습니다. 이러한 모든 작업을 수동으로 수행하는 것은 시간과 노력이 많이 들 뿐만 아니라, 오류가 발생하기 쉽습니다.
Docker Compose는 이러한 문제를 해결하기 위해 등장했습니다. Docker Compose는 여러 컨테이너로 구성된 애플리케이션을 정의하고 실행하기 위한 도구입니다. Docker Compose를 사용하면 docker-compose.yml 파일에 애플리케이션의 모든 컨테이너와 설정을 정의하고, 단일 명령으로 전체 애플리케이션을 시작, 중지 및 관리할 수 있습니다. 즉, Docker Compose는 여러 컨테이너를 연결하고 관리하는 오케스트레이션 도구의 일종으로, 컨테이너 기반 애플리케이션 개발과 배포를 단순화합니다.
2. Docker Compose의 핵심 개념
Docker Compose는 컨테이너 간의 의존성, 네트워크 설정, 볼륨 마운트 등 다양한 설정을 yml 형식의 파일에 정의합니다. 이 파일은 애플리케이션의 청사진 역할을 하며, Docker Compose는 이 파일을 기반으로 컨테이너를 생성하고 관리합니다.
1) docker-compose.yml 파일
docker-compose.yml 파일은 Docker Compose의 핵심입니다. 이 파일은 애플리케이션을 구성하는 모든 컨테이너의 정의를 포함합니다. 각 컨테이너는 service로 정의되며, 각 서비스는 다음과 같은 주요 속성을 가질 수 있습니다.
image: 컨테이너를 생성하는 데 사용할 Docker 이미지 이름 또는 태그.build: Docker 이미지를 빌드하기 위한 Dockerfile의 경로.image대신 사용됩니다.ports: 호스트 머신의 포트와 컨테이너 내부 포트를 연결합니다. (호스트 포트:컨테이너 포트형식)volumes: 호스트 머신의 디렉토리 또는 볼륨을 컨테이너 내부의 디렉토리에 마운트합니다.environment: 컨테이너 내에서 사용할 환경 변수를 설정합니다.depends_on: 다른 서비스에 대한 종속성을 정의합니다. Docker Compose는 종속된 서비스가 먼저 시작된 후에 해당 서비스를 시작합니다.networks: 컨테이너를 연결할 네트워크를 정의합니다.
2) 서비스 (Service)
service는 docker-compose.yml 파일에서 정의되는 컨테이너의 단위입니다. 각 서비스는 특정 애플리케이션 구성 요소를 나타냅니다. 예를 들어, 웹 애플리케이션의 경우 웹 서버, 데이터베이스, 캐시 서버가 각각 서비스로 정의될 수 있습니다. 각 서비스는 독립적으로 구성되고 관리될 수 있으며, 다른 서비스와의 관계(예: 종속성)를 명시적으로 정의할 수 있습니다.
3) 네트워크 (Network)
Docker Compose는 기본적으로 애플리케이션의 모든 컨테이너를 연결하는 default 네트워크를 생성합니다. 컨테이너는 이 네트워크를 통해 서로 통신할 수 있습니다. 또한, 사용자는 networks 설정을 사용하여 사용자 정의 네트워크를 생성하고, 컨테이너를 이러한 네트워크에 연결할 수 있습니다. 이를 통해 컨테이너 간의 통신을 제어하고, 보안을 강화할 수 있습니다.
4) 볼륨 (Volume)
볼륨은 컨테이너가 데이터를 영구적으로 저장하고 공유할 수 있도록 합니다. Docker Compose를 사용하면 volumes 설정을 통해 호스트 머신의 디렉토리 또는 Docker 볼륨을 컨테이너에 마운트할 수 있습니다. 이를 통해 컨테이너가 삭제되더라도 데이터가 유지되며, 여러 컨테이너 간에 데이터를 공유할 수 있습니다.

위 그림은 Docker Compose 아키텍처를 보여주는 다이어그램입니다. 여러 서비스(컨테이너)가 네트워크를 통해 서로 통신하고, 볼륨을 통해 데이터를 공유합니다.
3. Docker Compose 사용법
Docker Compose를 사용하여 멀티 컨테이너 애플리케이션을 정의하고 실행하는 방법은 간단합니다.
1) docker-compose.yml 파일 작성
먼저, 애플리케이션을 구성하는 모든 컨테이너를 정의하는 docker-compose.yml 파일을 작성해야 합니다. 다음은 간단한 웹 애플리케이션(Nginx 웹 서버 및 간단한 HTML 파일)을 위한 docker-compose.yml 파일의 예시입니다.
version: "3.9" # Docker Compose 파일 버전 (필수)
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html # 호스트의 ./html 디렉토리를 컨테이너의 /usr/share/nginx/html에 마운트
위 예제에서, version은 Docker Compose 파일의 버전을 지정하며, services 섹션은 애플리케이션을 구성하는 서비스들을 정의합니다. web 서비스는 nginx:latest 이미지를 사용하고, 호스트의 80번 포트를 컨테이너의 80번 포트에 매핑하며, ./html 디렉토리를 컨테이너의 /usr/share/nginx/html에 마운트합니다.
2) 애플리케이션 실행
docker-compose.yml 파일이 작성되면, 다음 명령어를 사용하여 애플리케이션을 실행할 수 있습니다.
docker-compose up -d
-d 옵션은 컨테이너를 백그라운드에서 실행하도록 지정합니다.
3) 애플리케이션 중지 및 제거
애플리케이션을 중지하려면 다음 명령어를 사용합니다.
docker-compose down
docker-compose down 명령어는 컨테이너를 중지하고, 네트워크와 볼륨을 제거합니다.
4) 기타 명령어
Docker Compose는 애플리케이션을 관리하기 위한 다양한 명령어를 제공합니다.
docker-compose ps: 실행 중인 컨테이너 목록을 표시합니다.docker-compose logs: 서비스의 로그를 표시합니다.docker-compose exec <service> <command>: 특정 서비스의 컨테이너 내에서 명령어를 실행합니다.docker-compose build:docker-compose.yml파일에build속성이 정의된 서비스를 빌드합니다.
4. docker-compose.yml 파일 상세 설정
docker-compose.yml 파일은 애플리케이션의 동작 방식을 세밀하게 제어할 수 있는 다양한 설정을 제공합니다.
1) image vs build
image: 이미지를 직접 사용하는 경우 사용합니다. Docker Hub와 같은 레지스트리에서 이미지를 가져오거나, 로컬에 이미지를 가지고 있는 경우 사용합니다.build: Dockerfile을 사용하여 이미지를 빌드하는 경우 사용합니다.build속성은 Dockerfile의 경로를 지정합니다. 이 속성을 사용하면 애플리케이션 소스 코드를 기반으로 사용자 정의 이미지를 생성하고, 컨테이너를 실행할 수 있습니다.
2) 포트 매핑 (ports)
ports 설정은 호스트 머신의 포트와 컨테이너 내부의 포트를 연결합니다. 예를 들어, 80:80은 호스트의 80번 포트를 컨테이너의 80번 포트에 매핑합니다. 이를 통해 호스트 머신에서 해당 포트로의 요청을 컨테이너로 전달할 수 있습니다.
3) 볼륨 마운트 (volumes)
volumes 설정은 호스트 머신의 디렉토리 또는 볼륨을 컨테이너 내부에 마운트합니다. 이를 통해 컨테이너가 데이터를 영구적으로 저장하고 공유할 수 있습니다. 볼륨을 사용하면 컨테이너가 삭제되더라도 데이터가 유지되며, 여러 컨테이너 간에 데이터를 공유할 수 있습니다.
4) 환경 변수 (environment)
environment 설정을 사용하면 컨테이너 내에서 사용할 환경 변수를 설정할 수 있습니다. 환경 변수는 애플리케이션의 구성 정보를 저장하고, 컨테이너 내부에서 접근할 수 있도록 합니다.
5) 의존성 설정 (depends_on)
depends_on 설정을 사용하면 서비스 간의 종속성을 정의할 수 있습니다. 예를 들어, 데이터베이스를 사용하는 웹 애플리케이션의 경우, 웹 서버 서비스가 데이터베이스 서비스에 의존하도록 설정할 수 있습니다. Docker Compose는 depends_on 설정을 기반으로 서비스의 시작 순서를 결정합니다. 즉, 의존된 서비스가 먼저 시작된 후에 해당 서비스를 시작합니다.
6) 네트워크 설정 (networks)
networks 설정을 사용하면 컨테이너를 연결할 네트워크를 정의할 수 있습니다. 기본적으로 Docker Compose는 모든 컨테이너를 연결하는 default 네트워크를 생성합니다. 또한, 사용자는 사용자 정의 네트워크를 생성하고, 컨테이너를 이러한 네트워크에 연결할 수 있습니다. 이를 통해 컨테이너 간의 통신을 제어하고, 보안을 강화할 수 있습니다.
5. Docker Compose를 활용한 실용적인 예시
Docker Compose는 다양한 시나리오에서 활용될 수 있습니다.
1) 웹 애플리케이션 배포
Docker Compose를 사용하여 웹 애플리케이션을 배포하는 것은 매우 일반적인 사용 사례입니다. 예를 들어, Node.js 기반의 웹 애플리케이션을 배포하는 경우, 다음과 같이 docker-compose.yml 파일을 구성할 수 있습니다.
version: "3.9"
services:
web:
build: ./web # 웹 애플리케이션 Dockerfile 경로
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:14
environment:
- POSTGRES_USER=myuser
- POSTGRES_PASSWORD=mypassword
- POSTGRES_DB=mydb
volumes:
- db_data:/var/lib/postgresql/data # 데이터베이스 데이터 영구 저장
volumes:
db_data: # 볼륨 정의
위 예제에서 web 서비스는 웹 애플리케이션을 실행하고, db 서비스는 PostgreSQL 데이터베이스를 실행합니다. web 서비스는 db 서비스에 의존하며, 데이터베이스 데이터를 영구적으로 저장하기 위해 볼륨을 사용합니다.
2) 개발 환경 구성
Docker Compose는 개발 환경을 구성하는 데에도 유용합니다. 예를 들어, Python 애플리케이션을 개발하는 경우, 다음과 같이 docker-compose.yml 파일을 구성할 수 있습니다.
version: "3.9"
services:
web:
build: . # 현재 디렉토리에 있는 Dockerfile 사용
ports:
- "8000:8000"
volumes:
- .:/app # 호스트의 현재 디렉토리를 컨테이너의 /app에 마운트
environment:
- DEBUG=1
위 예제에서, web 서비스는 Python 애플리케이션을 실행하며, 호스트의 소스 코드를 컨테이너에 마운트하여 코드 변경 사항을 실시간으로 반영할 수 있도록 합니다. 또한, 디버깅을 위해 DEBUG 환경 변수를 설정합니다.
3) CI/CD 파이프라인
Docker Compose는 CI/CD (Continuous Integration/Continuous Deployment) 파이프라인에서 테스트 및 배포 환경을 구성하는 데에도 사용될 수 있습니다. Docker Compose를 사용하면 테스트 환경과 배포 환경을 일관되게 구성하고, 애플리케이션의 안정성을 높일 수 있습니다.
6. Docker Compose 사용 시 주의사항 및 트러블슈팅
Docker Compose를 사용할 때 발생할 수 있는 일반적인 문제와 해결 방법은 다음과 같습니다.
1) 포트 충돌
호스트 머신에서 이미 사용 중인 포트를 컨테이너가 사용하려고 하면 포트 충돌이 발생합니다.
- 해결 방법:
docker-compose.yml파일에서 포트 매핑을 변경하거나, 호스트 머신에서 해당 포트를 사용하는 다른 프로세스를 중지합니다.
2) 컨테이너 간 통신 문제
컨테이너 간에 통신이 안 되는 경우, 네트워크 설정 또는 서비스 간의 의존성 설정에 문제가 있을 수 있습니다.
- 해결 방법:
docker-compose.yml파일에서 네트워크 설정을 확인하고,depends_on설정을 사용하여 서비스 간의 종속성을 명시적으로 정의합니다. 컨테이너 이름으로 다른 컨테이너에 접근 가능한지 확인합니다. (예:web:80,db:5432)
3) 볼륨 관련 문제
볼륨을 제대로 마운트하지 못하거나, 볼륨에 대한 권한 문제가 발생할 수 있습니다.
- 해결 방법:
docker-compose.yml파일에서 볼륨 마운트 경로를 확인하고, 호스트 머신에서 해당 디렉토리에 대한 접근 권한이 있는지 확인합니다. 권한 문제는 파일 소유권 변경(예:chown) 또는 컨테이너 내 사용자 설정(예:USER지시어)을 통해 해결할 수 있습니다.
4) 이미지 빌드 실패
build 속성을 사용하여 이미지를 빌드하는 경우, Dockerfile에 오류가 있거나, 빌드 컨텍스트에 필요한 파일이 없는 경우 빌드 실패가 발생할 수 있습니다.
- 해결 방법: Dockerfile의 문법 오류를 수정하고, 빌드 컨텍스트에 필요한 파일이 모두 포함되어 있는지 확인합니다.
docker-compose build명령어를 사용하여 빌드 과정을 자세히 확인하고, 오류 메시지를 통해 문제의 원인을 파악합니다.
7. 결론
Docker Compose는 멀티 컨테이너 애플리케이션을 정의하고 관리하는 데 매우 유용한 도구입니다. docker-compose.yml 파일을 사용하여 애플리케이션의 모든 구성 요소를 정의하고, 단일 명령으로 전체 애플리케이션을 관리할 수 있습니다. 이를 통해 개발자는 컨테이너 기반 애플리케이션의 개발과 배포를 더욱 쉽고 효율적으로 수행할 수 있습니다. Docker Compose의 개념과 사용법을 숙지하면, 컨테이너 기술을 더욱 효과적으로 활용하여 애플리케이션 개발 생산성을 향상시킬 수 있습니다.
비슷한 글 추천
2-4. Docker Compose로 멀티 컨테이너 애플리케이션 배포
Docker Compose를 사용하여 복잡한 멀티 컨테이너 애플리케이션(예: 웹 서버, 데이터베이스)을 배포하는 실습을 진행합니다.
1-1. Docker 소개: 컨테이너 기술의 이해
Docker가 무엇인지, 왜 필요한지, 가상 머신과의 차이점을 설명합니다. 컨테이너 기술의 기본적인 개념을 소개합니다.
1-2. Docker 설치 및 기본 사용법
Docker를 설치하고 기본적인 명령어(run, pull, ps, stop, rm)를 사용하여 컨테이너를 생성, 실행, 관리하는 방법을 익힙니다. 간단한 예제를 통해 실습합니다.
2-2. Docker 볼륨: 데이터 영속성 관리
컨테이너의 데이터를 영구적으로 저장하기 위한 볼륨의 개념과 사용법을 학습합니다. 볼륨 생성, 마운트, 관리 방법을 예시와 함께 제시합니다.
Comments (0)
No comments yet. Be the first to comment!
Please to write a comment.