안경잡이개발자

728x90
반응형

윈도우 10에서 도커 툴 박스(Docker Tool Box) 깔끔하게 삭제하는 방법

나동빈


  윈도우에서 도커 툴 박스(Docker Tool Box)를 설치해서 공부하시는 분들은 이것저것 찾아서 공부를 하시다 보면 다음과 같이 이것저것 다양한 도커 머신 파일이 설치가 될 겁니다. 도커 머신 각각에 다양한 이미지들이 설치가 되어 있으면 용량도 많이 잡아먹을 수 있기 때문에 반드시 이를 유의하시고 정리하실 수 있으셔야 합니다.


  docker-machine ls: 현재 컴퓨터에 설치된 도커 머신의 목록을 출력합니다.



  위 도커 머신의 목록과 동일한 내용은 Oracle VM VirtualBox 프로그램에서도 확인하실 수 있습니다.



  위와 같이 동일하게 나타나는 것을 알 수 있습니다.



  이러한 도커 머신들이 실제로 존재하는 물리적인 경로는 다음과 같습니다.


  C:\Users\(사용자 이름)\.docker\machine\machines


  이러한 도커 머신 파일들은 Oracle VM VirtualBox를 삭제하더라도 그대로 남아있기 때문에 우리 컴퓨터의 용량을 매우 많이 잡아먹습니다. 그래서 이 경로를 기억해두시고, 도커 툴 박스 및 VirtualBox를 지우신 뒤에 이 파일들도 모두 지워주셔야 합니다.



  따라서 '프로그램 제거 또는 변경' 부분에 들어가서 Oracle VM VirtualBox와 Docker ToolBox를 삭제해줍니다.



  이후에 아까 말씀드렸듯이 위와 같이 존재하는 .docker 폴더도 완전히 삭제해주시면 됩니다. 어차피 나중에 도커를 재설치 하거나 하면 이 폴더는 자동으로 생성되기 때문에 그냥 제거해주셔도 차후 재설치에 있어서 문제 없습니다.

728x90
반응형

728x90
반응형

예제를 통해 도커파일(Dockerfile) 명령어 알아보기

나동빈


  지난 시간에는 간단한 형태의 도커파일(Dockerfile)을 작성하여 직접 도커 이미지(Docker Image) 파일을 생성하는 방법을 알아보았습니다. 이번 시간에는 도커파일에 사용되는 다양한 옵션 및 명령어에 대해 알아보는 시간을 가져보도록 하겠습니다. 


  먼저 도커 이미지를 만들 때 기존에 존재하는 다양한 라이브러리를 섞어서 이미지를 만들 수 있다는 것을 이해해봅시다.


※ 고래의 말(whalesay) 이미지 사용해보기 ※


  고래의 말(Whale Say)는 도커에서 튜토리얼 목적으로 만든 간단한 형태의 이미지입니다. 그냥 고래가 나와서 무슨 말을 하는 것 말고는 전혀 기능이 없습니다. (말 그대로 똥 같은 프로그램이죠...)



docker search (검색할 이미지): 도커 허브(Docker Hub)에서 이미지를 검색합니다.



  이제 위와 같이 docker run docker/whalesay cowsay Hello!를 입력해서 고래가 'Hello!'라고 말하도록 해봅시다. 여기에서 cowsay는 whalesay 이미지에서 사용할 수 있는 기능 중 하나이고, 그 뒤에 'Hello!'를 넣어서 이러한 문장을 고래가 말하도록 설정할 수 있는 것입니다.



  출력할 문장을 'Hi!'로 바꾸었을 때도 정상적으로 작동하는 것을 알 수 있습니다. 이제 우리가 해 볼 것은 단순히 직접 고래가 할 말을 넣어주는 것이 아니라 고래가 랜덤으로 의미 있는 격언을 말하도록 해보는 것입니다.


※ 랜덤으로 격언을 출력하는 고래 이미지 만들기 ※


  지난 시간에 배웠던 내용과 흡사하게 하나의 이미지를 만들어봅시다. 우리가 다운로드 받았던 whalesay 이미지는 기본적으로 리눅스 운영체제 위에서 고래가 말을 하는 것을 출력하는 기능이 있는 이미지입니다. 따라서 apt-get 명령어를 사용해 다른 라이브러리도 설치하도록 할 수 있어요. 우리는 그 중에서 랜덤으로 격언을 반환하는 fortune 라이브러리를 사용할 겁니다. 따라서 바로 도커 파일을 작성해봅시다.



FROM docker/whalesay


RUN apt-get update

RUN apt-get install -y fortune # fortune 라이브러리를 기존의 이미지에 추가적으로 설치합니다.


CMD /usr/games/fortune -a | cowsay # 설치된 fortune 라이브러리를 실행해 나온 격언 문장을 cowsay 명령어의 파라미터로 전달합니다.


  위 소스코드를 보시면 랜덤 문장을 cowsay 명령어의 파라미터로 전달하여 랜덤으로 문장을 고래가 출력하도록 만든 것을 알 수 있습니다.



docker build --tag mywhale .


  이 명령어로 우리가 만든 도커 파일을 이용해 mywhale이라는 이름의 이미지를 생성할 수 있습니다.



  이제 docker images 명령어를 이용해 생성된 이미지를 확인할 수 있습니다. 기존에 존재하는 docker/whalesay 이미지에 덧붙여서 273MB의 mywhale 이미지가 생성되었네요.



  이제 docker run mywhale을 입력하여 이미지를 실행할 때마다 랜덤으로 격언이 출력되는 것을 확인할 수 있습니다.


  여기까지 예제를 잘 따라오셨다면 기본적으로 도커파일이 어떠한 기능을 가지고 있는지 대략적인 이해가 되셨을 겁니다. 이제 보다 자세하게 도커파일에서 사용될 수 있는 명령어를 확인해봅시다.


※ 도커파일 명령어 알아보기 ※


- FROM: 베이스 이미지를 지정하는 명령어입니다. FROM ubuntu:14.04와 같은 방식으로 사용하고, 버전으로는 latest를 넣을 수도 있습니다. 하지만 가능하면 14.04와 같은 정확한 버전명을 기입하는 것이 좋습니다.


- RUN: 이미지 상의 리눅스 커맨드를 실행하도록 해주는 명령어입니다.


  예를 들어 RUN apt-get -y fortune을 하면 리눅스에서 fortune 라이브러리를 다운로드 받게 됩니다. 이 때 RUN 명령어는 일반적으로 한 번 사용될 때마다 레이어가 하나씩 추가됩니다. 그래서 RUN 명령어를 어떻게 쓰냐에 따라서 이미지의 크기가 달라질 수 있습니다. 그러므로 여러 개의 명령어가 이어지는 경우 다음과 같이 &&를 이용해 하나의 라인에 명령어를 쓰는 것이 좋습니다.


  RUN apt-get update && apt-get install -y fortune


