맥(Mac)에서 이해하는 도커(Docker) #1


컴퓨터 전공자, 혹은 직업으로 하는 사람이 아니다보니 새로운 개념을 습득해야할 때면 시간이 상당히 오래걸리는 편입니다. 게다가 한글로 된 예제가 잘 찾아지지 않는 경우라면 더더욱.

어쩌다보니 이전부터 알고는 있었지만 쓸일이 없었던 도커(Docker)라는 것에 대해 접하게 되었습니다. 생각보다 쉽지만 또 어려운..
Hyperledger Sawtooth를 구동시키기에 무척 편하지만 잘 알지못하면 튜토리얼에 나온 내용 이후에는 “그 다음엔 어떻게 해야하지?”라는 고민에 휩싸입니다.
결국 Hyperledger를 이용한 블록체인DB를 웹 기반으로 구동시키려면 결국 추가적인 작업이 필요하기 때문입니다.

지난주 휴가 동안 틈틈히 뚝딱거리면서 이것저것 해본 결과, 도커라는 것에 조금이나마 이해하게 되어 그 과정을 남겨봅니다.
(나중에 스스로 돌이켜 보기 위함이 큽니다)

 

틀린 부분은 과감히 지적부탁드립니다

 

#1. Docker란?

아주 좋은 슬라이드가 있어 링크를 걸어둡니다. https://www.slideshare.net/pyrasis/docker-docker-38286477
‘가장 빨리 만나는 Docker’라는 책을 쓰신 이재홍 님께서 만들어주신 슬라이드인데 기본적인 내용이 잘 나와있습니다.

이것을 보고 한번에 이해하신다면 제 글은 별로 도움이 안되실 것입니다.

 

#2. 제가 이해한 Docker란?

결국 필요한 모듈을 블럭처럼 만들어서 관리 및 설치, 확장 등을 용이하게 하기 위함입니다. 제대로 만든 이미지(Image;도커에 쌓는 한 블럭)는 어느 환경에서도 불러들여서 쉽게 재사용이 가능해지고, 어느 환경에서도 동일한 결과를 만들어내는데 용이합니다.

매번 서버 작업때 반복하는 아파치 설치, PHP설치, MariaDB설치 등등을 하나의 이미지로 만들어버리면 여러 서버를 구성하는데 쉬워지겠죠.

 

#3. Mac에서 사용하는 Docker

Docker는 리눅스 기반으로 돌아갑니다. 맥은 리눅스가 아니기에, 부득이하게 Mac OS위에 Linux 가상 OS를 한겹 올려줘야합니다.

(악필이라 죄송합니다)

 

작년부터였다던가 Mac용 Docker를 설치하면 자동적으로 Virtual Box라는 운영체제가 설치되고, 가상 OS로 리눅스가 설치되는데 그 것이 boot2docker라는 아주 간단하게 구성된 리눅스라고 합니다. 아래와 같이 표현하겠습니다.

(악필이라 죄송합니다)

맥용 도커를 설치하면 VirtualBox 가 설치되고, Kitematic라는 관리 툴을 사용하면 자동적으로 default라는 가상 운영체제가 설치됩니다.

쉘에서 uname -a 로 운영체제를 확인하면 boot2docker임을 알 수 있습니다.

 

#4. 일단 시작은 ubuntu로 부터…Mac에 boot2docker에 Ubuntu를 설치한다?

OS 위에 가상OS 위에 다시 운영체제를?? 이것 이해하는데 며칠 걸렸던 것 같습니다.

(제가 이해한바로는)boot2docker 위에 ubuntu를 설치한다는 것이 boot2docker라는 코어 위에서 ubuntu 리눅스가 갖고 있는 요소들(쉘 명령어 라든지..)를 덧붙인다고 보시면 됩니다. boot2docker가 뼈대면, ubuntu라는 살점을 붙인다고 볼 수 있겠습니다.

애초에 boot2docker말고 그럼 ubuntu를 설치하면 되지 않느냐? 하신다면 생각같아서는 그래도 될 것 같습니다만 도커가 맥에서 기본으로 boot2docker로 제공해주니..

 

#5. 그럼 살점을 붙여봅시다.

Docker image가 ‘장착’되면 그것을 container라고 부릅니다. 이 컨테이너가 실행가능한 하나하나의 모듈이 되겠습니다.

일단 이미지를 만들어야 합니다.

이미지를 만드는 과정은 Terminal을 실행하는 과정에서부터 다음과 같습니다.

 1> eval $(docker-machine env default)    #’default’라는 이름의 가상OS를 활성화시킨다. 이 과정은 새로운 터미널에서 항상 써야합니다

