반응형

Docker

도커는 리눅스 상에서 컨테이너 방식으로 프로세스를 격리해서 실행하고 관리할 수 있도록 도와주며, 계층화된 파일 시스템에 기반해 효율적으로 이미지(프로세스 실행 환경)을 구축할 수 있도록 해준다.

 

도커를 사용해 이미지를 기반으로 컨테이너를 실행할 수 있으며, 다시 특정 컨테이너의 상태를 변경해 이미지로 만들 수 있고, 이렇게 만든 이미지는 파일로 보관하거나 원격 저장소를 사용해 쉽게 공유할 수 있다.

 

VM 대신 도커를 사용해야 하는 환경

VM은 VM을 실행하는 host 머신에 가상화된 하드웨어와 OS를 구축함으로써, 호스트와는 다른 환경을 구축하고 개발과 테스트를 비롯한 다양한 목적으로 사용할 수 있다.

 

하드웨어를 소프트웨어로 에뮬리에션하는 가상머신은 시스템 분리를 통한 프로세스 격리 관점에서는 좋다는 장점이지만, 단순히 프로세스를 실행하기 위한 환경으로는 성능을 비롯해 여러가지 단점들이 있다.

 

컨테이너는 하드웨어를 소프트웨어로 재구현하는 VM과는 달리 프로세스의 실행 환경을 격리한다.

 

컨테이너가 실행되고 있는 host 입장에서는 그저 프로세스에 불과하지만 사용자나 컨테이너 입장에서는 Host와는 무관하게 동작하는 가상머신처럼 보인다.

 

Docker는 위와 같이 컨테이너형 가상화를 지원하는 도구 중 하나이다.

 

OS에 따른 Docker의 차이

Docker는 다양한 환경에서 사용할 수 있는데, Docker for mac이나 Docker for Windows는 Docker와 관련 도구들로 구성된 패키지이지만, 리눅스 컨테이너를 직접적으로 지원하지 않기 때문에 경량 가상머신이 중간에서 사용된다.

 

반면, 리눅스에서는 각 배포판에서 제공하는 패키지 관리자를 통해 Docker를 설치할 수 있다.

 

하지만, 일반적으로 패키지 관리자는 보수적으로 관리되므로 아래의 명령을 통해 설치하는 것이 좋다.

curl -s <https://get.docker.com> | sudo sh

 

Docker의 패키지 구성

원래 docker-engine 하나였지만 현재는 docker-ce(Community Edition)와 docker-ce-cli 두 가지로 나뉘어져 있다.

 

도커는 크게 도커 엔진과 클라이언트로 나뉘어져 있는데, 도커 엔진은 서버로 동작하며 시스템 상에서 서비스로 등록되고, 도커 클라이언트는 도커 서버에 명령을 전달하고, 명령은 전적으로 서버에서 처리된다.

 

도커 클라이언트로 외부의 도커 서버에 명령을 내리는 것도 가능한데 이게 바로 도커의 아키텍처이다.

 

도커 이미지 기초

도커의 이미지는 가상머신에서 사용하는 이미지와 비슷한 역할을 한다.

 

즉, 이미지는 어떤 애플리케이션을 실행하기 위한 환경이라고 할 수 있고, 이 환경은 파일들의 집합이다.

 

도커에서는 애플리케이션을 실행하기 위한 파일들을 모아놓고 애플리케이션과 함께 이미지로 만들수 있으며, 이 이미지를 기반으로 애플리케이션을 바로 배포할 수 있다.

 

 

컨테이너 - 격리된 환경에서 실행되는 프로세스 이해

이미지는 어떤 환경이 구성되어있는 상태를 저장해놓은 파일 집합이다.

 

이 이미지의 환경 위에서 특정한 프로세스를 격리시켜 실행한 것을 컨테이너라고 부른다.

 

컨테이너를 실행하려면 반드시 이미지가 있어야 한다.

 

즉, 이미지는 파일들의 집합이고, 컨테이너는 이 파일들의 집합 위에서 실행된 특별한 프로세스이다.

 

이미지와 컨테이너는 별개이므로 컨테이너를 아무리 지지고 볶고 양념했다가 뺐다가 추가했다가 버렸다가 주워왔다가 뭔 짓을 하더라도 이미지에는 아무런 변화가 생기지 않는다.

 

 

Dockerfile로 이미지 만들기

도커 이미지를 추가하는 방법은 크게 2 가지가 있다.

  • pull 명령을 이용해 미리 만들어져있는 이미지를 가져오는 방법
  • Dockerfile을 빌드하는 방법

 

Dockerfile을 빌드하는 방법

  • Dockerfile을 저장해놓기 위한 디렉터리 생성
mkdir dockerfile_env
cd dockerfile_env
  • Dockerfile 작성
FROM ubuntu:latest // 어떤 이미지로부터 이미지를 생성할지 지정(필수 항목)
RUN apt-get update
RUN apt-get install -y git
  • Dockerfile로 이미지를 빌드
docker build -t ubuntu:dockerfile_env .
  • 이미지를 실행시켜 확인
docker run -it ubuntu:dockerfile_env bash

 

모니위키(moniwiki) 도커 파일 작성

  • 웹 애플리케이션 서버를 실행하기 위한 도커 이미지를 작성한다.
  • moniwiki는 php와 apache 서버를 기반으로 동작한다.
  • 애플리케이션 실행을 위해 도커 이미지를 만드는 작업을 도커라이징(Dockerizing)이라고도 한다.
git clone <https://github.com/nacyot/docker-moniwiki.git>
cd docker-moniwiki/moniwiki
FROM ubuntu:14.04

RUN apt-get update &&\\
  apt-get -qq -y install git curl build-essential apache2 php5 libapache2-mod-php5 rcs

WORKDIR /tmp
RUN \\
  curl -L -O <https://github.com/wkpark/moniwiki/archive/v1.2.5p1.tar.gz> &&\\
  tar xf /tmp/v1.2.5p1.tar.gz &&\\
  mv moniwiki-1.2.5p1 /var/www/html/moniwiki &&\\
  chown -R www-data:www-data /var/www/html/moniwiki &&\\
  chmod 777 /var/www/html/moniwiki/data/ /var/www/html/moniwiki/ &&\\
  chmod +x /var/www/html/moniwiki/secure.sh &&\\
  /var/www/html/moniwiki/secure.sh

RUN a2enmod rewrite

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2

EXPOSE 80

CMD bash -c "source /etc/apache2/envvars && /usr/sbin/apache2 -D FOREGROUND"

참고) dockerfile에서 RUN 명령어는 몇 번으로 나누어 쓰던지 상관없지만 Dockerfile의 한 줄 한 줄은 레이어라는 형태로 저장되기 때문에 RUN의 횟수를 줄이면 레이어가 줄어들고 캐시도 효율적으로 관리할 수 있다.

 

WORKDIR은 이후에 실행되는 모든 작업의 실행 디렉토리를 지정하는 지시자이다.

 

ENV는 컨테이너 실행 환경에 적용되는 환경 변수의 기본값을 지정하는 지시자이다.

 

EXPOSE는 VM에 오픈할 포트를 지정해준다.

 

  • 위의 dockerfile을 빌드한다.
docker build -t nacyot/moniwiki:latest .
  • moniwiki 실행
docker run -d -p 9999:80 nacyot/moniwiki:latest
  • 실행 확인
<http://127.0.0.1:9999/moniwiki/monisetup.php>

 


 

 

https://www.44bits.io/ko/post/easy-deploy-with-docker#들어가며

 

반응형

+ Recent posts