- CMD: 이미지 명령을 지정하기 위해 사용하는 명령어입니다. 예를 들어 CMD ["nginx"]라고 입력하면 nginx 서버를 실질적으로 구동시키게 되는 것입니다.


- EXPOSE: 컨테이너에서 공개하고자 하는 포트를 정의하기 위해 사용하는 명령어입니다. 80, 443 등의 포트가 일반적으로 많이 사용됩니다.


- ENV: 환경변수를 정의하기 위해 사용하는 명령어입니다. 'ENV NGINX_VERSION (버전명)'과 같은 방식으로 사용할 수 있습니다.


- ADD, COPY이미지 안에 파일을 복사하고자 할 때 사용할 수 있는 명령어입니다. 'COPY jerkins.sh /user/local/bin/jenkins.sh'와 같은 방식으로 사용할 수 있습니다. 이 때 압축을 풀 필요 없이 단순히 이미지 안에 넣을 때는 COPY를 쓰고, 압축까지 푸는 등 후처리가 필요하다면 ADD를 사용합니다.


- WORKDIR작업위치를 지정할 때 사용하는 명령어입니다.


- ONBULID이미지 빌드 이후에 실행되는 명령을 지정하기 위해 사용하는 명령어입니다.


- ENTRYPOINT: 이미지 실행 명령을 다시 지정하기 위해 사용하는 명령어입니다. 기본적으로 이미지는 한 번 만들어지면 수정할 수 없다는 점에서 마치 프로그램을 작성하듯이 쉘 스크립트를 작성하여 엔트리 포인트로 걸어놓고 사용할 수 있습니다. 아까 다루었던 예시에서 cowsay에 다른 명령을 이용해 적용했던 것을 떠올리시면 됩니다.


- VOLUME: 바인딩하고자 하는 디렉토리를 정의할 때 사용하는 명령어입니다. 흔히 리눅스에서의 마운트를 생각하시면 됩니다. 컨테이너 자체는 stateless한 특성을 가지고 있습니다. 하지만 특정한 데이터를 저장하는 등의 기능이 필요하다면 호스트 서버의 특정 위치와 컨테이너의 특정 위치를 마운팅 시킬 수 있습니다. 이는 실제로 굉장히 많이 사용되는 요소 중 하나입니다.


- USER: 사용자를 지정하기 위해 사용하는 명령어입니다. 별도로 지정하지 않으면 사용자는 기본적으로 'docker'로 설정됩니다. 기본적으로 docker라는 하나의 사용자가 있다고 가정을 하고 동작하고, 이러한 docker 사용자가 없거나 현재 사용자가 docker 그룹에 포함 되어 있지 않다면 Permission 오류가 발생할 수 있습니다. 


  일반적으로 이러한 사용자 문제는 컨테이너 자체를 실행할 때는 별 문제가 되지 않습니다. 주로 볼륨(Volume) 마운팅 기능을 이용할 때 문제가 됩니다. 마운팅을 수행하면 서버의 특정 디렉토리에 액세스를 하고자 하여 문제가 발생할 수 있습니다. 그럴 때는 호스트에 도커와 동일한 사용자를 만들고, 사용자의 UID 값도 맞추어주어 해결할 수 있습니다.


  이렇게 사용자 기능을 쓰는 것에 대해서는 찬반의 의견이 다수 존재합니다. 이는 권한 관리의 문제가 있기 때문이고, 컨테이너 외부에서도 최고 권한(root)으로 돌아가도록 설계된 경우 관리 책임의 소지도 함께 다루어야 될 문제이기 때문입니다.

728x90
반응형

728x90
반응형

도커파일(Dockerfile)을 이용해 nginx 웹 서버 도커 이미지 만들어보기

나동빈


  지난 시간에는 윈도우(Windows) 운영체제에서 도커(Docker)와 특정한 폴더를 공유하는 방법에 대해 알아보는 시간을 가져보았습니다. 이후에 파이썬을 이용해 공유된 폴더의 특정 파이썬 스크립트(Python Script)를 실행하는 것까지 해보았습니다. 다만, 지금까지 이용한 헬로우 월드(Hello World) 이미지나, 파이썬(Python) 이미지 등은 이미 다른 사람이 만들어 놓은 이미지(Image)입니다.


  그렇다면 우리가 직접 도커 이미지(Image)를 만들고자 한다면 어떻게 할 수 있을까요? 그 때 사용할 수 있는 것이 바로 도커파일(Dockerfile)입니다. 도커 파일의 이름은 'Dockerfile'로 만들며, 당장 도커 파일을 만들어보면서 사용 방법을 익혀 보겠습니다.



cd (도커 파일 경로): 도커 파일을 만들 경로로 이동합니다.

vi Dockerfile: 도커 파일을 생성해 작성합니다.


  사실 도커 파일은 그냥 윈도우에서 메모장 등을 실행해서 작성할 수도 있는데, 이왕이면 위와 같이 vi 에디터 같은 리눅스 전용 도구에 익숙해지도록 하세요. (이미 리눅스에 매우 익숙하신 분이라면 편하신 대로 작성하셔도 됩니다.)



FROM ubuntu:14.04 #기반으로 할 이미지를 설정합니다.

MAINTAINER Dongbin Na "ndb796@naver.com" # 작성자의 정보를 기입합니다.


RUN apt-get update # RUN을 이용해 쉘 스크립트를 실행합니다.

RUN apt-get install -y nginx # nginx를 설치합니다.


WORKDIR /etc/nginx # 이후의 CMD 명령어가 실행될 경로를 찾습니다.


CMD ["nginx", "-g", "daemon off;"] # nginx를 백그라운드에서 돌아가도록 실행합니다.


EXPOSE 80 # 80번 웹 서버 포트를 열어 웹 서버에 정상적으로 접근할 수 있도록 합니다.


  위와 같은 명령어를 입력하면 결과적으로 ubuntu 이미지에 nginx가 포함되는 방식으로 동작하게 됩니다. 리눅스 명령어에서 apt-get 명령어를 사용하면 그 리눅스 안에 설치가 이루어집니다. 이러한 형태는 이미지 위에 이미지가 쌓이는 방식을 적나라하게 보여줍니다. FROM 명령어로 이미 존재하는 다른 이미지 위에 추가적으로 어떠한 모듈을 설치하는 과정임을 이해하시면 됩니다. 레이어(Layer)가 쌓이는 겁니다.


  그래서 특정한 이미지를 만들 때는 베이스로 삼고 있는 이미지가 우수한 이미지여야 한다는 가정이 있는 겁니다.



docker build --tag myubuntu:0.1 .


  위 명령어는 특정한 태그(Tag) 이름으로 이미지를 빌드(Build)하는 명령어입니다. 저는 myubuntu라는 이름으로 이미지를 만들어 보았습니다. 여기서 주의할 점은 빌드 명령어의 마지막에는 온점(.)을 찍어주어야 합니다. 원래 온점 대신 URL 등 다양한 내용이 들어갈 수 있는데, 단순히 온점만 찍어서 명령어를 마무리해주는 겁니다.



  이후에 위와 같이 이미지 목록을 확인해보면 베이스 이미지가 되는 우분투(Ubuntu)가 먼저 설치되고, 그것을 기반으로 하여 myubuntu라는 이름의 이미지가 만들어진 것을 알 수 있습니다. 보면 이미지의 크기가 188MB -> 230MB로 겹겹히 쌓인 것을 알 수 있습니다. 다양한 기능이 추가될 수록 이미지가 더 커지는 겁니다. 근데, 커져봤자 200MB 정도인 걸 보면 역시 갓도커라는 생각이 드는 군요.



