Docker 중에서도 아주 간단한 소개 및 사용방법을 공유합니다. 본 글은 Docker를 처음 보는 사람들을 위해서 정리하였고 특히 꼭 알고 싶어하는 김O호, 박O규를 위해 작성되었습니다.

Docker?

Docker를 왜 사용할까? 많은 고민을 해볼 수 있지만 가장 주요한 포인트는 독립 환경이라는 점입니다. 사실 가상화 기술들을 이용하여 다양한 방법으로 독립 환경을 구성하는 도구 및 방법들은 많이 존재합니다. 하지만 그 중에서도 Docker는 도커 이미지를 통해서 쉽고 빠르게 구성을 도와줍니다. [참고1], [참고2]

LXC(리눅스 커널 컨테이너)를 기반으로 하는 하드웨어 자원이 효율적 사용과 같은 고급진 말로 설명도 하지만 저자는 여러 가상화 환경 중에서도 가장 쉽게 독립 환경을 구축하는 가상화 도구라는 관점에서 접근하였습니다. 그래서 사용하는 Docker 도구들도 편의성을 높여주는 도구들을 기반으로 선정하여 설명합니다.

MacOS에서 Docker 설치

Docker 설치 배포판은 다양하게 변경되었으나 현재 MacOS에서는 Docker Desktop(Community) 라는 도구가 가장 편리합니다. Docker-Machine 설치는 Brew를 통해서 쉽게 설치 가능합니다.

$ brew cask install docker

위와 같이 Docker를 설치한 다음 Applications > Docker를 실행하면 맥OS 상단 오른쪽 툴바에 표시됩니다.

캘리맵 배포 구성 및 실행

캘리맵은 웹프로그래밍을 처음 하는 사람들이 모인 스터디에서 만든 서비스로 위성 지도 위의 알파벳을 찾아주는 서비스입니다. 사용자가 검색어 위치에 알파벳을 입력하면 자동으로 지도 위의 해당 알파벳을 찾아서 영상사진으로 글자를 보여줍니다.

Flask 기반의 백엔드와 간단한 UI를 위한 Html 코드로 구성되어 있습니다. 상세한 코드는 https://github.com/lubang/calimap 을 참고해주세요. 캘리맵의 배포는 Docker로 하도록 구성하였고 다음의 절차는 캘리맵을 배포하는 절차입니다. 아래의 명령들은 반드시 GitHub에 등록된 calimap root 폴더에서 수행합니다.

$ docker/docker-build.sh
$ docker/docker-run.sh
  1. Docker Image 생성: docker 폴더의 docker/docker-build.sh 실행
  2. Docker 실행: docker 폴더의 docker/docker-run.sh 실행

위와 같이 실행하여 배포판을 서비스하면 http://localhost:10100 로 캘리맵을 접속할 수 있습니다.

캘리맵 인트로 화면

캘리맵 서비스 화면: http://calimap.party

(주의) 본 서비스는 테스트로 만든 서비스로 종종 종료되어 있거나 동작하지 않을 수 있습니다. 그 때는 언제든지 본 글에 댓글 혹은 메일 주시면 복구해두겠습니다.

Docker 생성 절차

일반적으로 이미 생성된 이미지(Docker image)를 사용하는 것이 가장 편리합니다. 하지만 프로젝트 별 최적화된 설정을 위해서는 필요한 OS 및 의존성을 Dockerfile을 작성하여 도커 이미지를 직접 생성합니다. 다음은 위에서 확인하였던 캘리맵을 위한 배포 환경을 Dockerfile로 작성하여 생성하는 방법입니다.

1. Dockerfile 작성하기

캘리맵은 Alpine-flask를 기반으로 환경이 배포환경을 구성하였습니다. 이미 Alpine-flask에 Nginx + Flask 제공을 위한 구성은 다 되어 있고 캘리맵 파일 복사 및 몇가지 추가적으로 설치할 라이브러리만 추가하였습니다. 작성한 Dockerfile은 다음과 같습니다.

FROM alpine
MAINTAINER LUBANG

# Reference: https://github.com/jazzdd86/alpine-flask

# basic flask environment
RUN apk add --no-cache bash git nginx uwsgi uwsgi-python py-lxml py-pip \
    && pip install --upgrade pip \
    && pip install flask

# application folder
ENV APP_DIR /server

# app dir
RUN mkdir ${APP_DIR} \
    && chown -R nginx:nginx ${APP_DIR} \
    && chmod 777 /run/ -R \
    && chmod 777 /root/ -R
VOLUME ${APP_DIR}
WORKDIR ${APP_DIR}

# expose web server port
# only http, for ssl use reverse proxy
EXPOSE 80

# copy config files into filesystem
COPY nginx.conf /etc/nginx/nginx.conf
COPY app.ini /app.ini
COPY entrypoint.sh /entrypoint.sh

# exectute start up script
ENTRYPOINT ["/entrypoint.sh"]

2. 도커 빌드를 위한 build-docker.sh 작성

도커 이미지를 생성하는 스크립트로 lubang/calimap이라는 이름으로 생성합니다.

$ docker build -t lubang/calimap docker

워낙 간단한 절차라서 스크립트 생성 없이 위 명령을 직접 수행해도 되나 빌드 과정 중 설정 파일 및 중간 처리가 필요하다면 스크립트로 만들어서 관리하는 것이 편리하고 유지보수 측면에서 유리합니다. 특히 다수의 개발&운영자가 함께 작업하는 경우 위와 같이 스크립트가 있다면 빌드 및 실행 과정 중 발생할 수 있는 실수를 최소화 할 수 있습니다.

3. 도커 실행을 위한 run-docker.sh 작성

도커를 실행하는 스크립트로 calimap 이란 이름으로 시작합니다. 그리고 도커의 80포트를 호스트의 10100으로 연결하고 도커의 /server 경로를 $PWD/server/ 경로로 바인딩합니다.

$ docker run --name calimap -p 10100:80 -v $PWD/server/:/server -d lubang/calimap

이제 ./run-docker.sh 라고 명령을 치면 언제든지 캘리맵을 운영할 수 있는 환경을 구성하였습니다.

도커를 처음 쓴다면 Kitematic

도커의 cli 를 이용하는 것은 명쾌하고 편리하나 모든 명령어를 외우기 어렵고 빠르게 설정 등을 확인할 때는 확실히 불편합니다. 그런 경우에는 Kitematic을 이용하면 도커의 이미지 다운, 실행, 설정 등의 간단한 동작들을 GUI로 제공하기 때문에 이를 활용하는 것을 추천합니다.

Kitematic: https://kitematic.com


  1. 참고[1] 가장 빨리 만나는 Docker - http://www.pyrasis.com/docker.html [return]
  2. 참고[2] Docker Seolu meetup 발표자료 - Open Container Korea (https://lubang.gitbooks.io/west-people/content/) [return]