Docker, 그것은 무엇이고, 설치는 어떻게할까?

요즘 Docker 라고 하는 것이 굉장히 인기입니다. Docker 컨테이너는 알기 시작한건 저도 작년 10월부터였는데, 저도 꽤 많이 사용하고 있습니다.


What is Docker?


Docker를 검색하시는 분들은 아마 한 번쯤은 자신이 서버 운영을 해 본 경험이 있거나 서버 프로그래머 이실지도 모릅니다. Docker Container는 서버를 운영하거나 개발하는 데 있어서 굉장히 중요한 역할로 자리잡고 있습니다. 


What is Linux container?



Docker

리눅스 컨테이너는 리눅스에서 사용하는 가상화 시스템의 일종이지만, 가상 머신과는 다른 기술을 가지고 있습니다. 기존에 있는 리눅스의 가상 머신은 KVM(Kernel Virtual Machine)과 Xen이 가장 대표적이었고, 그들은 하드웨어 가상화를 사용한 실제 가상 머신이었습니다.


위에 보이는 사진이 바로 가상 머신의 구성도입니다. HOST OS는 현재 자신이 사용하고 있는 운영체제이고, 그 운영체제 위에 HYPERVISOR라는 하드웨어 가상화를 사용하여 그 위에 또 다른 운영체제를 설치하는 것이 바로 가상 머신입니다. 프로그램으로 보자면, 여러분들이 어렸을 때 많이 즐겨했던 MAME32 게임, Snes9x, zNES 머신들을 볼 수 있습니다. 이들은 모두 GUEST OS를 가지고 있긴 하지만 장치 자체를 모방 하기도 하고, 해당 프로그램 하나에서만 종속적이죠. 흔히 이런 것을 에뮬레이터라 합니다. 하지만 여기에 나와 있는 HYPERVISOR는 똑같이 가상의 머신이긴 하지만, 호스트 컴퓨터에서 다수의 운영체제를 실행하기 위한 논리적인 한 플랫폼이기 때문에 그냥 그저 프로그램 하나가 다른 장치를 모방하는 에뮬레이터 즉, SNES나 MAME32와 같은 프로그램과는 다른 부류에 속하게 됩니다.


위 사진은 Docker의 구성도입니다. Docker는 리눅스 컨테이너의 가장 대표적인 종류 중 하나로, Google, Facebook 등의 대기업에서 주로 사용합니다. Docker는 Virtual Machine과 달리 Guest OS를 가지고 있지 않으며, 모든 애플리케이션을 Host OS의 Kernel에서 공유하여 구동합니다. 그렇기 때문에 구축이 매우 쉽고, 빠르며 하드웨어 가상화가 필요 없기 때문에 그만큼의 리소스를 줄일 수 있다는 장점을 가지고 있습니다.




Docker 장/단점

Docker는 Host OS의 커널을 공유하여 사용하기 때문에 그만큼의 리소스를 줄일 수 있지만 반면에 단점도 지니고 있습니다.


장점 

   - 하드웨어 가상화가 필요 없어 별도의 Guest OS를 설치할 필요가 없습니다. (저장 장치 용량 절감)

   - Guest OS를 설치하지 않기 때문에 구동시 별도의 하드웨어 초기화나 init 프로세스를 구동할 필요가 없습니다. (RAM, CPU 사용량 절감)


단점

   - 리눅스 컨테이너이기 때문에, Linux 이외의 운영체제는 설치/실행할 수가 없습니다. 

   - 또 리눅스 커널을 사용하기 때문에 가상 환경 또한 리눅스 외의 운영체제는 머신으로 생성할 수 없습니다.

   - Host OS의 커널을 공유해서 사용하기 때문에 커널에 다소 차이가 있습니다. (제한적임)


단점 마지막 부분을 적어야할지 적지 말아야할지를 굉장히 많이 고민했습니다. 사실 이 부분은 현재 해결된 부분이지만, 정확하게 얘기하자면, 리눅스 컨테이너는 최초에 root 계정으로 수행하게 됩니다. 하지만 Host OS의 커널을 공유해서 사용하기 때문에 컨테이너 내의 root도 root가 될 수 있습니다. 이 때문에 일반 사용자가 컨테이너를 실행시키고 root 권한을 습득할 수 있는 취약점이 생기게 됩니다. 현재 Docker에서는 Kernel 부분 (/proc)을 Read-only file system으로 지정해놓고, 패키지 부분도 따로 분리해놓고 있습니다.


또, 리눅스 가상 환경을 사용하고 있는 유저 중에 커널과 관련된 작업 하시는 분들이 가상 머신과 혼동하셔서 Docker로 CentOS를 설치하면 해당 배포판의 CentOS가 완벽하게 설치되시는 것으로 착각하시는 분들이 계십니다. 배포판은 CentOS가 맞기 때문에 명령어나 이런 부분은 당연히 CentOS의 명령어를 사용하지만 커널은 Host OS의 커널을 사용하기 때문에 Host OS가 만일 Ubuntu Linux라면 Docker로 설치한 CentOS의 커널은 Ubuntu Linux의 커널을 사용하기 떄문에, 이 점 반드시 알아두시고 사용하시기 바랍니다.