docker run --name (컨테이너 이름) -d -p 80:80 (이미지 이름):(버전 정보)


  위 명령어를 응용해서 우리가 방금 만든 nginx 웹 서버 전용 우분투를 데몬(Daemon)으로 실행해보았습니다. 데몬 명령어는 -d 옵션으로 줄 수 있으며 웹 서버나 데이터베이스 서버와 같이 계속해서 실행이 되고 있어야 하는 서비스에 주로 적용합니다. 버전 정보는 우리가 만들 때 적어 주었던 0.1 버전으로 적어주었습니다. 또한 -p 옵션을 이용해 호스트 서버의 80번 포트와 도커 서버의 80번 포트를 연결해주었습니다.


  이후에 docker ps 명령어도 넣어보니까 위 그림과 같이 새로운 컨테이너가 돌아가고 있으며 포트 번호가 0.0.0.0:80->80/tcp로 매핑이 되어있는 것을 알 수 있습니다. 여기에서 0.0.0.0은 로컬(Local)이라고 이해하시면 됩니다.



  이제 돌아가고 있는 웹 서버에 접속하기 위해 docker-machine ip 명령어를 입력해 아이피 주소를 확인해봅시다. 아이피 주소는 도커 머신의 기본 주소인 192.168.99.100이군요.



  이제 바로 브라우저를 실행하여 192.168.99.100:80으로 접속합니다. 그럼 바로 위와 같이 웹 서버에 접속이 된 것을 알 수 있습니다. 이렇게 아주 간단하게 직접 우분투 이미지에 nginx를 설치한 새로운 '이미지'를 생성하는 방식으로 웹 서버를 띄워보았습니다.



  이렇게 웹 서버를 만들게 되면 데몬으로 계속 돌아가기 때문에 컨테이너를 바로 지우거나 할 수 없습니다. 그래서 먼저 컨테이너의 동작을 중지시키고, 컨테이너를 제거한 뒤에 비로소 이미지 파일까지 안정적으로 지울 수 있습니다.


docker stop (컨테이너 ID): 현재 작동 중인 컨테이너를 정지(Stop) 시킵니다.

docker rmi (이미지 ID): 현재 도커 머신에 저장된 특정한 이미지를 삭제합니다.


  저는 방금 만들어보았던 myubuntu 이미지를 제거해보았습니다. 그랬더니 Deleted가 여러 번 수행되는 것을 알 수 있습니다. 정확히 일치하지는 않지만 제거되는 횟수는 일반적으로 도커 파일(Docker File)을 작성할 때 사용했던 명령어 라인의 수와 비례합니다.

728x90
반응형

728x90
반응형

윈도우에서 도커(Docker) 공유 폴더 생성 및 도커 머신에서 공유 파일 실행하기

나동빈


  지난 시간에는 도커에서 단순히 파이썬(Python) 개발환경을 콘솔 환경으로 실행해보는 시간을 가져보았습니다. 다만 도커(Docker)에서 특정한 애플리케이션을 실행하여 효과적으로 운용하기 위해서는 공유 폴더 기능이 반드시 필요합니다. 예를 들어 파이썬 스크립트를 미리 작성하거나, 웹 서버까지 구축한 이후에 '배포할 때만' 도커를 이용하는 식입니다. 이번 시간에는 그러한 전반적인 과정을 익히는 시간을 가져보도록 하겠습니다.


  공유 폴더: 도커 머신과 Host OS가 파일을 공유하기 위해 사용하는 폴더를 의미합니다.



  위와 같이 C 드라이브 내에 하나의 폴더를 만들어봅시다. 기본적으로 윈도우에서 도커 툴박스를 실행할 때는 관리자 권한이 아닌 일반 권한으로 실행하기 때문에 기존의 Program Files 폴더에는 쓰기 권한이 없을 수 있습니다. 따라서 저는 C:\Docker 경로를 사용하려고 합니다.



  폴더 생성 이후에는 위와 같이 C:\Docker 폴더로 이동해서 hello.py 스크립트를 작성해봅시다.



  내용으로는 print('hello')를 채우고 종료(ESC) -> :wq!를 입력해 저장하고 나가기를 해줍시다.



  그러면 위와 같이 해당 폴더 내에 hello.py 파일이 생긴 것을 확인할 수 있습니다.



  이제 VirtualBox에서 자신이 사용하고 있는 도커 머신(Docker Machine)의 '설정'을 확인해 '공유 폴더' 경로를 찾습니다.



  기본적으로 윈도우(Windows) 운영체제에서 도커를 설치하면 C:\Users 폴더가 공유 폴더로 자동으로 지정됩니다. 저는 위와 같이 공유 폴더를 효과적으로 사용하기 위해 Docker 폴더를 만들어 C:\Users\Docker를 공유 폴더로 쓰고자 합니다.


  이제 해당 공유 폴더에 hello.py 파일을 복사해줍시다.



docker-machine ls: 존재하는 도커 머신의 목록을 출력합니다.

docker-machine ssh (도커 머신 이름): 특정 도커 머신으로 접속합니다.


  도커 머신에 SSH 명령어를 이용해 접속하는 경우 도커 머신과 Host OS는 완전히 분리됩니다. 도커 머신 내부로 들어온 것입니다.



  도커 머신 내부에서 C 드라이브 사용자(User) 공유 폴더에 접근할 때는 /c/Users/ 경로로 접근해야 합니다. 이는 공유 폴더로 지정이 되었기 때문에 접근이 가능한 것으로 Host OS의 다른 폴더에는 접근할 수 있는 권한이 없습니다.



  이제 다시 도커 머신에서 밖으로 탈출합시다.



docker run -v (호스트 공유 경로):(도커 머신 공유 경로) python (파이썬 명령어)


  위 명령어에서는 -v 옵션이 적용되어 볼륨(Volume) 마운팅 기능이 사용됩니다. 도커(Docker)에서는 항상 호스트(Host)와 도커 머신(Docker Machine)이 :(콜론)을 기준으로 매칭이 이루어집니다. 즉 호스트를 기준으로 했을 때는 아까 우리가 만든 공유 경로인 C:\Users\Docker를, 도커 머신을 기준으로 했을 때는 도커 머신 내부의 /home/Shared 디렉토리를 선택해서 서로 실시간으로 공유하도록 만들어 준 겁니다.


  결과적으로 위 명령어를 실행하면 도커 머신 내부의 /home/Shared 폴더에 hello.py가 존재하는 것처럼 처리되어 hello.py를 실행할 수 있게 된 겁니다. 또한 명령어에서 python 키워드를 두 번 써주었는데, 왼쪽은 python 이미지를 사용하겠다는 의미이며 오른쪽은 python 명령어 그 자체를 의미합니다. 결과적으로 hello.py의 내용이 실행되어 'hello'가 출력된 것을 알 수 있습니다.

