안경잡이개발자

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
반응형