Container

[Docker] Docker Compose의 개념, 사용법, 명령어 정리

Jingni 징니 2022. 7. 9. 20:54

 

[Docker] Docker Compose의 개념, 사용법, 명령어 정리

 


 

📍 도커 컴포즈란?

  • 시스템 구축과 관련된 명령어를 하나의 텍스트 파일(정의 파일, Compose File)에 기재해 명령어 한번에 시스템 전체를 실행하고 종료와 폐기까지 한번에 하도록 도와주는 도구
  • 시스템 구축에 필요한 설정을 YAML(YAML Ain’t a Markup Language) 포맷으로 기재한 정의 파일을 이용해 전체 시스템을 일괄 실행(run) 또는 종료 및 삭제(down) 할 수 있는 도구
  • 도커 컴포즈를 사용하면 여러 개의 명령어를 하나의 정의 파일로 합쳐 실행할 수 있다.

구조

  • 정의 파일(compose file) : 컨테이너나 볼륨을 어떠한 설정으로 만들지에 대한 항목뿐만 아니라 시스템에 대한 모든 정보가 기재됨. 작성 내용은 도커 명령어와 비슷하지만 다름.
    • up 명령어
      • docker run 커맨드와 비슷
      • 정의 파일에 기재된 내용대로 이미지를 내려받고 컨테이너를 생성 및 실행.
      • 정의 파일에는 네트워크나 볼륨에 대한 정의도 기재할 수 있어서 주변 환경을 한꺼번에 생성 가능함.
    • down 명령어
      • 컨테이너와 네트워크를 정지 및 삭제.
      • 볼륨과 이미지는 삭제하지 않음
      • 컨테이너와 네트워크 삭제 없이 종료만 하고 싶다면 stop 커맨드를 사용.
  • Docker compose vs Dockerfile script vs K8s
    • Docker compose는 docker run 명령어를 여러 개 모아놓은 것과 같으며, 컨테이너와 주변 환경(네트워크, 볼륨 등) 을 한번에 생성할 수 있다.
    • Dockerfile script는 컨테이너가 아닌 이미지를 만들기 위한 도구로, 네트워크나 볼륨같은 컨테이너 주변 환경들은 생성이 불가능하다.
    • k8s는 도커 컨테이너를 관리하는 도구로 도커 컴포즈와 혼동하기 쉬우나 사용 목적 자체가 다르다. 도커 컴포즈로 컨테이너 관리는 불가능하다.

 

📍 도커 컴포즈의 설치와 사용법

  • 도커 컴포즈는 도커 엔진과 별개의 소프트웨어이나 도커 컴포즈로 생성한 컨테이너를 도커 엔진으로 똑같이 관리할 수 있음.
  • Window, MacOS의 도커 데스크톱은 도커 컴포즈가 함께 설치되지만, 리눅스에서는 도커 컴포즈와 python3 런타임 및 필요 도구(python3, python3-pip package)를 설치해야 함
# python 관련 package install (debian 계열 Linux 기준 명령어)
$ sudo apt install -y python3 python3-pip
$ sudo pip3 install docker-compose
  • 도커 컴포즈 사용법
    1. 호스트 컴퓨터에 폴더를 만들고 이 폴더에 YAML 파일을 배치함
    2. 정의 파일의 이름은 미리 정해진 docker-compose.yml 이라는 이름을 사용해야 함 (다른 이름을 사용할 때는 인자로 이름을 지정해줘야 함)
    3. 파일은 호스트 컴퓨터에 배치되지만 명령어는 똑같이 도커 엔진에 전달됨. 즉, 도커 컴포즈가 명령어를 대신 입력해주는 구조.
    4. 만들어진 컨테이너도 동일하게 도커 엔진 위에서 동작함
    5. 정의 파일은 한 폴더에 하나만 있을 수 있음
      • 여러 개의 정의 파일을 사용하려면 그 개수만큼 폴더를 만들어야 함
      • 이미지 파일이나 HTML 파일도 컴포즈가 사용할 폴더에 함께 둠
  • 도커 컴포즈에서는 컨테이너가 모인 것을 서비스라고 부르며, 보통 공식 문서에서는 컨테이너와 서비스 두 용어가 혼용되고 있음.

 