728x90
반응형

728x90
반응형

도커(Docker)를 이용해 파이썬 개발환경 즉시 구축해보기

나동빈


  이전 강의까지 도커(Docker)의 개괄적인 내용에 대해 함께 공부해보는 시간을 가졌습니다. 하지만 아직까지 공부한 내용으로는 도커를 굳이 사용할 이유를 못 느끼셨을 수 있습니다. 이번 시간부터는 간단한 예제부터 다루어보며 도커를 왜 사용해야 하는지 함께 알아 볼 것입니다. 일단 먼저 컨테이너 목록 확인 및 삭제 방법부터 알아봅시다.


※ 컨테이너 목록 확인 및 삭제 ※



  일단 지난 시간에는 hello-world를 띄워보는 시간을 가졌습니다. docker ps -a 명령어를 통해 해당 컨테이너를 확인한 결과는 위와 같습니다.



docker rm (컨테이너 ID): 특정 컨테이너를 삭제합니다.

docker rm (컨테이너 ID) -f: 특정 컨테이너를 강제로 삭제합니다.


  위와 같이 hello-world 컨테이너는 더이상 사용되지 않으니까 지워주도록 합시다.



  이후에 다시 컨테이너 목록을 확인해보니 어떠한 컨테이너도 나오지 않는 것을 알 수 있습니다.


※ 파이썬 개발환경 구축해보기 ※


  먼저 파이썬 개발환경을 도커를 이용해 구축해보겠습니다.


  docker run -it python: 파이썬 이미지를 다운로드 받아서 실행해주는 명령어입니다.


  이 때 -it 옵션은 표준 입출력을 이용해 컨테이너에 명령어를 입력할 수 있게 해줍니다.



  위와 같이 파이썬을 실행하여 다양한 명령어까지 입력해 본 것을 알 수 있습니다.


  네, 정말 이게 끝입니다... 윈도우에서 이것보다 쉽게 파이썬 콘솔 개발환경을 이용할 수 있을까요?


※ 컨테이너의 재시작 및 재접속 ※


  이제 간단히 컨테이너를 종료하고, 재시작 및 재접속 해보는 방법도 알아보겠습니다.



quit(): 파이썬 콘솔을 종료시키는 명령어입니다.

docker start (컨테이너 ID): 종료된 컨테이너를 재시작하는 명령어입니다.

docker attach (컨테이너 ID): 특정 컨테이너로 재접속하는 명령어입니다.


  위 화면과 같이 해주시면 다시 재접속이 가능합니다.



  파이썬3을 실행하고 있는 컨테이너에 접근해 볼 수도 있습니다. 이 때는 주로 bash 쉘을 이용합니다.


docker exec -it (컨테이너 ID) bash: 실행 중인 컨테이너에 배시(Bash) 쉘로 접속하는 명령어입니다.


  위와 같이 성공적으로 접속한 것을 알 수 있습니다.

728x90
반응형

728x90
반응형

도커 툴박스(Docker Toolbox)를 구동시키는 Virtual Box 분석하기

나동빈


  윈도우에서 도커를 갓 접하여 공부하시는 분들에게는 도커(Docker) 관련 Virtual Box 환경설정 때문에 애를 많이 먹게 됩니다. 그래서 나중에 헤매이지 않기 위해서 몇 가지 Virtual Box 관련 상식을 알고 있으시는게 좋습니다. 이를 건너뛰고 다음 강의를 보셔도 상관이 없지만 이 강의에서 다루는 내용을 제대로 숙지하고 넘어가시는 것을 강력하게 추천합니다.


  현재 다루는 내용은 도커 툴박스(Docker Toolbox)를 설치하신 분을 기준으로 설명이 진행됩니다. 다시 말해 Oracle VM VirtualBox를 사용한다고 가정하는 것입니다.


※ Virtual Box는 어떻게 사용되고 있는 걸까? ※



docker-machine ls: 현재 설치된 모든 도커 머신(Docker Machine) 정보를 출력합니다.


  위 명령어 입력 결과 'default'라는 이름의 도커 머신이 돌아가고 있는 것을 알 수 있습니다. 그렇다면 이러한 도커 머신은 어디에서 확인할 수 있을까요?



  도커 툴박스를 설치하면서 자동으로 설치된 Oracle VM VirtualBox를 열어봅시다. 그랬더니 방금 도커 머신에서 확인했던 'default'가 보입니다. 다시 말해 도커 머신은 하나의 ISO 이미지 파일로 동작한다고 볼 수 있는 겁니다. 우리는 우리의 컴퓨터에 여리 개의 도커 머신을 설치할 수 있는데요, 도커 머신을 설치할 때마다 완전히 다른 ISO 이미지 파일이 생성되어 우리의 Virtual Box 위에서 돌아가는 것이라고 할 수 있습니다. 그렇기 때문에 도커 머신끼리는 완전히 분리되어 각각 다양한 이미지와 컨테이너 파일을 다룰 수 있는 것입니다.



  한번 'default' 이미지 파일의 '자세한 정보'를 살펴봅시다. 그랬더니 리눅스 운영체제 64-bit으로 설정된 것을 알 수 있습니다. 신기한 점은 boot2docker.iso를 이용하고 있는데, 이미지 파일이 48MB 밖에 안 됩니다. 우분투(Ubuntu) 등의 리눅스 운영체제를 설치해보신 분들은 아시겠지만 보통 운영체제는 1GB는 우스울 정도의 큰 용량을 가집니다.


  그에 반해 도커(Docker)는 가벼운 용량을 위해 최소한의 기능만을 갖춘 운영체제의 위에서 돌아가도록 설계된 겁니다. 지난 시간에 언급했듯이 사실 윈도우는 Docker Host OS가 될 수 없으므로 이러한 리눅스를 가상으로 구축하여 그 위에 도커 엔진을 올리게 되는 것이랍니다.


※ 물리적 경로에서 살펴보기 ※


  ▶ 도커 머신의 물리적 경로: C:\Users\(사용자 이름)\.docker



  윈도우 운영체제에서 도커 머신은 실제로 위 경로에서 찾을 수 있습니다. 다시 말해 .docker 폴더 내에 실질적인 도커 머신 관련 이미지 파일을 포함해 각종 파일들이 모두 들어가 있는 겁니다.



  위와 같이 'default' 도커 머신의 경로를 찾아 들어가봅시다. 그랬더니 ISO 파일 및 vmdk 파일이 존재합니다. 다시 말해 Virtual Box에서 돌릴 수 있는 이미지가 그대로 존재하는 겁니다. vmdk 파일은 도커 머신 내부의 이미지 및 컨테이너를 모두 포함하고 있는 파일이기 때문에 만약에 특정 도커 머신에 이미지를 많이 설치하면 이 파일의 크기가 매우 커집니다. 이것저것 필요한 걸 모두 설치하다 보면 20GB도 우습게 될 수 있습니다. 도커는 가벼운 용량을 지향하지만 부득이한 경우를 잘 고려하셔야 합니다.



