본문 바로가기
Docker

Docker - docker compose 기본 사용법

by DGK 2021. 12. 22.

 

도커 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.

 

docker compose 기본 사용법

docker compose의 기본 작성법과 주요 명령들을 이해하고자 한다.

 

docker compose 란?

docker compose는 여러 개의 docker container를 모아서 관리하기 위한 툴이다.

 

웹 서비스는 일반적으로 프론트엔드 서버, 벡엔드 서버, 데이터베이스 서버로 구성되기 때문에 각 서버를 docker container로 연결하여 동작시키고 docker compose를 사용하여 해당 컨테이너들을 관리하는 것이다. 

 

 

docker compose의 기본 작성법

docker compose는 docker-compose.yml 파일을 작성하여 실행할 수 있다.

docker-compose.yml 파일은 YAML(야멜) 형식으로 작성해야 한다.

 

 

*참고(YAML 문법)

 

YAML 문법은 들여쓰기와 함께 key와 value를 중심으로 작성된다.

해당 문법은 기본적으로 숫자형, 문자형, Boolean 자료형을 지원한다.

 

기본 문법

 

   - # : 해당 라인을 주석처리

   - --- : 문서의 시작을 알림(옵션)

   - ... : 문서의 끝을 알림(옵션)

   - key : 딕셔너리 자료형의 키 값과 동일 개념

   - value : 딕셔너리 자료형의 벨류 값과 동일 개념

 

 

*예시

YAML문법과 JSON문법 비교
YAML문법과 JSON문법 비교

참고로, " | "는 마지막 줄바꿈을 포함하겠다는 의미의 줄바꿈 표시이다.

 

YAML문법과 JSON문법 비교

참고로, " |- "는 마지막 줄바꿈을 포함하지 않겠다는 의미의 줄바꿈 표시이다.

 

YAML문법과 JSON문법 비교

참고로, " > "는 중간에 있는 줄바꿈을 무시하는 의미의 줄바꿈 표시이다.

 

 

예제를 통한 docker compose 사용법 이해하기

docker-compose.yml 예제 코드를 통해 docker compose 사용법을 이해하고자 한다.

 

*docker-compose.yml 예시(1)

version: "3"

service:
  db:
    image: mysql:5.7
    restart: always
    volumes:
      - ./mysqldata:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=dgkcoding
      - MYSQL_DATABASE=dgkdb
    ports:
      - "3306:3306"

 

기본적으로 docker-compose.yml은 version, services, volumes, networks의 카테고리로 작성된다.

하지만, 주로 version과 services가 많이 사용된다.

 

- version 

 

docker compose의 파일 포맷 버전을 지정한다.

기본적으로 버전 3을 사용하는 것이 일반적이다. 

 

- services

 

한개 또는 여러 개의 docker container를 설정한다.

 

- image

 

docker container의 이름을 정의한다. 

Docker Hub에 있는 이미지를 사용하여 docker container를 작성할 경우 image를 설정할 수 있다.

 

- restart

 

docker container가 다운되었을 경우, 항상 재시작하라는 설정이다.

 

- volumes

 

docker run 명령의 -v 옵션과 동일한 역할을 한다.

여러 개의 volume을 지정할 수 있으며 리스트처럼 작성하면 된다.

 

- environment

 

dockerfile의 ENV 옵션과 동일한 역할을 한다.

참고로, env_file 옵션으로 환경변수 값이 들어있는 파일을 읽을 수도 있다. (패스워드 등의 보안을 위한 방법)

 

(참고)

env_file 포맷

$ cat mysql.env
MYSQL_ROOT_PASSWORD=dgkcoding
MYSQL_DATABASE=dgkdb

 

- ports

 

docker run 명령의 -p 옵션과 동일한 역할을 한다.

참고로, 포트번호를 입력할 때에는 반드시 쌍따옴표 안에 작성해야 한다. (YAML 문법에서 숫자:숫자 는 시간으로 해석하기 때문)

 

- networks

 