📍 도커 컴포즈 파일을 작성하는 법

  • 도커 컴포즈는 정의 파일(compose file)을 그대로 실행하는 역할을 수행하므로 정의 파일이 반드시 필요하다.

ex1) apa000ex2 컨테이너를 실행하는 명령어와 아파치 컨테이너의 컴포즈 파일

$ docker run —name apa000ex2 -d -p 8080:80 httpd
 version: "3"

 services:
    apa000ex2:
      image: httpd
      ports:
        -8080:80
      restart: always

ex2) apa000ex2 컨테이너를 실행하는 명령어와 아파치 컨테이너의 컴포즈 파일

$ docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 -e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress
 version: "3"

 services:
   wordpress000ex12:
     depends_on:
       - mysql000ex11
     image: wordpress
     networks:
       - wordpress000net1
     ports:
       - 8080:80
     restart: always
     environment:
       WORDPRESS_DB_HOST=mysql000ex11
       WORDPRESS_DB_NAME=wordpress000db
       WORDPRESS_DB_USER=wordpress000kun
       WORDPRESS_DB_PASSWORD=wkunpas
  • 정의 파일은 YAML 형식을 따름 (파일 확장자는 .yml)
  • 파일 이름은 기본적으로 docker-compose.yml로 지정 (다른 이름을 사용할 경우 -f 옵션을 사용해야 지정 가능)

 

컴포즈 파일을 작성하는 방법

  • YAML 형식에서는 공백에 따라 의미가 달라지므로 탭은 의미가 없다.
  • ‘주 항목 → 이름 추가 → 설정’ 순서로 작성
    • 주 항목
      • services, networks, volumes 등등
    • 주 항목 아래에 이름 추가 (공백으로 들여쓰기 필요)
      • 컨테이너 이름, 네트워크 이름, 볼륨 이름
      • 이름 뒤에는 반드시 콜론(:)을 붙여야 함
      • 해당 줄에 이어서 컨테이너 설정을 기재하려면 콜론 뒤로 공백이 하나 있어야 함
    • 설정
      • 기재할 내용이 한 가지라면 콜론 뒤에 이어서 작성 (사이에 공백 필수)
      • 내용이 여러 개라면 줄을 바꿔 하이픈(-)을 앞에 적고 들여쓰기를 맞춰야 함
      • 하이픈을 앞에 적은 행은 다시 공백을 넣어 들여 써줘야 함

컴포즈 파일 (YAML 형식)의 작성 요령

  • 첫 줄에 도커 컴포즈 버전을 기재
  • 주 항목 services, networks, volumes 아래에 설정 내용을 기재
  • 항목 간의 상하 관계는 공백을 사용한 들여쓰기로 나타낸다.
  • 들여쓰기는 같은 수의 배수만큼의 공백을 사용한다.
  • 이름은 주 항목 아래에 들여쓰기한 다음 기재한다.
  • 컨테이너 설정 내용은 이름 아래에 들여쓰기한 다음 기재한다.
  • 여러 항목을 기재하려면 줄 앞에 ‘-’를 붙인다.
  • 이름 뒤에는 콜론(:)을 붙인다.
  • 콜론 뒤에는 반드시 공백이 와야 한다(바로 줄바꿈하는 경우는 예외)
  • # 뒤의 내용은 주석으로 간주된다.
  • 문자열은 작은따옴표(’) 또는 큰따옴표(”)로 감싸 작성한다.

컴포즈 파일의 항목