docker version: 클라이언트 및 서버의 버전 정보를 출력합니다.


  위 명령어는 클라이언트 혹은 서버 중에서 설정이 잘못 되어있으면 위와 같이 정상적으로 출력이 되지 않을 수 있답니다. 일단 위 경우를 살펴보자면 클라이언트 정보는 'Windows'이고, 서버 정보는 'Linux'입니다. 이것이 어떤 의미냐면 현재 도커 서버는 아까 봤듯이 기본적으로 리눅스 운영체제를 Host로 하여 돌아가고 있으므로 거기에 접속을 할 때는 윈도우 상의 클라이언트 소프트웨어가 이용된다는 말입니다. 우리도 모르는 사이에 커맨드 명령을 입력해서 도커 서버와 통신을 하고 있는 것입니다. 물론 클라이언트나 서버나 지금은 실습하고 있는 우리 로컬 컴퓨터 안에 모두 포함되어 있지만요.


  재미있는 점은 도커 자체는 '관리자 권한(root)'으로 실행되지만 도커 위에서 돌아가는 컨테이너(Container) 자체는 Host에 대한 관리자 권한이 없습니다. 컨테이너 안에서만 사용되는 권한이 부여되는 것이기 때문에 Host OS와 도커 컨테이너는 완전히 분리됩니다. 그래서 컨테이너가 해킹(Hacking)을 당해도 웹 서버와 같은 코어 모듈이 아닌 이상 Host OS까지 모두 피해를 받는 일은 적습니다. 또한 지금처럼 Host OS가 윈도우 상에 올라가 있는 가상 리눅스라면 리눅스를 타고 윈도우까지 침입을 하는 경우는 더 어렵죠. 물론 실제 상용 서버에서는 윈도우가 아닌 자체 리눅스 Host OS에서 도커 엔진을 돌리는 경우가 많기 때문에 보안상의 만반의 준비를 하실 필요가 있습니다.

728x90
반응형

728x90
반응형

윈도우에서 도커 툴 박스(Docker Toolbox)를 설치해서 도커 구동시키기

나동빈


※ 도커의 동작 과정 살펴보기 ※


  지난 시간에는 간단히 도커(Docker)에 대한 소개를 하는 시간을 가졌습니다. 이번 시간에는 직접 윈도우(Windows) 운영체제에 도커를 설치해서 구동시켜보는 시간을 가져보도록 하겠습니다. 먼저 간단하게 도커를 설치하기 이전에 이해도를 높이기 위해서 도커를 설치한 뒤의 실행 화면을 먼저 살펴보도록 하겠습니다. 이전 시간에도 잠깐 소개했던 솔로몬(Solomon) Hykes의 도커에 대한 발표 내용입니다.



  '리눅스 컨테이너의 미래'라는 거창한 이름의 발표입니다. 일단 바로 중반부에 등장하는 내용을 발췌해보겠습니다.


docker ps

=> 현재 돌아가고 있는 컨테이너를 확인하는 명령어입니다.


docker images

=> 현재 도커 머신에 설치된 도커 이미지를 확인하는 명령어입니다.


docker run -a busybox echo 'Hello World'

=> 먼저 로컬 서버에서 busybox라는 이미지를 찾습니다.

=> 로컬 서버에 해당 이미지가 없으면 도커 허브(Docker Hub)에서 자동으로 다운로드 받습니다.

=> 해당 이미지를 이용해 컨테이너를 실행합니다.

=> 컨테이너 실행 과정에서 디스크 및 메모리를 할당해서 순식간에 리눅스 서버를 구축합니다.

=> 새롭게 생성된 리눅스 서버에서 'Hello World'를 출력합니다.

=> 출력된 결과를 유닉스 소켓을 이용해 클라이언트로 전송하여 화면에 출력합니다.


  발표에서는 정말 쉽게 쉽게 명령어를 입력하고 있는 것처럼 보이지만, 내부적으로는 엄청난 일들이 일어나고 있는 겁니다!


※ 도커 소프트웨어의 개요 ※


  도커는 크게 ① 오픈소스 무료 버전(Community Edition), ② 유료 버전(Enterprise Edition)으로 나뉩니다.


  기본적으로 CE 버전으로도 도커의 모든 기능을 이용하는데 큰 제약이 없지만 안정적으로 실 서버에 도커를 운용하려면 EE를 사용하는 것이 훨씬 유리합니다. 기본적으로 도커 EE를 쓰면 각 서버별로 연간 1,000 달러 이내의 라이선스 비용이 소요됩니다. 다만 전반적인 배포 과정을 훨씬 편리하게 해주어 효용이 높습니다. 또한 현재는 기본적으로 도커 엔진 자체가 사실상 스웜(Swarm)이나 쿠버네티스(Kubernetes) 기술을 지원하고 있어서 유료 서비스만 잘 엮어서 쓰면 매우 강력한 기능을 쉽게 이용할 수 있습니다.


  도커 엔진(Docker Engine): 특정한 소프트웨어를 도커 컨테이너로 만들고 실행하게 해주는 데몬(Daemon)을 의미합니다. 도커 엔진과 도커 클라이언트 사이에는 REST API가 사용됩니다. REST API 서버에 요청을 보내는 것이 도커 클라이언트입니다.


  도커 클라이언트(Docker Client): 도커 엔진과 통신하는 소프트웨어로 개발자가 직접 이용할 수 있습니다. 윈도우(Window)/맥(Mac)/리눅스(Linux)를 지원합니다. 물론 윈도우는 도커를 사용하기에 최악의 조건이고, 리눅스가 제일 최상의 조건이지만 도커는 공식적으로 윈도우를 제대로 지원하고 있습니다.


  도커 호스트 운영체제(Docker Host OS): 도커 엔진을 설치할 수 있는 운영체제 환경을 의미합니다. 64비트 리눅스 커널 버전 3.10 이상 환경을 의미하고, 32비트 환경에서는 도커 엔진이 돌아가지 않는답니다. 애초에 초기의 도커 이미지는 심지어 오직 우분투(Ubuntu) 운영체제 전용이었어요. 현재는 우분투, CentOS, Debian, Fedora 등에서 사용할 수 있게 되었지만요.


  추가적으로 언급하자면, 사실 윈도우는 Docker Host OS가 될 수 없습니다. 당연한 거죠. 도커 엔진은 기본적으로 리눅스 OS 위에서 돌아가는거니까 가상화 기능이 필요합니다. 하지만 다행히도 마이크로소프트(Microsoft)는 기본적으로 도커(Docker)에 많은 관심을 가지고 있는 상황입니다. 그 결과 마이크로소프트는 도커의 초기 버전부터 많은 모듈을 덧붙여서 윈도우 파일 시스템과 도커의 파일 시스템이 연동될 수 있도록 모듈을 개발하여, 현재는 윈도우 컨테이너가 도커 명령어로 정상적으로 작동하고 리눅스 컨테이너와 상호 통신까지 가능합니다.


  도커 머신(Docker Machine): 로컬 및 원격지 서버에 도커 엔진을 설치하고, 다양한 환경 설정을 자동으로 수행해주는 클라이언트를 의미합니다.


  우리가 이번 시간에 설치하게 될 도커 툴박스(Docker Toolbox)는 도커 CE의 이전 버전인데, 윈도우 10 Enterprise/Professional 이전 버전의 윈도우 사용자는 필수적으로 이러한 도커 툴박스를 이용해야 합니다. 물론 기능상으로 큰 문제는 없기 때문에 그냥 이용하시면 됩니다.


