이번 포스팅은 apache kafka 를 공부하면서 docker 로 kafka clustering 설정을 하던 중 docker 의 기본 개념과 사용법을 정리 할 필요성을 느껴 포스팅 하게 되었습니다.

Docker

Docker는 리눅스 컨테이너를 통해 어플리케이션을 개발, 실행, 배포하는 가상화 플랫폼 입니다. 컨테이너는 리눅스의 가상화 기술 중 하나입니다. VMWARE, KVM, Hyper-V와 같은 VM 을 이용한 가상화 기술과 확작성과 경량화 차이가 있습니다.

docker

VM을 이용한 가상화 방식은 Guest OS가 필수적으로 필요하게 되고 일반적으로, 응용 프로그램에 필요한 것보다 많은 리소스 환경을 필요로 하게 됩니다. 이러한 성능 상의 이슈를 해결하고 나온 방법이 Container 를 이요한 가상화 방식입니다. Docker 는 이러한 container 기술을 사용하기 편하게 모듈화한 오픈소스 플랫폼 입니다.

Image, Container

Docker 에서 container 는 Image 를 실행하여 시작 합니다.
Image 는 application 을 실행하는데 필요한 패키지입니다. 코드, 런타임, 라이브러리, 환경 변수 ,설정 파일 등이 이미지가 될수 있습니다.

docker_architecture

docker architecture 에 대한 이미지 입니다. docker registry에 저장되어 있는 여러 image 들을 docker_host 에 저장을 할수 있고, docker run 실행을 통해 컨테이너화 할 수 있습니다. 도커의 이미지는 customization 이 가능합니다. 예를 들어 ubuntu 이미지기반에 apache web 서버를 추가하고 redis 를 설치한 image를 만들 수 있습니다.

docker image 만들어 보기

docker 에 대한 감이 오니 image 를 만들어 보겠습니다.

docker search 명령어를 통해 regestry에 등록되어있는 이미지를 검색해 보겠습니다.

$ docker search ubuntu

default로 image 검색은 https://hub.docker.com/ docker hub 에서 이루어 집니다. ubuntu 로 검색했더니 수많은 ubuntu 이미지가 검색됩니다.

NAME                                                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                                                    Ubuntu is a Debian-based Linux operating s...   8155      [OK]       
dorowu/ubuntu-desktop-lxde-vnc                            Ubuntu with openssh-server and NoVNC            208                  [OK]
rastasheep/ubuntu-sshd                                    Dockerized SSH service, built on top of of...   164                  [OK]
ansible/ubuntu14.04-ansible                               Ubuntu 14.04 LTS with ansible                   94                   [OK]
ubuntu-upstart                                            Upstart is an event-based replacement for ...   87        [OK]       
neurodebian                                               NeuroDebian provides neuroscience research...   51        [OK]       
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5      ubuntu-16-nginx-php-phpmyadmin-mysql-5          43                   [OK]
ubuntu-debootstrap                                        debootstrap --variant=minbase --components...   39        [OK]       
nuagebec/ubuntu                                           Simple always updated Ubuntu docker images...   23                   [OK]
.
.
.

docker pull 명령어를 통해 docker hub 에서 원하는 ubuntu 이미지를 가져오겠습니다. 제일 첫번째 공색 ubuntu 이미지를 가져오겠습니다.

$ docker pull ubuntu

Using default tag: latest
latest: Pulling from library/ubuntu
c64513b74145: Pull complete 
01b8b12bad90: Pull complete 
c5d85cf7a05f: Pull complete 
b6b268720157: Pull complete 
e12192999ff1: Pull complete 
Digest: sha256:3f119dc0737f57f704ebecac8a6d8477b0f6ca1ca0332c7ee1395ed2c6a82be7
Status: Downloaded newer image for ubuntu:latest

docker images 명령어로 설치된 이미지 리스트들을 확인 할수 있습니다.

$ docker images

REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
ubuntu               latest              735f80812f90        2 weeks ago         83.5MB

설치한 ubuntu 이미지를 container 로 실행시키려면 docker run 명령어를 이용합니다.

$ docker run -it -d --name my-ubuntu ubuntu

ubuntu 이미지가 컨테이너로 실행되었습니다.
$ docker ps
CONTAINER ID  IMAGE       COMMAND               CREATED             STATUS       PORTS      NAMES
014813d8b09b  ubuntu      "/bin/bash"         2 minutes ago       Up 2 minutes            my-ubuntu

이번에는 docker image 를 새롭게 만들어 보겠습니다. ubuntu 이미지를 base로 tomcat 을 설치하고 간단히 index.html 을 복사해보겠습니다. DockerFile 안에는 From, Run, Add, CMD 등의 키워드를 사용할 수 있습니다.

//DockerFile

FROM ubuntu
MAINTAINER joon

RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y -qq openjdk-8-jdk