항목 docker run 커맨드의 해당 옵션 또는 인자 내용
version - 도커 컴포즈의 버전을 기재한다.
services - 컨테이너를 정의한다. (컨테이너의 집합체를 주로 서비스라고 한다.)
image 이미지 인자 사용할 이미지를 지정
networks —net 접속할 네트워크를 지정
volumes -v, —mount 스토리지 마운트(볼륨)를 설정
ports -p 포트 설정
environment -e 환경변수 설정
depends_on 없음 다른 서비스에 대한 의존관계를 정의
restart 없음 컨테이너 종료 시 재시작 여부를 설정
  • depends_on은 다른 서비스에 대한 의존관계를 나타냄
    • 컨테이너를 생성하는 순서나 연동 여부를 정의
    • ex. penguin 컨테이너의 정의에 ‘depends_on: -namgeuk” 내용이 포함됐다면 namgeuk 컨테이너를 생성한 다음에 penguin 컨테이너를 만듦 : 워드프레스처럼 MySQL 컨테이너가 먼저 있어야 하는 경우에 컨테이너 생성 순서를 지정
  • restart는 컨테이너 종료 시 재시작 여부를 설정함
설정값 내용
no 재시작하지 않는다.
always 항상 재시작한다.
on-failure 프로세스가 0 외의 상태로 종료됐다면 재시작한다.
unless-stopped 종료 시 재시작하지 않음. 그 외에는 재시작한다.

실습 예제

1. docker-compose.yml 파일 생성 (com_folder 안에)
2. 주 항목 작성
3. 이름 작성
4. MySQL 컨테이너의 정의 작성
5. 워드 프레스 컨테이너의 정의 작성
6. 파일 저장

docker-compose.yml 파일 생성 결과

 

📍 도커 컴포즈 실행

  • 도커 컴포즈는 docker-compose 명령을 사용
  • -f 옵션을 통해 compose file 경로 지정
  • docker-compose up : 컴포즈 파일에 정의된 컨테이너 및 네트워크와 같은 주변 환경 생성
    • $ docker-compose -f [정의_파일_경로] up [옵션]

    옵션 내용
    -d 백그라운드로 실행
    —-no-color 화면 출력 내용을 흑백으로 함
    —-no-deps 링크된 서비스를 실행하지 않음
    —-force-recreate 설정 또는 이미지가 변경되지 않더라도 컨테이너를 재생성
    —-no-create 컨테이너가 이미 존재할 경우 다시 생성하지 않음
    —-no-build 이미지가 없어도 이미지를 빌드하지 않음
    —-build 컨테이너를 실행하기 전에 이미지를 빌드
    —-absort-on-container-exit 컨테이너가 하나라도 종료되면 모든 컨테이너를 종료
    -t, —timeout 컨테이너를 종료할 떄의 타임아웃 설정, 기본은 10초
    —-remove-orphans 컴포즈 파일에 정의되지 않은 서비스의 컨테이너를 삭제
    —-scale 컨테이너의 수를 변경
  • docker-compose down : 생성 된 컨테이너와 네트워크를 종료하고 삭제
    • $ docker-compose -f [컴포즈_파일_경로] down [옵션]

    옵션 내용
    —-rmi 종류 삭제 시에 이미지도 삭제한다. 종류를 all로 지정하면 사용했던 모든 이미지가 삭제된다. local로 지정하면 커스텀 태그가 없는 이미지만 삭제한다.
    -v, —volumes volumes 항목에 기재된 볼륨을 삭제한다. 단, external로 지정된 볼륨은 삭제되지 않는다.
    —-remove-orphans 컴포즈 파일에 정의되지 않은 서비스의 컨테이너도 삭제한다.
  • docker-compose stop : 컨테이너를 종료
    • $ docker-compose -f [컴포즈_파일_경로] stop [옵션]
  • docker-compose [명령어] -d
    • -d 옵션을 붙이고 경로 정의 없이 도커 컴포즈 명령어를 실행하면 현재 작업 디렉터리를 컴포즈용 폴더로 사용할 수 있다.
  • --scale 옵션
    • 같은 구성의 컨테이너를 여러 세트 만들고 싶은 경우 사용할 수 있는 옵션.

실습 예제