▶ 도커 툴 박스 설치 사이트: https://docs.docker.com/toolbox/toolbox_install_windows/


  위 사이트에 접속하면 기본적으로 윈도우 10 Enterprise/Professional은 툴박스가 아니라 윈도우 도커(Docker For Windows) 애플리케이션을 설치할 것을 권장하는 것을 알 수 있습니다. 하지만 우리는 최신 버전의 도커 애플리케이션을 이용하지 않고, 툴박스를 이용할 겁니다. 툴박스를 이용해도 기능적으로는 문제가 없습니다. 이용상의 장단점에 대해서는 차차 알아가시면 됩니다.

  

  우리가 설치할 도커 툴박스는 기본적으로 오라클 VM VirtualBox를 기반으로 동작합니다. 쉽게 말하면 윈도우 위에 리눅스 가상 머신을 돌리고, 그 위에서 도커 엔진을 돌리는 방식이라고 이해할 수 있습니다. 그래서 일단 기본적인 VM 가상화 기능을 사용할 수 있어야 합니다. 따라서 윈도우 운영체제에서 '작업 관리자'의 '성능' 탭에 들어갔을 때 가상화 기능이 활성화 되어있어야 합니다.



  위 사진은 제 컴퓨터의 '작업 관리자'입니다. 저는 윈도우 10 홈(Home) 버전을 쓰고 있어서 이렇게 나오는 건데요, 그냥 '가상화'가 '사용'이라고 되어 있는 것을 체크하시면 됩니다. VM 기능을 이용할 수 있는 상태이므로 바로 도커 툴박스 버전을 설치하면 되는 겁니다. 만약에 '가상화'가 비활성화 되어있으신 분은 노트북 혹은 데스크탑을 재부팅하셔서 바이오스(Bios)에 진입하여 '가상화' 기능을 활성화 해주시면 됩니다.



  이제 바로 위와 같이 'Get Docker Toolbox for Windows'를 눌러서 툴박스 설치 프로그램을 다운로드 받아주세요!


※ 툴박스를 설치하면 자동으로 설치되는 것들 ※


- 도커 엔진이 이미지 및 컨테이너를 생성할 수 있도록 해주는 도커 클라이언트(Docker Client)

- 윈도우 터미널에서 사용하는 도커 엔진 명령어를 이용하게 해주는 도커 머신(Docker Machine)

- 도커 컴포즈(Docker Compose) 기능

- 도커 GUI 도구인 카이트메틱(Kitematic)

- 도커 명령어 입력이 가능한 도커 빠른시작 터미널(Docker QuickStart Shell)

- 오라클 VM VirtualBox


  말했듯이 윈도우에서는 기본적으로 도커 엔진을 구동시킬 수 없습니다. 그래서 작은 크기의 VM 리눅스 위에서 도커 머신 명령어를 입력하는 식으로 도커 엔진에 접근할 수 있습니다. 즉, VM이 도커 엔진의 호스트 역할을 수행하게 되는 겁니다. 그렇기 때문에 당연히 도커 툴박스 관리 도구 및 ISO 파일이 함께 설치됩니다. 이 ISO 파일이 오라클 VM VirtualBox 위에서 동작하는 것이라고 볼 수 있습니다.



  도커 툴박스 설치 프로그램을 실행하면 위와 같습니다.



  설치 경로를 물어보는데 기본 경로로 넣으시면 됩니다. 나중에 이 경로가 도커 기본 터미널의 경로로 설정됩니다.



  이제 설치 구성 목록을 물어보는데, 전체 설치(Full Installation)으로 설정해주세요. 보시면 도커 컴포즈(Docker Compose) 및 VirtualBox와 Kitematic이 설치되는 것을 알 수 있습니다. 전부 위에서 언급했던 것들이에요. 추가적으로 추후에 도커 이미지 생성을 위한 각종 파일들은 모두 깃(Git)을 이용해서 관리하는 것이 일반적이므로 혹여나 깃이 설치되어있지 않으신 분들은 설치해주시는 것을 강력히 추천합니다.



  이후에 위와 같이 기본적인 환경설정 요소를 체크해주시고 넘어가시면 됩니다.



  이제 설치를 진행합니다.



  설치 완료 이후에는 다음과 같이 세 개의 아이콘이 바탕화면에 나타날 겁니다.



※ 도커의 기본 컨셉 ※


  도커는 기본적으로 개발, 배포, 실행 단계를 지원하는 목적으로 사용됩니다. 애플리케이션을 배포할 때는 컨테이너화(Containerization)하여 배포하게 되는데, 말 그대로 특정한 애플리케이션을 컨테이너에 담아서 구동시키는 것을 의미합니다. 컨테이너가 가지는 다양한 특징들 때문에 '컨테이너화' 기술은 매우 각광받게 되었습니다.


- 유동성(Flexible): 매우 복잡한 소프트웨어들이 컨테이너화 될 수 있습니다.

- 가벼움(Lightweight): 컨테이너는 호스트 커널의 기능을 극대화하고 공유할 수 있습니다.

- 상호변경성(Interchangable): 업데이트 및 업그레이드를 즉시 수행할 수 있습니다.

- 이식성(Portable): 로컬에서 빌드하고, 클라우드에 배포하고, 어디에서나 실행할 수 있습니다.

- 확장성(Scalable): 컨테이너의 복제품을 자동적으로 증가시키고 분배할 수 있습니다.

- 수직성(Stackable): 다양한 서비스를 쌓아 올려 훌륭한 서비스를 만들 수 있습니다.


※ 도커 기본 사용법 ※


  위 사진은 도커 실행 화면입니다.



docker --version 명령어를 입력해서 설치된 도커의 버전을 확인할 수 있습니다.

docker info 명령어를 입력해서 설치된 도커의 버전을 보다 상세하게 확인할 수 있습니다.



docker run hello-world: 도커에서 헬로우 월드(Hello World)를 띄우는 명령어입니다. 우리 눈에는 보이지 않지만 다음의 과정이 포함되는 겁니다.


1) hello-world라는 이미지를 검색한다.

