[Docker] 9. 도커 컴포즈란?

sorzzzzy·2022년 5월 10일
1

Docker&Kubernetes

목록 보기
9/12
post-thumbnail

🏷 도커 컴포즈란?

명령어를 입력하는 데 익숙해져도, 워드프레스처럼 여러 개의 컨테이너로 구성된 시스템을 실행하기에는 조금 번거롭다.

도커 컴포즈시스템 구축과 관련된 명령어를 하나의 텍스트 파일(정의 파일)에 기재해, 명령어 한번에 시스템 전체를 실행하고 종료와 폐기까지 한번에 하도록 도와주는 도구이다.

도커 컴포즈를 사용하면 여러 개의 명령어를 하나의 정의 파일로 합쳐 실행할 수 있다.

도커 컴포즈의 구조

도커 컴포즈는 시스템 구축에 필요한 설정을 YAML 포맷으로 기재한 정의 파일을 이용해 전체 시스템을 일괄 실행(run) 또는 일괄 종료 및 삭제(down)할 수 있는 도구이다.

📌 정의 파일
정의 파일에는 컨테이너나 볼륨을 '어떠한 설정으로 만들지'에 대한 항목이 기재돼 있다.
작성 내용은 도커 명령어와 비슷하지만 도커 명령어는 아니다.

up 커맨드docker run 커맨드와 비슷하다.
정의 파일에 기재된 내용대로 이미지를 내려받고 컨테이너를 생성 및 실행한다.
정의 파일에는 네트워크나 볼륨에 대한 정의도 기재할 수 있어서 주변 환경을 한꺼번에 생성할 수 있다..

down 커맨드컨테이너와 네트워크를 정지 및 삭제한다.
볼륨과 이미지는 삭제하지 않는다.
만약 컨테이너와 네트워크를 삭제 없이 종료만 하고 싶다면, stop 커맨드를 사용한다.


도커 컴포즈와 Dockerfile 스크립트의 차이점

도커 컴포즈는 텍스트 파일에 기재된 정의를 따라 실행된다.

이 부분에서, 이전에 배웠던 Dockerfile 스크립트와 비슷한 부분이 있다고 느낄 수 있지만 분명한 차이점이 존재한다.

결론부터 말하자면, 만드는 대상이 다르다!

  • 도커 컴포즈docker run 명령어를 여러 개 모아놓은 것과 같다.
    컨테이너와 주변 환경을 생성하고 네트워크와 볼륨까지 함께 만들 수 있다.
  • Dockerfile 스크립트는 단지 이미지를 만들기 위한 것으로 네트워크나 볼륨은 만들 수 없다.

📌 도커 컴포즈와 쿠버네티스
쿠버네티스는 도커 컨테이너를 관리하는 도구인 만큼 여러 개의 컨테이너를 다루는 것과 관계가 깊어서, 도커 컴포즈와도 혼동하기 쉽다.

  • 쿠버네티스 : 컨테이너를 관리하는 도구
  • 도커 컴포즈 : 컨테이너를 생성 및 삭제, 컨테이너 관리 기능은 없음

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

도커 컴포즈 설치

도커 컴포즈는 도커 엔진과 별개의 소프트웨어이므로, 도커 컴포즈를 사용하기 전에 먼저 설치를 해야한다.

그러나 도커 컴포즈의 사용법 또한 도커 엔진과 큰 차이가 없어,
일단 설치하고 나면 별개의 소프트웨어라는 점을 신경 쓰지 않아도 될 정도다.
도커 컴포즈로 생성한 컨테이너를 도커 엔진으로 똑같이 관리할 수 있다.
커맨드만 다를 뿐 거의 같은 소프트웨어나 마찬가지이다.

📌 현재 설치해 사용하고 있는 도커 데스크톱은 도커 컴포즈가 함께 설치되기 때문에 따로 설치할 필요가 없다!


도커 컴포즈 사용법

도커 컴포즈를 사용하려면 (Dockerfile 스크립트로 이미지를 빌드할 때처럼) 호스트 컴퓨터에 폴더를 만들고 이 폴더에 정의 파일(YAML 파일)을 배치한다.

