플랫폼 개발팀 기술 블로그

Docker : Docker Compose 편 본문

Article

Docker : Docker Compose 편

DevStream 2019. 4. 5. 16:49

지난 도커파일 편에서 원하는 기능이 담긴 이미지를 손쉽게 만들 수 있는 도커파일의 작성방법과 이미지 생성, 컨테이너 생성 실습을 진행 했었다. 이번 Docker Compose(이하 도커 컴포즈) 편 에서는 도커 컴포즈의 개요와 YAML파일의 작성 및 실습을 진행 해보도록 하겠다.

 

 

Docker Compose 개요

 

웹서버 기능을 하는 어플리케이션이 있다고 가정 해보자 여기에는 DB와 Web Server가 필요하고 이것을 각각의 컨테이너로 나누었다. 제대로 동작 하는지 확인 해보기 위해서는 각 컨테이너들을 실행 시켜야 하는데 docker run 명령어를 이용하여 컨테이너를 생성하려면 두 번의 run 명령어 입력이 필요하다.

컨테이너를 가끔 생성하는 경우라면 괜찮겠지만 컨테이너의 생성빈도가 높고 실행 시켜야하는 컨테이너가 지금보다 더 늘어난다면 상당히 번거로운 작업이 된다. 이런 경우 여러개의 컨테이너를 한번에 실행 시키고 관리 할 수 있다면 효율적일 것이다. 도커 컴포즈는 위와 같이 여러 컨테이너를 한번에 관리 할 때 아주 유용하다. YAML(확장자 *.yml) 파일을 이용하여 어떠한 이미지를 사용하여 어떤 컨테이너를 어떻게 실행 시킬 것인지 기술해주면 도커는 해당 내용대로 컨테이너를 순차적으로 실행 시킨다.

 

 

Docker Compose YAML 파일 작성

 

먼저 한 어플리케이션의 구성요소인 MariaDB, Apache를 일반적으로 컨테이너화 할 경우 보통은 아래와 같이 run 명령어를 사용하여 이미지를 내려받고 컨테이너를 실행 시킬 것이다.

[root@localhost testuser]# docker run \
--name mdb \
-e MYSQL_ROOT_PASSWORD='1234' \
-d mariadb:latest
da6943f279767932259d28dfd6d0f92cb3c90499569c3907a6e08594e58b8b54

[root@localhost testuser]# docker run \
--name web \
-it \
-p 80:80 \
--link mdb:mdb docker_img
 * Restarting OpenBSD Secure Shell server sshd
 root@2ae7ab2da8df:/#

 

위 두개의 run 명령어를 YAML 파일로 작성해보자. (※주의 : 탭 인식 못하므로 스페이스 두칸으로 구분)

version: '3'
services:
  mdb:
    image: mariadb:latest
    environment:
      MYSQL_ROOT_PASSWORD: 1234
  web:
    build: ./dockerfile
    image: apache_df:web
    ports:
      - "80:80"
    links:
      - mdb:mdb

version : YAML파일 포멧의 버전을 의미하고 여기서는 3버전을 사용하였다.

services : 생성될 컨테이너의 정보를 담고 있다. services 바로 아래에 서비스명을 기술 할 수 있으며 위에 기술 된 mdb, web이 서비스명이 된다.

image : docker images 명령어를 실행하면 노출되는 repository명이다.

environment : docker run 명령어 옵션 -e와 같으며 위에 기술한 MYSQL_ROOT_PASSWORD와 같이 컨테이너 생성 시 들어갈 환경 변수를 지정 해줄 수 있다.

build : 지정된 경로 내에 존재하는 도커파일을 실행하여 이미지로 만들고 그 이미지로 컨테이너를 생성한다.

ports : docker run 명령어 옵션 -p와 같으며 해당 컨테이너 내에서 오픈 할 포트번호를 지정 할 수 있다.

links : docker run 명령어 옵션 --link와 같으며 연결할 서비스명을 입력하여 해당 서비스로 접근 할 수 있다.

 

 

Docker Compose 실행

YAML 파일 작성이 완료 되었으면 도커 컴포즈 파일을 docker-compose.yml이라는 이름으로 저장해준다. 필자는 /home/testuser/docom 경로에 저장하였다. 도커 컴포즈 실행 전 실습을 위해 이전에 만들었던 컨테이너들을 모두 지워주도록 하자.

# docker rm -f $(docker ps -a -q)
2ae7ab2da8df
da6943f27976
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

 

이어서 도커 컴포즈를 다운로드 받는다.

# sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   617    0   617    0     0     98      0 --:--:--  0:00:06 --:--:--   163
100 15.4M  100 15.4M    0     0   754k      0  0:00:20  0:00:20 --:--:-- 1840k
# sudo chmod +x /usr/local/bin/docker-compose
# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# docker-compose --version
docker-compose version 1.24.0, build 0aa59064

 

다운로드가 완료 되었으면 위에 작성한 YAML파일을 기반으로 도커 컴포즈를 실행 시켜보자.

Apache2는 미리 기술해둔 dockerfile을 통해 image를 생성하였다. 그리고 해당 이미지를 통해 docom_web_1 이라는 컨테이너를 생성한 것을 확인하였다.

# pwd
/home/testuser/docom
# docker-compose up -d
Creating network "docom_default" with the default driver
Building web
Step 1/6 : FROM ubuntu:14.04
 ---> 5dbc3f318ea5
Step 2/6 : MAINTAINER pamtrak06 <pamtrak06@gmail.com>
 ---> Using cache
 ---> 9c561b8834f8
Step 3/6 : RUN apt-get update && apt-get install -y apache2 apache2-threaded-dev
 ---> Using cache
 ---> 09fa1cec80dc
Step 4/6 : RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
 ---> Using cache
 ---> ff1eee1b0bdb
Step 5/6 : CMD apachectl -D FOREGROUND
 ---> Using cache
 ---> e8563809e2c6
Step 6/6 : EXPOSE 80
 ---> Using cache
 ---> d307433464d8
Successfully built d307433464d8
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating docom_mdb_1 ... done
Creating docom_web_1 ... done

 

docker ps -a 명령을 통해 컨테이너가 제대로 생성 되었는지 다시 한번 확인 해보고 이번 편을 마치도록 하겠다.

[root@localhost docom]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
044eba02fb3c        apache_df:web       "apachectl -D FORE..."   11 seconds ago      Up 10 seconds       0.0.0.0:80->80/tcp   docom_web_1
ede97239d9bc        mariadb:latest      "docker-entrypoint..."   11 seconds ago      Up 11 seconds       3306/tcp             docom_mdb_1

컨테이너가 잘 생성되었다.

 

 

이번 Docker : Docker Compose 편 에서는 여러개의 컨테이너를 도커 컴포즈를 이용하여 하나로 묶는 개념으로 다소 복잡할 수 있는 분산된 컨테이너를 효과적으로 관리할 수 있도록 YAML파일을 기술하고 실습해보았다. 특히 Dockerfile을 같이 활용하여 사용 할 경우 언제 어느 환경에서도 즉시 컨테이너를 생성하고 관리 할 수 있게 되었다.

 

 

Docker : Docker Compose 편

끝.

'Article' 카테고리의 다른 글

Scouter Slack Plugin 알림 설정하기  (2) 2020.06.03
Google AMP 개요 편  (0) 2019.05.30
자연어처리 - 데이터 정제  (0) 2019.03.22
REST API 디자인 가이드 적용기  (1) 2019.03.08
자연어처리 - Bag of words, n-gram  (0) 2019.03.08
Comments