2) 로컬에 이미지가 있으면 쓰고, 없으면 도커 허브(Docker Hub)에서 내려받는다.

3) 해당 이미지를 컨테이너로 동작시킨다.


  결과적으로 위 화면과 같이 Hello World가 성공적으로 출력되었습니다.



docker images: 현재 도커 머신에 존재하는 이미지 목록을 출력합니다.



docker ps -a: 현재 도커 머신에 존재하는 컨테이너를 출력합니다.

728x90
반응형

728x90
반응형

도커(Docker)의 개요

나동빈


※ 도커의 개요 ※


  이번 시간에는 최근까지 소프트웨어 개발자들에게 계속 핫한 주제였던 도커(Docker)에 대해서 알아보도록 하겠습니다. 도커(Docker)리눅스 컨테이너를 기반으로 하여 특정한 서비스를 패키징하고 배포하는데 유용한 오픈소스 프로그램입니다.



  도커 공식 서비스는 위 사진과 같이 귀여운 고래 모양의 캐릭터를 메인 로고로서 사용하고 있습니다.


※ 도커를 사용해야 하는 이유 ※


  이번 글에서는 도커를 사용해야 하는 이유에 대해서만 제대로 이해하셔도 충분합니다. 기존에 다양한 형태로 개발을 하셨던 분들이라면 Maven, Gradle, FTP 등의 다양한 패키징 및 배포 도구를 사용해보신 적 있으실 거에요. 이러한 배포 도구들이 사용되었던 이유는, 특정한 소프트웨어를 개발한 이후에 배포하고자 할 때 해당 프로그램이 어디에선가 손쉽게 구동이 되도록 하기 위해서에요. 예를 들어 열심히 웹 개발을 했는데, 실제로 접속이 가능한 웹 서버에 배포를 하지 못한다면 누구도 그 서비스를 이용할 수 없겠죠?


  예를 들어 저는 이전에 JSP를 이용해서 웹 사이트를 개발하는 방법에 대해 소개한 적이 있었어요. 웹 사이트를 개발한 이후 마지막 단계는 배포 및 운영 단계입니다. 그럴 때는 카페 24나 AWS 등의 클라우드 서비스를 이용해 웹 서비스를 배포하는 것이 일반적이에요. 그런데, 일반적으로 이러한 '호스팅 서비스'는 우리의 로컬 컴퓨터와는 차이점이 존재해요. 특정한 서버 환경에 우리가 만든 웹 서비스를 맞추어서 배포해야 하므로 갖가지 설정이 필요하죠. 초기 상태에서 시작한다면 JVM을 설치해야 되고, 톰캣(Tomcat)도 필요하고, 등 할 게 많아요. 또 같은 리눅스라고 해서 괜찮은 것도 아니고, 리눅스 버전에 따라서도 설치 방법이 다르답니다.



  그래서 등장한 것이 바로 '컨테이너(Container)'의 개념이에요. 도커를 설치하면, 컨테이너에 '이미지(Image)'를 담아서 구동시키는 방식으로 손쉽게 배포할 수 있어요. 이러한 컨테이너를 어떻게 만들고, 활용할 지에 대해서는 미리 도커 소프트웨어가 정의를 해 놓고 있어서 도커를 사용하는 우리들은 단순히 이미 배포된 소프트웨어 이미지를 도커를 통해 컨테이너에 올리면 되요. 다시 말해서 우리는 도커만 설치를 하면 나머지는 알아서 설정이 이루어지는 겁니다. JVM, 톰캣 등을 따로따로 설치할 필요가 없으며 도커 하나만 있으면 이 친구가 알아서 해결해줘요.



  나중에 자세히 알아보겠지만, 위 그림과 같이 도커 파일(Docker File)이라는 것을 만들어서 '나는 어떠한 소프트웨어를 컨테이너에 담아서 구동시킬 것이다.'라는 것만 정확히 명시해주고 빌드(Build)를 해주면, 알아서 도커 이미지가 그에 맞게 생성이 됩니다. 그래서 그 이미지를 구동시키면 순식간에(웹 서버도 몇 초만에 뚝딱!) 도커 컨테이너 위에서 실행이 됩니다.


  물론 도커 이전에도 이러한 컨테이너(Container) 기반의 기술이 다수 존재했었어요. 하지만 도커의 고유한 창의적인 기능들과 편리함 때문에 현재 도커가 패키징, 배포 시장을 잠식하고 있는 상태랍니다. 도커는 말씀 드렸듯이 컨테이너(Container) 형태로 동작하는데, 기존에 VM(Virtual Machine) 서비스를 이용해 본 적이 있으신 분들이라면 다소 헷갈릴 수 있어요. 그래서 VM과 도커가 어떻게 다른 기술인지 확실히 이해할 필요가 있답니다.


※ VM(Virtual Machine)과 컨테이너(Container)는 무엇이 다를까 ※


  기본적으로 기존에 우리가 많이 사용하던 VM(가상 머신)과 컨테이너는 큰 차이가 있습니다. 가상 머신은 가상화 기능을 사용해 Guest OS라는 것을 만들어냅니다. 예를 들어 윈도우(Windows) 운영체제를 사용하는 사람이 칼리 리눅스를 새롭게 가상 머신 위에서 구동시킨다면, 윈도우는 Host OS이고 칼리 리눅스는 Guest OS입니다. 다시 말해 Guest OS와 Host OS는 사실상 완전히 별개로 존재할 수 있다는 점에서 서로 의존적이지 않습니다. 대신에 Guest OS의 I/O 기능이 사실상 Host OS를 거쳐서 이루어지기 때문에 속도가 느리다는 단점이 있습니다. 뿐만 아니라 Guest OS 자체가 완전히 새로운 운영체제로서 존재해야되기 때문에 아무리 가벼운 OS를 설치하려고 해도, 용량이 큽니다.



  반면에 컨테이너(Container)는 가상 머신 대신에 도커 엔진(Docker Engine) 위에서 동작한다는 특징이 있어요. 이렇게 해주면 별도의 Guest OS가 사용되지 않아서 성능적으로 매우 개선됩니다. 메모리 용량도 적게 차지하고요. 다만 기본적으로 사용하고 있는 운영체제와 도커의 컨테이너(Container)에 의존성이 존재합니다. 이로 인해 각종 보안 문제로 공격을 받은 적이 있었구요. 기본적으로 윈도우(Windows) 운영체제를 사용하고 있는 컴퓨터는, 도커 엔진 위에 올라가는 컨테이너도 윈도우 컨테이너(Windows Container)여야 합니다. (다행히도 최근에는 도커와 윈도우의 호환성이 매우 높아지고 있어서 사실상 리눅스 컨테이너와 윈도우 컨테이너의 구분이 모호해지고 있습니다.)


  도커는 Container라서 VM에 비해 이미지 파일의 크기가 작아 빠르게 이미지를 만들고 실행할 수 있다는 특징이 있습니다. 예를 들어 대표적인 리눅스 운영체제 배포판 중에서 알파인(Alpine)은 최소한의 기능만 들어가 있어서 5MB 가량으로 작게 구성되어 있습니다. 가상 머신 기술을 이용하는 경우 아무리 운영체제를 가볍게 설치하려고 해도 최소한 기가 바이트 단위인데, 이렇게 Container를 이용하면 그 크기가 200MB 전후로 줄어들 수 있어서 가히 초경량 배포 도구라고 할 수 있답니다.