Docker 설치

Docker의 설치는 매우 간단합니다. 저는 Ubuntu Linux를 사용하므로, Ubuntu Linux를 예로 들어 설명하겠습니다.



$ sudo apt install docker.io

docker 패키지는 docker.io 이기 때문에, docker.io를 입력해줍니다.



# cat /etc/group | grep docker

root로 로그인하여, /etc/group 파일을 출력하는데, docker 부분을 색인하여 출력합니다.



docker 그룹에 어떤 사용자도 추가되어 있지 않습니다. 이럴 경우에는 root 사용자 이외에는 docker를 사용할 수 없습니다. 만약, 다른 일반 사용자에게 docker 사용 권한을 부여하고 싶다면, docker 그룹에 해당 사용자를 넣어주면 됩니다.



# usermod -a -G docker neonkid

usermod 명령어를 사용해, 그룹 이름과 해당 그룹에 추가할 사용자 이름을 입력해줍니다.



위와 같이 추가되면, 해당 계정으로도 docker를 생성/관리할 수 있습니다.




Docker 컨테이너 추가/실행

자 이제 Docker를 설치했으니 컨테이너를 추가하고, 실행해봅시다. 그 전에, 이미지를 다운로드 받아야 합니다.


Docker에 있는 리눅스 컨테이너의 이미지는 리눅스의 거의 모든 배포판이 포함되어 있습니다. 모의 해킹용 리눅스인 Kali Linux를 포함하여 CentOS, Ubuntu Linux 등이 있습니다. 여기서 본인이 자신의 서버를 테스트하기 위해 Kali Linux 패키지를 설치하여 테스트를 직접해볼 수도 있는데, 해당 내용에 대해서는 차후에 제가 자세하게 포스팅하여 다루도록 하겠습니다.


먼저 자신이 현재 가지고 있는 리눅스 이미지가 어떤게 있는지 알아봅시다.



# docker images 

처음 위 명령어를 뚜드리게 되면, 사실 아무것도 없습니다. 해당 명령어는 여러분들이 다른 서버 환경에서 Docker를 사용한다고 하였을 때, 익숙해지기 위해 알아두어야할 명령어이기 때문에 일단 먼저 알아보고 지나가게 되었습니다.


그럼 이제 우리가 어떤 배포판을 설치할 수 있는지에 대해서 알아봅시다.



# docker search ubuntu 

먼저 우리가 설치할 Ubuntu 배포판에 대해서 검색해봅시다. 검색해보면, 여러 이미지들이 있습니다. 아예 우분투를 초기 상태로 설치할 수 있는 이미지, upstart 데몬을 포함시킨 부팅 데몬 설치 이미지 등이 있습니다. Docker는 사용자가 직접 배포판을 만들어서 배포할 수가 있는데, 맨 처음 있는 ubuntu를 제외한 나머지는 전부 사용자가 배포한 것임을 알 수 있습니다. 


CentOS 이미지를 보고싶다면, docker search centos라고 입력하시면 됩니다.


자 그럼 이제 Docker 이미지를 설치해봅시다.



# docker pull ubuntu 

위 명령어를 입력하시게 되면, ubuntu 이미지를 다운로드 받게 됩니다. 이 때, 다운로드 받는 버전은 가장 최종 배포된 배포판이며, 만일 여기서 다른 버전의 배포판을 받고자 한다면, ubuntu:[버전 숫자] 이렇게 적으시면 됩니다. 예를 들어 14.04 배포판을 받고 싶다면, docker pull ubuntu:14.04 라고 입력하시면 됩니다.



다시 docker images 명령어를 입력하게 되면, 이렇게 Ubuntu 이미지가 표시되는 것을 알 수 있습니다. 이미지 크기는 Kernel을 빼고, 패키지를 최소화로 줄였기 때문에 실제로 Minimal 버전에서 Kernel을 뺀 용량이라고 보시면 됩니다. Virtual Machine에 비하면 엄청나게 작은 용량입니다.


이미지를 내려받았으니 마지막으로 컨테이너만 생성하면 됩니다.



# docker run -i -t --name DOCKERSERVER ubuntu /bin/bash 

위 명령어는 컨테이너를 생성하고 실행하는 명령어입니다. -i 옵션과 -t 옵션을 주게 되면 tty가 실행되어 해당 이미지 안에 어떤 바이너리 파일을 실행할 수 있습니다. 또 해당 컨테이너에 이름을 새길 수도 있습니다. 


그래서 저는 DOCKERSERVER라는 이름의 컨테이너를 현재 내가 가지고 있는 ubuntu의 이미지로 생성한 후, tty를 띄워 bash 터미널을 실행하세요. 라는 명령어를 수행하였습니다.



위와 같이 호스트네임이 어떤 랜덤한 숫자로 뜬다면, 컨테이너 생성이 완료된 것입니다. 위에 찍힌 호스트이름은 컨테이너의 고유 이름으로, 차후에 컨테이너 이름 외에 별도의 고유 이름으로 사용하게 됩니다.







comments powered by Disqus

Tistory Comments 0