정의 파일의 이름은 미리 정해진 docker-compose.yml 이라는 이름을 사용해야 한다.
파일은 호스트 컴퓨터에 배치되지만 명령어는 똑같이 도커 엔진에 전달되며,
만들어진 컨테이너도 동일하게 도커 엔진 위에서 동작한다.

정리하자면, 사람이 하나하나 입력하던 명령어를 도커 컴포즈가 대신 입력해주는 역할을 하는 구조이다.

그리고 정의 파일은 한 폴더에 하나만 존재해야 한다.
여러 개의 정의 파일을 사용하려면 그 개수만큼 폴더를 만들어야 한다.
컨테이너 생성에 필요한 이미지 파일이나 HTML 파일 또한 컴포즈가 사용할 폴더에 둬야 한다.

📌 서비스와 컨테이너
도커 컴포즈에서 컨테이너가 모인 것을 '서비스'라고 한다.
공식 참조문서에는 컨테이너와 서비스라는 두 가지 용어가 함께 사용되는데,
그냥 모두 컨테이너로 이해해도 큰 문제는 없다.
이 책에서는 컨테이너라고 용어를 통일한다.


🏷 도커 컴포즈 파일 작성하기

도커 컴포즈 정의 파일의 내용 살펴보기

정의 파일은 YAML 형식으로 확장자는 .yml 이다.

파일 이름은 docker-compose.yml 을 사용해야 하고,
-f 옵션을 사용해 파일 이름을 지정하면 다른 이름을 사용해도 되지만 그렇지 않으면 정해진 이름을 사용해야 한다.

✔️ 아파치 컨테이너의 컴포즈 파일 예제

version: "3"

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

➡️ docker run --name apa000ex2 -d -p 8080:80 httpd


✔️ 워드프레스 컨테이너의 컴포즈 파일 예제

version: "3"

services:
  wordpress000ex12:
    depends_on:
      - mysql000ex11
    image: wordpress
    networks:
      - wordpress000net1
    ports:
      - 8085:80
    restart: always
    environment:
      WORDPRESS_DB_HOST=mysql000ex11
      WORDPRESS_DB_NAME=wordpress000db
      WORDPRESS_DB_USER=wordpress000kun
      WORDPRESS_DB_PASSWORD=wkunpass

➡️ 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


컴포즈 파일을 작성하는 법

컴포즈 파일은 주 항목 ➡️ 이름 추가 ➡️ 설정 의 순서로 작성한다.
주요 항목에는 서비스와 네트워크, 볼륨 등이 존재한다.

1. version

맨 위의 version 에는 컴포즈 파일의 버전을 적는다.

2. services - 컨테이너 관련 정보

services 는 컨테이너에 대한 내용을 적는다.
컨테이너가 여러 개라면, 여러 개를 적는다.

3. networks - 네트워크 관련 정보

networks 는 네트워크 이름을 적는다.

4. volumes - 볼륨 관련 정보

volumes 은 볼륨 이름을 적는다.

5. 파일 형식

  • YAML 형식에서는 공백에 따라 의미가 달라지므로 탭은 의미가 없으며 '공백 두 개'로 맨 처음 들여쓰기를 했다면 그 뒤로도 '공백 두 개'가 한 단이 되도록 해야 한다.

  • 주요 항목을 적고 이름을 적을 땐 주 항목보다 한 단 들여쓰기를 해야 한다.

  • 이름 뒤에는 반드시 : 을 붙인다.

  • 이름을 기재한 다음, 각 컨테이너의 설정을 기재한다.

    • 기재할 내용이 하나라면 콜론 뒤에 이어 적는다.
    • 두개 이상이라면 줄을 바꿔 하이픈(-) 을 앞에 적고 들여쓰기를 맞춘다.

📌 컴포즈 파일(YAML) 작성 요령 정리

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

컴포즈 파일의 항목

컴포즈 파일의 항목을 정리해보자.

✔️ 주 항목

  • services : 컨테이너 정의
  • networks : 네트워크 정의
  • volumes : 볼륨 정의

✔️ 자주 나오는 정의 내용

