시작하며

서비스의 개발과 CI를 위해 여러 개의 컨테이너를 하나의 프로젝트로서 다루기 위해 Docker Compose를 사용한다. 컨테이너의 옵션과 환경을 정의한 파일을 순차적으로 읽으며 구축한다.

  • 각 컨테이너의 의존성, 네트워크, 볼륨을 함께 정의할 수 있다.
  • 설정 파일에 정의된 서비스의 컨테이너 수를 유동적으로 조절할 수 있다.
  • 서비스 디스커버리는 자동으로 이루어진다.

Docker Compose 사용법

Compose 기본

web, mysql 서비스에 대한 도커 이미지명과 기본적인 포트, 링크 정보를 포함하고 있다. docker-compose ps로 확인하기 위해서는 해당 컨테이너의 프로젝트 경로(직접 명시하지 않았다면 yml 파일이 있던 루트 경로)에서 명령어를 입력해야 한다. docker ps는 어디서든 확인 가능하다.

version: '3.0'
services:
  web:
    image: alicek106/composetest:web
    ports:
      - "80:80"
    links:
      - mysql:db
    command: apachectl -DFOREGROUND
  mysql:
    image: alicek106/composetest:mysql
    command: mysqld    
docker-compose ps
 
     Name               Command           State                Ports              
----------------------------------------------------------------------------------
docker_mysql_1   mysqld                   Up                                      
docker_web_1     apachectl -DFOREGROUND   Up      0.0.0.0:80->80/tcp,:::80->80/tcp

Compose 활용

YAML 파일은 크게 버전 정의, 서비스 정의, 볼륨 정의, 네트워크 정의 4가지 항목으로 구성된다.

주요 질문과 답변

1. 특정 YAML 파일에서 생성된 다수의 프로젝트를 제어하기 위해서는 -f 옵션과 -p 옵션을 사용한다. 각 옵션을 설명하라.

1) -f : yaml 파일의 위치를 지정한다.
2) -p : 프로젝트의 이름을 명시한다.

2. 컨테이너들이 의존관계를 가지는 경우, 선행 컨테이너가 완벽히 준비되고 나서 후행 컨테이너를 실행시키려면 어떤 방법을 사용하는가?

선행 컨테이너의 상태를 확인할 있는 스크립트를 후행 컨테이너의 entrypoint로 지정한다.

3. YAML 파일과 스웜모드를 함께 사용하는 환경에서 생성된 컨테이너의 묶음을 뜻하는 말은 무엇인가? 또, 스택 생성시에 무시되는 YAML 옵션은 무엇인가?

1) 스택(stack)
2) links, depends_on과 같이 의존성을 나타내는 항목. 의존성 개념을 사용하려면 양 컨테이너가 같은 호스트에 생성되어야 하기 때문이다.

4. 도커 컨테이너를 구성하는 3가지 구성요소와 각각의 기능을 설명하라.

1) runC : OCI(Open Container Initiative) 런타임 표준을 준수하는 컨테이너를 생성 및 실행하기 위한 툴
2) containerd : 여러개의 runC 컨테이너 프로세스 및 이미지를 관리하는 주체
3) docker-engine : containerd와 통신해 runC를 사용할 수 있게 하는 엔드유저용 툴

5. on-premise와 cloud 모두에서 사용 가능한 k8s(kubernetes) 서비스는 무엇인가?

kubespray, kubeadm

정리하며

Docker Compose는 여러 컨테이너를 단일 YAML 파일로 정의하고 일괄적으로 관리할 수 있는 도구다. 서비스 간 의존관계, 네트워크, 볼륨을 선언적으로 표현할 수 있어 개발 환경 구성과 CI 파이프라인 구축에 널리 활용된다. 스웜 모드와 함께 사용할 경우 스택 개념으로 확장되며, 이 경우 links, depends_on 같은 의존성 항목은 무시된다는 점을 유의해야 한다.