위의 명령어를 실행하고 나면 Active가 * 됩니다.

2> vi Dockerfile    #Dockerfile이라는 것을 만든다.

이미지가 어떻게 구성되는지에 대한 설계도입니다. 저는 해당 이미지에 따른 폴더를 각각 만들었습니다.

이미지가 만들어질 때 기본적으로 복사해야할 파일들을 모아두거나 하기 위해서 입니다.  연습용으로 ubuntu_docker라는 폴더를 만들고 그 안에다가 Dockerfile을 만들었습니다.

3> Dockerfile 코드 (ubuntu 16.04)

=================

FROM ubuntu:16.04

ENV TERM linux
ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update
RUN apt-get install -y

CMD [“/bin/bash”]

==================

소스의 출서는 스택오버플로우입니다. 각 줄에 대한 설명은 여기서 생략하겠습니다. 개념잡는 페이지라서요.  결국 첫줄입니다.

FROM ‘A’ 라고 쓰면 A라는 도커 이미지를 base로 하겠다! 입니다. 이게 무슨말이냐면

제가 만약, Ubuntu 16.04를 이용해서 ubuntu_junn:16.04 라는 이미지를 만들었습니다. 그럼 그 이후에 이 ubuntu_junn:16.04라는 이미지를 base로 python3.6을 얹은 Python:3.6이라는 이미지를 만들면 됩니다. 그 때 FROM ubuntu_junn:16.04 라고 쓰면 되는 것입니다.

그럼 질문, ubuntu:16.04이라는 이미지를 만들고 다시 python이라는 이미지를 만들지 말고, 한번에 설치된 이미지로 만들면 안돼? 라고 한다면

당연히 됩니다. 위에 RUN apt-get … 뒤에 python도 설치해버리면 됩니다.

다만 이렇게 나눈 목적은 그냥 잘개잘개 쪼개놓으므로서 재활용을 높이는 것이죠. python3를 설치한 python3_junn 이미지, python2를 설치한 python2_junn 이미지를 따로 두고 싶다거나(물론 그럴필요가 없지만) 할 수 있기 때문입니다.

위의 Docker파일은 결국, Ubuntu:16.04 라는 이미지(인터넷에 올려져있는 기본 이미지)를 기본으로 할 것이며, (ENV는 잠깐 무시하겠습니다) RUN이라는 명령어를 통해 apt-get을 실행함으로써 최신의 ubuntu 16.04를 이미지를 만들겠다 입니다.

중요한것은 이렇게 작성된 ‘Dockerfile을 통해 이미지를 만들 때 최신‘ 인 것이지, 항상 최신은 아닙니다. 이미지의 업데이트와 관련되선 추후에 포스팅할 수 있을 것 같습니다.

 

4> Dockerfile로 부터 이미지 생성

$ docker build -t ubuntu_junn:latest .     #docker build -t 이미지이름:태그(버전) dockerfile의폴더(. 또는 /xxx 라든지..)

이렇게 되면 막 알아서 다운로드를 받습니다. 완료되면 제가 만든 이미지가 뜹니다.

 

5> 도커 이미지를 실행해보자(컨테이너로…)

$ docker run -it ubuntu_junn

이 때 새 터미널을 띄워 컨테이너가 잘 실행되나 봅니다.

$ docker container ls 를 실행시켜보면 처음에는 아무것도 안나옵니다. 새 터미널이니 가상OS를 activate 시켜줘야 합니다. (eval $…) 그 이후 다시 실행시키면 제가 만든 이미지가 잘 떠있습니다.

다만 재밌는 것은, 만든 컨테이너에서 $ uname -a 를 통해서 보면

boot2docker라고 나옵니다. ubuntu가 아닌것이죠. ‘아무리 겉을 어떻게 꾸며도 뼈대는 변하지 않아’

 

 

#6. 향후 계획은

(1) 이번에 만든 이미지를 통해 python을 얹어 이미지를 만들을 예정입니다.

python을 얹어 만든 새로운 이미지와 python을 얹지 않은 이미지는 대체 어떤 차이가 있을까 보고 나면 도커라는 녀석이 조금 더 쉽게 이해가 될 것입니다.

(2) 그리고 그 이후에는 hyperledger sawtooth 이미지들 + Django를 설치한 또다른 이미지를 만들어보고,

(3) 최종적으로는 Django 서버를 통해 블록체인 DB를 관찰해보는 것을 시도해볼 예정입니다.

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.