(항목, docker run 커맨드의 해당 옵션 또는 인자, 내용 순서)

  • image / 이미지 인자 : 사용할 이미지를 지정
  • networks / --net : 접속할 네트워크를 지정
  • volumes / -v, --mount : 스토리지 마운트를 설정
  • ports / -p : 포트 설정
  • environment / -e : 환경변수 설정
  • depends_on : 다른 서비스에 대한 의존관계 정의
  • restart : 컨테이너 종료 시 재시작 여부를 설정

도커 엔진 명령어에서는 보지 못했던 항목으로 depends_onrestart 이 있다.

depends_on다른 서비스에 대한 의존관계를 나타낸다.
컨테이너를 생성하는 순서나 연동 여부를 정의한다.
워드프레스처럼 MySQL 컨테이너가 먼저 있어야 하는 경우와 같이, 컨테이너 생성 순서를 지정하는 데 쓸 수 있다.

restart컨테이너 종료 시 재시작 여부를 설정한다.


🏷 실습 - 도커 컴포즈 실행

이번 실습은 이전에 생성했던 '워드프레스 및 MySQL 컨테이너'와 동일한 컨테이너를 만드는 컴포즈 파일을 작성하는 것이다.

컴포즈 파일 직접 작성

✔️ docker-compose.yml

version: "3"
services:
  mysql000ex11:
    platform: linux/x86_64  # 추가된 옵션
    image: mysql:5.7
    networks:
      - wordpress000net1
    volumes:
      - mysql000vol11:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: myrootpass
      MYSQL_DATABASE: wordpress000db
      MYSQL_USER: wordpress000kun
      MYSQL_PASSWORD: wkunpass
  wordpress000ex12:
    depends_on:  # 의존관계 설정
      - mysql000ex11
    image: wordpress
    networks:
      - wordpress000net1
    volumes:
      - wordpress000vol12:/var/www/html
    ports:
      - 8085:80
    restart: always
    environment:
      WORDPRESS_DB_HOST: mysql000ex11
      WORDPRESS_DB_NAME: wordpress000db
      WORDPRESS_DB_USER: wordpress000kun
      WORDPRESS_DB_PASSWORD: wkunpass
networks:
  wordpress000net1:
volumes:
  mysql000vol11:
  wordpress000vol12:
  • MySQL 컨테이너를 먼저 만들어야 하므로 앞에 작성하고, 워드프레스 컨테이너에 depends_on 항목을 추가해 의존관계를 설정한다.
  • 맨 마지막에 볼륨 정보도 추가한다.

바탕화면에 com_folder 라는 새로운 디렉토리를 생성한 뒤, 작성한 컴포즈 파일을 디렉토리 안에 둔다.


도커 컴포즈 실행

지금까지는 도커 엔진을 통해 명령을 실행하는 docker 커맨드를 사용했지만,
도커 컴포즈는 docker-compose 커맨드를 사용한다.

가장 자주 사용하는 커맨드는 up down stop 이다.
up 커맨드컴포즈 파일에 정의된 컨테이너 및 네트워크를 생성하고,
down 커맨드생성된 컨테이너와 네트워크를 종료하고 삭제한다.

✔️ docker-compose up 커맨드

docker-compose -f [정의_파일_경로] up [옵션]

docker-compose up 커맨드를 실행하면 컴포즈 파일의 정의대로 컨테이너 및 주변 환경이 생성된다.
-d 옵션을 사용해 백그라운드에서 실행하고, -f 옵션으로 컴포즈 파일의 경로를 지정한다.

ls 커맨드로 컨테이너, 이미지, 네트워크, 볼륨 정보를 확인한다.

워드프레스의 초기 화면이 나타나는지 확인한다.


✔️ docker-compose up 커맨드

docker-compose -f [정의_파일_경로] down [옵션]

docker-compose down 커맨드를 실행해 컨테이너와 네트워크를 종료 및 삭제한다.
-f 옵션으로 컴포즈 파일의 경로를 지정한다.

삭제가 잘 됐는지 확인한다.

📌 이미지와 볼륨은 직접 삭제해야 한다.
down 커맨드는 컨테이너와 네트워크 정보만 삭제하므로, 이미지와 볼륨은 따로 삭제해야 한다.

profile
Backend Developer

0개의 댓글