Docker Compose란 무엇인가?
Docker Compose는 여러 개의 컨테이너로부터 이루어진 서비스를 구축하고 실행하는 툴입니다. Kubernetes처럼 YAML 파일로 여러 개의 컨테이너 내부 속성을 설정하고 한 번에 실행시킬 수 있습니다. 예를 들어, 웹 애플리케이션을 개발할 때 웹 서버, 데이터베이스, 캐시 등의 다양한 컨테이너를 필요로 할 수 있는데, Docker Compose를 사용하면 이러한 컨테이너들을 쉽게 관리하고 연동할 수 있습니다.
MacOS(Apple Silicon)에서 Docker Desktop 설치하기
MacOS(Apple Silicon)에서 Docker Compose를 사용하기 위해서는 먼저 Docker Desktop을 설치해야 합니다. Docker Desktop은 Mac과 Windows에서 도커 엔진과 함께 제공되는 애플리케이션으로, 도커 컨테이너와 이미지를 관리하고 설정할 수 있는 GUI 인터페이스와 CLI 명령어를 제공합니다.
Docker Desktop을 설치하는 방법은 다음과 같습니다.
- Docker 공식 홈페이지에 접속하여 자신의 OS 버전에 맞게 다운로드합니다.
- 다운로드한 파일을 실행하여 설치 과정을 따릅니다.
- 설치가 완료되면 Mac의 경우 우측 상단에 도커 아이콘이 표시되고 Windows의 경우 우측 하단 트레이에 도커 아이콘이 표시됩니다.
- 도커 아이콘을 클릭하여 Preferences 메뉴를 선택합니다.
- Experimental Features 탭에서 Use Docker Compose V2 체크박스를 선택합니다. 이렇게 하면 최신 버전의 Docker Compose가 활성화됩니다.
Docker Compose 최신버전 다운로드 및 업그레이드하기
Docker Desktop을 설치하면 기본적으로 Docker Compose도 함께 설치됩니다. 하지만 만약 최신 버전의 Docker Compose가 필요하거나 업그레이드하고 싶다면 다음과 같은 방법으로 할 수 있습니다.
- Docker Compose 공식 홈페이지에 접속하여 최신 버전의 바이너리 파일 링크를 복사합니다.
- 터미널에서 다음 명령어를 입력하여 바이너리 파일을 다운로드합니다.
sudo curl -L "복사한 링크" -o /usr/local/bin/docker-compose
- 터미널에서 다음 명령어를 입력하여 바이너리 파일에 실행 권한을 부여합니다.
sudo chmod +x /usr/local/bin/docker-compose
- 터미널에서 다음 명령어를 입력하여 현재 버전을 확인합니다.
docker-compose --version
Docker Compose로 컨테이너 관리하기
Docker Compose는 YAML 파일로 여러 개의 컨테이너 설정을 정의할 수 있습니다. YAML 파일은 보통 YAML 파일은 보통 docker-compose.yml이라는 이름으로 저장하고, 도커 컴포즈 명령어를 통해 실행할 수 있습니다. YAML 파일의 기본 구조는 다음과 같습니다.
version: "3.9" # 도커 컴포즈 버전
services: # 서비스 정의
service1: # 서비스 이름
image: image1 # 사용할 이미지 이름
ports: # 포트 매핑
- "5000:5000"
volumes: # 볼륨 마운트
- .:/code
environment: # 환경 변수 설정
- DEBUG=1
service2:
image: image2
depends_on: # 의존성 설정
- service1
이렇게 작성한 YAML 파일을 터미널에서 다음 명령어로 실행할 수 있습니다.
docker-compose up # 모든 서비스 실행하기
docker-compose up -d # 백그라운드에서 모든 서비스 실행하기
docker-compose up service1 service2 # 특정 서비스만 실행하기
docker-compose down # 모든 서비스 중지하고 제거하기
docker-compose stop # 모든 서비스 중지하기
docker-compose start # 모든 서비스 시작하기
docker-compose restart # 모든 서비스 재시작하기
docker-compose ps # 현재 실행중인 서비스 상태 확인하기
docker-compose logs # 로그 확인하기
Docker Compose로 멀티 컨테이너 애플리케이션 구성하기
Docker Compose를 사용하면 여러 개의 컨테이너로 이루어진 복잡한 애플리케이션을 쉽게 구성하고 관리할 수 있습니다. 예를 들어, 웹 애플리케이션을 개발할 때 웹 서버, 데이터베이스, 캐시 등의 다양한 컨테이너를 필요로 할 수 있는데, Docker Compose를 사용하면 이러한 컨테이너들을 하나의 YAML 파일로 정의하고 연동할 수 있습니다.
다음은 Flask 웹 프레임워크와 Redis 데이터베이스를 사용하는 간단한 웹 애플리케이션을 Docker Compose로 구성하는 예시입니다.
먼저, Flask 애플리케이션 코드를 작성합니다. app.py라는 파일에 다음과 같은 코드를 작성합니다.
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host="redis", port=6379)
@app.route("/")
def hello():
count = redis.incr("hits")
return f"Hello World! I have been seen {count} times."
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
다음으로, Flask 애플리케이션을 위한 도커 이미지를 빌드하는 Dockerfile을 작성합니다. Dockerfile에 다음과 같은 코드를 작성합니다.
FROM python:3.9-alpine
WORKDIR /code
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY app.py .
CMD ["python", "app.py"]
requirements.txt 파일에는 Flask와 Redis 패키지가 필요합니다.
flask==2.0.2
redis==4.0.2
마지막으로, docker-compose.yml 파일을 작성하여 Flask와 Redis 컨테이너를 정의하고 연결합니다. docker-compose.yml에 다음과 같은 코드를 작성합니다.
version: "3"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
이제 터미널에서 다음 명령어로 애플리케이션을 실행할 수 있습니다.
docker-compose up
웹 브라우저에서 http://localhost:5000에 접속하면 Flask 애플리케이션이 실행되고 Redis 데이터베이스와 통신하는 것을 확인할 수 있습니다.
Docker Compose YAML 파일 작성법
Docker Compose YAML 파일은 여러 개의 컨테이너를 정의하고 설정하는 방법입니다. YAML 파일은 보통 docker-compose.yml이라는 이름으로 저장하고, 도커 컴포즈 명령어를 통해 실행할 수 있습니다. YAML 파일의 기본 구조는 다음과 같습니다.
version: "3.9" # 도커 컴포즈 버전
services: # 서비스 정의
service1: # 서비스 이름
image: image1 # 사용할 이미지 이름
ports: # 포트 매핑
- "5000:5000"
volumes: # 볼륨 마운트
- .:/code
environment: # 환경 변수 설정
- DEBUG=1
service2:
image: image2
depends_on: # 의존성 설정
- service1
YAML 파일에서 사용할 수 있는 주요 옵션들은 다음과 같습니다.
- image: 사용할 도커 이미지의 이름을 지정합니다. 이미지가 로컬에 없으면 도커 허브에서 자동으로 다운로드합니다.
- build: 도커 이미지를 빌드하기 위한 경로나 설정을 지정합니다. Dockerfile이 있는 디렉토리나 URL을 입력하거나 context, dockerfile 등의 옵션을 사용할 수 있습니다.
- command: 컨테이너가 시작될 때 실행할 명령어를 지정합니다. Dockerfile의 CMD와 비슷하지만 오버라이드됩니다.
- ports: 호스트와 컨테이너 간에 포트를 매핑합니다. 호스트 포트와 컨테이너 포트를 콜론(:)으로 구분하여 입력하거나 프로토콜(tcp/udp)도 함께 입력할 수 있습니다.
- expose: 컨테이너가 내부적으로 열어두는 포트를 지정합니다. 외부에 노출되지 않으며 같은 네트워크에 있는 다른 서비스들과 연결됩니다.
- volumes: 호스트와 컨테이너 간에 볼륨을 마운트합니다. 호스트 경로와 컨테이너 경로를 콜론(:)으로 구분하여 입력하거나 읽기 전용(read-only) 옵션도 추가할 수 있습니다.
- environment: 컨테이너 내부에서 사용할 환경 변수를 지정합니다. 키=값 형식으로 입력하거나 .env 파일을 참조할 수 있습니다.
- env_file: 환경 변수가 정의된 파일의 경로를 지정합니다. .env 형식의 파일을 사용하면 여러 개의 환경 변수를 한 번에 설정할 수 있습니다.
- depends_on: 서비스 간에 의존성을 지정합니다. depends_on 옵션에 의존하는 서비스는 depends_on 옵션에 명시된 서비스들보다 나중에 시작됩니다.
- networks: 컨테이너가 속할 네트워크를 지정합니다. 도커 컴포즈는 기본적으로 모든 서비스를 하나의 네트워크에 연결하지만, networks 옵션을 사용하면 여러 개의 네트워크를 생성하고 컨테이너를 할당할 수 있습니다.
- links: 컨테이너 간에 링크를 생성합니다. 링크된 컨테이너는 서로 호스트 이름으로 접근할 수 있습니다. 네트워크 옵션과 함께 사용할 수 있습니다.
- restart: 컨테이너가 종료될 때 재시작 정책을 지정합니다. no, always, on-failure, unless-stopped 중에서 선택할 수 있습니다.
- healthcheck: 컨테이너의 건강 상태를 검사하는 방법을 지정합니다. test, interval, timeout, retries 등의 옵션을 사용할 수 있습니다.
YAML 파일에는 services 외에도 다른 항목들을 정의할 수 있습니다.
- volumes: 여러 개의 서비스에서 공유하는 볼륨을 정의합니다. 이름과 드라이버 등의 옵션을 지정할 수 있습니다.
- networks: 여러 개의 서비스에서 공유하는 네트워크를 정의합니다. 이름과 드라이버 등의 옵션을 지정할 수 있습니다.
- configs: 여러 개의 서비스에서 공유하는 설정 파일을 정의합니다. 이름과 파일 경로 등의 옵션을 지정할 수 있습니다.
- secrets: 여러 개의 서비스에서 공유하는 비밀 정보를 정의합니다. 이름과 파일 경로 등의 옵션을 지정할 수 있습니다.
Docker Compose YAML 파일 작성법에 대해 알아보았습니다. Docker Compose는 멀티 컨테이너 애플리케이션 구성하기에 유용한 도구입니다.
'Dev' 카테고리의 다른 글
소프트웨어 기능 명세서 작성 방법 (0) | 2023.03.08 |
---|---|
소프트웨어 개발 요구사항 명세서 작성 방법 (0) | 2023.03.08 |
Docker 기본 명령어 튜토리얼 (0) | 2023.03.01 |
Ubuntu에서 Docker Compose 설치 및 사용 방법 (0) | 2023.03.01 |
Ubuntu에 Docker를 설치하는 방법 (0) | 2023.03.01 |