$ docker-compose up -d 
  Creating network "com_folder_wordpress000net1" with the default driver
  Creating volume "com_folder_mysql000vol11" with default driver
  Creating volume "com_folder_wordpress000vol12" with default driver
  Pulling mysql000ex11 (mysql:5.7)...
  5.7: Pulling from library/mysql
  66fb34780033: Pull complete
  4b7eaab7220f: Pull complete
  ...
  f8575f2324da: Pull complete
  b4c26cf54614: Pull complete
  Digest: sha256:4279d155f8cab19149c6078b20d53976f1498e31d6f848ac83e11323909b41f1
  Status: Downloaded newer image for mysql:5.7
  Pulling wordpress000ex12 (wordpress:)...
  latest: Pulling from library/wordpress
  b85a868b505f: Already exists
  78fdfd2598e0: Pull complete
  26769c8659f4: Pull complete
  0bd105fadbe3: Pull complete
  cec5cceb91d7: Pull complete
  ca31293bb368: Pull complete
  ...
  b6a172e68ef0: Pull complete
  d251d6673035: Pull complete
  62b30aea4447: Pull complete
  9b5a3cabe1fe: Pull complete
  df30812aac94: Pull complete
  Digest: sha256:1134d9db6eccc6fdca73176e5ffed7b5516638a9ed36169d21e2692495e8fe2f
  Status: Downloaded newer image for wordpress:latest
  Creating com_folder_mysql000ex11_1 ... done
  Creating com_folder_wordpress000ex12_1 ... done

$ docker ps
  CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS         PORTS                  NAMES
  477023ba29c6   wordpress   "docker-entrypoint.s…"   4 seconds ago    Up 3 seconds   0.0.0.0:8085->80/tcp   com_folder_wordpress000ex12_1
  3aaa8e52d2eb   mysql:5.7   "docker-entrypoint.s…"   11 seconds ago   Up 3 seconds   3306/tcp, 33060/tcp    com_folder_mysql000ex11_1

$ docker network ls
  NETWORK ID     NAME                          DRIVER    SCOPE
  19e014ef7475   bridge                        bridge    local
  c6c78f97b7fb   com_folder_wordpress000net1   bridge    local
  94cf1f2451f9   host                          host      local

$ docker volume ls
  DRIVER    VOLUME NAME
  local     com_folder_mysql000vol11
  local     com_folder_wordpress000vol12
  
$ docker-compose stop   
  [+] Running 2/2
   ⠿ Container com_folder_mysql000ex11_1      Stopped                                                                                                          1.8s
   ⠿ Container com_folder_wordpress000ex12_1  Stopped
   
$ docker ps -a
  CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS                       PORTS                  NAMES
  477023ba29c6   wordpress        "docker-entrypoint.s…"   6 minutes ago   Exited (0) 20 seconds ago                           com_folder_wordpress000ex12_1
  3aaa8e52d2eb   mysql:5.7        "docker-entrypoint.s…"   6 minutes ago   Exited (0) 19 seconds ago                           com_folder_mysql000ex11_1

$ docker-compose down
  Removing com_folder_wordpress000ex12_1 ... done
  Removing com_folder_mysql000ex11_1     ... done
  Removing network com_folder_wordpress000net1 ## 네트워크만 삭제됨. 볼륨과 이미지는 그대로.
  
$ docker ps -a
CONTAINER ID   IMAGE            COMMAND                  CREATED      STATUS                        PORTS                  NAMES

 


 

본문의 내용은 그림과 실습으로 배우는 도커&쿠버네티스 (오가사와라 시게타카 저, 심효섭 옮김) 을 읽고 작성하였습니다.

http://www.yes24.com/Product/Goods/108431011

 

그림과 실습으로 배우는 도커 & 쿠버네티스 - YES24

컨테이너나 도커를 도통 이해하기 어려운 분들을 위한 본격 도커 입문서!이 책은 컨테이너 기술이 어렵게 느껴지는 엔지니어나 백엔드 기술에 자신이 없는 분들을 위한 도커 입문서다. 자세한

www.yes24.com