WORKDIR /tmp
RUN curl -O http://apache.mirrors.ionfish.org/tomcat/tomcat-8/v8.5.32/bin/apache-tomcat-8.5.32.tar.gz
RUN mkdir /opt/tomcat
WORKDIR /opt/tomcat
RUN tar xzvf /tmp/apache-tomcat-8*tar.gz -C /opt/tomcat --strip-components=1

WORKDIR /opt/tomcat/webapps
RUN mkdir docker
ADD index.html ./docker

CMD  ["/opt/tomcat/bin/catalina.sh", "run"]
EXPOSE 8080

docker build 명령어를 통해 DockerFile 을 빌드 합니다.

docker build -t test/tomcat:0.1 .

...
...
Successfully built 1f1f0a996286
Successfully tagged test/tomcat:0.1

build 성공 image 입니다.

$ docker images

REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
test/tomcat          0.1                 1f1f0a996286        11 seconds ago      534MB

docker run명령어를 통해 컨테이너화 시켜 보겠습니다.

docker run -it -d --name tomcat1 -p 8888:8080 test/tomcat:0.1
docker run -it -d --name tomcat2 -p 8889:8080 test/tomcat:0.1
docker run -it -d --name tomcat3 -p 8890:8080 test/tomcat:0.1

test/tomcat 이미지를 3개 컨테이너로 만들어 보았습니다.

test

Dockerfile 에서 쓰는 몇가지 키워드를 살펴보겠습니다.

  • FROM : docker image build 시에 base image 를 설정합니다.
    • 앞에서 test 한 image 를 base로 두고 싶다면 FROM test/tomcat:0.1 와 같이 사용하면 됩니다.
    • DockerFile 에서 FROM 으로 시작해야 합니다.
  • RUN : 명령어를 실행 합니다.
    • RUN <command> 또는 RUN ["executable", "parma1", "parma2"] 형태의 2가지 사용 법이 있습니다.
    • \ 를 사용 하면 RUN 을 계속 이어 나갈수 있습니다.
        RUN curl -O http://apache.mirrors.ionfish.org/tomcat/tomcat-8/v8.5.32/bin/apache-tomcat-8.5.32.tar.gz \
        mkdir /opt/tomcat
      

      예를 들어 예제의 RUN을 이렇게 바꿀수 있습니다.

  • CMD : RUN 처럼 명령어를 실행합니다.
    • RUN과 다른점은 build 시에 명령어가 실행되는 것이 아닌 image 를 실행 하면 CMD의 명령어가 실행합니다.
  • EXPOSE : runtime 시에 container 가 listen 할 port 를 정의 합니다.
  • ENV : 환경 변수를 key value 형태로 정의합니다.
  • ADD, COPY : 파일이나 디렉토리를 목적지로 복사합니다.
    • ADD는 tar와 같은 압축 포맷의 파일을 압축을 풀어 복사하는 특징을 갖고 있습니다.
  • ENTRYPOINT

Docker-compose

docker compose 를 이용해 다수의 container 들을 정의하고, 빌드, 실행 할수 있습니다. 아래의 예제는 예제의 tomcat 컨테이너를 docker-compose 로 실행해 보겠습니다.

//docker-compose.yml

version: '3'
services:
 tomcat1:
  image: test/tomcat:0.1
  ports:
   - "8888:8080"
 tomcat2:
  image: test/tomcat:0.1
  ports:
   - "8889:8080"
 tomcat3:
  image: test/tomcat:0.1
  ports:
   - "8890:8080"

docker-comopse up 명령어로 실행합니다.

$ docker-compose up -d

Starting docker_tomcat2_1 ... 
Starting docker_tomcat2_1
Starting docker_tomcat3_1 ... 
Starting docker_tomcat1_1 ... 
Starting docker_tomcat3_1
Starting docker_tomcat1_1 ... done

컨테이너 리스트에서 3개의 톰켓 컨테이너가 실행되어 있습니다.

CONTAINER ID        IMAGE                           COMMAND                  CREATED              STATUS              PORTS                                              NAMES
f4323b8144c5        test/tomcat:0.1                 "/opt/tomcat/bin/c..."   About a minute ago   Up 3 seconds        0.0.0.0:8888->8080/tcp                             docker_tomcat1_1
5ec0e63cf4a7        test/tomcat:0.1                 "/opt/tomcat/bin/c..."   About a minute ago   Up 4 seconds        0.0.0.0:8889->8080/tcp                             docker_tomcat2_1
f9ce22582a5b        test/tomcat:0.1                 "/opt/tomcat/bin/c..."   About a minute ago   Up 4 seconds        0.0.0.0:8890->8080/tcp                             docker_tomcat3_1

정리

이번 포스팅에서는 Docker 를 간단하게 다룰수 있게 기본적인 정리만 하였습니다. 추후에 다른 포스팅을 하며 Docker를 사용하게 된다면 틈틈히 정리해 내용들을 추가해 보겠습니다.


출처