※ Solomon Hykes의 도커(Docker) ※


  도커의 시작을 알린 사람은 Solomon Hykes로 2013년 PyCon에서 '리눅스 컨테이너의 미래'라는 제목으로 도커에 대해서 발표했습니다. 발표 내용은 유튜브(YouTube)에도 올라와 있어서 손쉽게 확인할 수 있습니다. (https://www.youtube.com/watch?v=wW9CAH9nSLs)



  보시면 솔로몬 씨가 'Hello World'라는 문장을 띄운 것을 알 수 있습니다. 도대체 Hello World를 띄운 것이 뭐가 그렇게 대단하다고 사람들이 이렇게 도커에 열광하는 걸까요? 그것은 'Hello World'가 새로운 운영체제 위에서 출력이 된 것이기 때문입니다. 이것은 엄청난 발전입니다. 아니, 몇 초 만에 별도의 운영체제를 생성한 뒤에 'Hello World'를 출력한 것이니까요. VM을 사용해보신 분들이라면 이게 얼마나 편리한 것인지 감이 오실 겁니다.


  리눅스 컨테이너(Linux Container)는 오래 전부터 개발되던 기술입니다. 그 역사만 10년이 넘었습니다. 하지만 리눅스 컨테이너를 개발하거나 활용하는 기술은 복잡하고 까다로웠습니다. 그래서 다양한 회사가 컨테이너 기술을 사용하고 있음에도 불구하고 일반 개발자들 사이까지 널리 퍼지지는 못했습니다. 그러한 배경에서 도커가 등장함에 따라 그 방향이 바뀌게 됩니다. 리눅스 컨테이너 기술을 기반으로 하되, 매우 편리한 인터페이스 및 명령어를 가지고 있어서 컨테이너 기술을 잘 모르는 개발자들도 손쉽게 도커를 이용해 컨테이너를 띄워볼 수 있게 된 것입니다.


※ 도커는 어떻게 만들어졌을까? ※


  도커는 기본적으로 도커 엔진(Docker Engine)에 의해 동작합니다. 도커 엔진의 핵심 로직은 Google의 Go 언어로 개발이 되어 있습니다. Go로 개발된 도커 엔진은 기존의 C언어로 개발된 모듈보다 더욱 빠르게 동작합니다. Go 프로그래밍 언어는 기본적으로 포인터 등의 기능을 지원하며 Garbage Collector나 클래스 등의 기능까지 지원하는 언어입니다. 최근에는 깃(Git) 서버도 Go 언어로 개발이 되고 있습니다. 실제로 그렇게 Go로 개발한 서버 모듈이 빠르게 동작하죠. Go로 개발된 소프트웨어 중에서 가장 잘 나가고 있는 것이 바로 도커(Docker)인 것입니다.


※ 도커 패러다임 ※


  도커는 변경 불가능한 인프라(Immutable Infrastructure)를 주요 패러다임으로 상정하고 있습니다. 기본적으로 특정한 소프트웨어가 자주 수정되는 경우 서비스 안정성에 여러 가지 문제가 발생할 수 있습니다. 특히 언제 어떠한 부분이 변경되었는지 등의 이력 관리를 제대로 하는 것이 매우 중요합니다. 그러한 배경에서 아예 변경 자체를 못하도록 하자고 해서 '변경 불가능한 인프라'의 개념이 나타나게 되었는데, 이것은 서버를 구축한 이후에는 변경이나 업데이트를 할 수 없도록 하는 것입니다.


  그렇다면 서버에 문제가 생겨서 업데이트를 해야 되는 경우는 어떻게 할까요? 그냥 삭제해버리는 겁니다!


  서버 패치 등은 지속적으로 이루어져야 하는데 '어떻게 한 번 서버를 구축하고 나서 업데이트를 안 할 수 있을까요?' 사실 이는 처음 들었을 때 이해하기 힘들 수도 있는데요. 도커를 쓰다보면 서버 자체를 들었다 놨다 하는 것이 익숙해지실 겁니다. 다시 말해, 서버를 업데이트를 해야 할 때는 새로운 도커 이미지 자체를 업데이트 해서 그냥 컨테이너에 올리는 겁니다. 기존에 돌아가던 컨테이너는 완전히 '제거' 해버리구요.


  도커에서는 그냥 이미지를 도커 위에 올리는 것 만으로도 배포가 끝나버립니다. '변경 불가능한(Immutable)' 이라는 의미는 그 자체로 '상태가 없는(Stateless)', '확장 가능한(Scalable)' 형태입니다. 도커로 돌아가는 소프트웨어 자체는 어떠한 데이터도 가지고 있으면 안 되고, 임시 파일 정도만 가지고 있는 상태에서 돌아가야 합니다. 사용자 계정 정보와 같은 실질적인 데이터들은 외부 스토리지로 빼 놓아야 하는 겁니다. 최근에 자주 언급되고 있는 마이크로 서비스(Micro Service)의 특징과 매우 닮아있습니다.


※ 리눅스 컨테이너 ※


  도커는 말했듯이 대표적인 컨테이너 기술입니다. 일반적으로 리눅스 컨테이너(LXC)리눅스상에서 여러 개의 격리된 리눅스 시스템을 동작시키기 위한 운영체제 단의 가상화 기술을 의미합니다. Warden, Libvirt가 그 대표적인 예시입니다. 리눅스 커널(Kernel) 위에 Libvirt가 돌아가며 그 위에 컨테이너가 올라가는 방식이지요. 그래서 이러한 LXC 기술에 대한 이해가 높으신 분은 사실 도커와 같은 기술을 자체적으로 개발할 수도 있는 겁니다. 구글이 발표한 자료에 따르면 매주 수십억 개의 컨테이너가 전 세계적으로 구동된다고 합니다. 또한 구글이 운영하는 모든 서비스는 컨테이너를 기반으로 돌아갑니다. 왜냐구요? 성능이 좋으니까요. 구글은 도커 이전에도 이미 이러한 리눅스 컨테이너 기술을 사용하고 있었고, 최근에는 도커 기반의 기술을 많이 활용하고 있답니다.


  앞에서도 언급했지만 도커 이전의 LXC 기술들은 기본적으로 오래 전부터 사용되고 있었으나 설정이 매우 복잡하고, 사용하기 어려워 널리 알려지지 않았던 것입니다. 도커가 출시되면서 10분도 채 소요되지 않는 시간에 대부분의 서비스를 구동시킬 수 있어서 실질적으로 대부분의 개발자가 이용할 수 있는 레벨까지 편리성을 제공하게 된 것입니다.

728x90
반응형