docker container 간의 네트워크 분리를 위해 추가로 설정을 한다. (옵션)

 

 

*docker-compose.yml 예시(2)

version: "3"

services:
  app:
    build:
      context: ./01_FLASK_DOCKER
      dockerfile: Dockerfile
    links:
      - "db:mysqldb"
    ports:
      - "80:8080"
    container_name: appcontainer
    depends_on:
      - db
  db:
    image: mysql:5.7
    restart: always
    volumes:
      - ./mysqldata:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=dgkcoding
      - MYSQL_DATABASE=dgkdb
    ports:
      - "3306:3306"
    container_name: dbcontainer

 

- build

 

docker image를 Dockerfile 기반으로 작성 시 사용한다.

참고로, context는 Dockerfile이 있는 디렉토리를 의미하며 dockerfile은 Dockerfile의 파일명을 의미한다.

 

- links (docker run 명령의 -link 옵션과 유사한 기능)

 

특정 docker container 내부에서 다른 docker container에 접속하고 싶을 때 사용한다.

위의 YAML 파일의 예시는 app 컨테이너에서 db 컨테이너로 접속하려는 경우를 보여주는 것이다.

참고로, "db : mysqldb"는 app 컨테이너가 db 컨테이너로 접속할 때 'mysqldb' 라는 이름을 사용하겠다는 의미이다.

 

- container_name

 

docker-compose.yml 파일로 docker container를 만들 때, 해당 컨테이너 이름을 설정할 수 있다.

(ex. container_name : appcontainer)

 

- depends_on

 

여러 개의 docker container를  Docker Compose로 실행할 경우, 각 컨테이너가 실행되는 시점이 다르기 때문에 특정  컨테이너가 시작하자마자 바로 다른 컨테이너에 접속하면 경우에 따라서는 접속할 수 없는 상황이 발생한다.

(ex. 다른 컨테이너가 아직 실행되지 않은 경우)

 

따라서, depend_on을 사용하여 컨테이너가 실행되는 순서를 제어할 수 있다.

위의 예시에서는 " depend_on : - db " 이므로 우선적으로 db 컨테이너가 먼저 실행되고 그 후에 app컨테이너가 실행되어 app 컨테이너가 db 컨테이너로 접속을 시도하도록 컨테이너 실행 순서를 제어하는 것이다.

 

하지만, depend_on도 컨테이너가 실행되는 순서만 제어할 뿐 해당 컨테이너들이 완전히 실행되기까지의 준비상태가 되는 것은 제어할 수 없다.

 

 

docker compose 명령 이해하기

docker-compose 실행 명령

docker-compose up -d

 

*결과 :

vi docker-compose.yml
docker-compose up -d

 

우선, "mkdir 01_DockerCompose" 명령으로 01_DockerCompose 폴더를 만든다.

그 후에 해당 작업폴더로 들어가서 vi docker-compose.yml 명령으로 docker-compose.yml 파일을 만든다.

일반적으로 docker-compose 실행 명령을 사용할 때에는 -d 옵션을 함께 포함해서 백그라운드로 실행한다.

 

*참고

만약, image 재빌드가 필요하면 docker-compose 실행 명령에 --build 옵션을 추가해야 한다.

해당 옵션없이 docker-compose 실행 명령을 사용하면 이미 작성된 image를 사용한다.

 

 

docker-compose 중지 명령

docker-compose stop

 

*결과 :

docker-compose stop

 

docker-compose up으로 생성된 docker container를 중지시키는 명령이다. (삭제X)

 

 

docker-comopse 삭제 명령

docker-compose down

 

*결과 :

docker-compose down

 

docker-compose up으로 생성된 docker container를 삭제시키는 명령이다.

 

 

*참고 

 

  • docker-compose logs : docker container의 모든 로그(출력 결과) 확인
  • docker-compose config : 실행 중인 Docker Compose의 docker-compose.yml 파일 설정 확인
  • docker-compose exec 컨테이너명 명령 : 실행 중인 docker container에 명령어를 실행

 

 

댓글