Hello, Docker!


Docker. 많이 들어보셨을 것이라 생각한다. 개발자가 VM의 늪에서 허덕일 때 나타난 구세주가 아닌가? 필자는 개발자(Dev) 보다는 시스템 엔지니어(Ops) 계열이기에 더더욱 Docker를 사용할 일이 많다. 다만 요근래 취직을 못해서 관련 지식은 있어도 직접 다룰 일은 거의 없었는데, 얼마 전 면접을 보고온 스타트업에 들어가게 되면 Docker를 바로 업무에서 사용할 것 같기에 결과 기다리는 시간 중 김칫국 마시며 Docker를 되짚어 보려 한다. 이 포스트부터 철저히 필자에게 초점이 맞춰진 Docker 이야기를 시작하겠다. 최대한 noob부터 pro까지 포괄적인 커버가 가능하게 글을 작성하려 하니 모두에게 도움이 됬으면 좋겠다.

Docker?

대체 Docker가 무엇인데 그러냐? VM의 늪에서 구원을 해준다는게 뭔 소린가? 도구는 사용할 목적이 있어야 빛을 낸다. 처음 Docker를 만나는 분들에게는 당연하고도 중요한 질문이다. 그런데 Docker 자체를 만지기에 앞서 컨테이너 기술부터 이야기를 시작하겠다. 영어로 무언가 담을 수 있는 공간을 컨테이너라 한다. 무언가(애플리케이션, 서버)를 담을 수 있는 공간을 만들어주는 기술. 그게 컨테이너 기술이다. Docker는 그런 컨테이너 기술을 다루는 하나의 플랫폼이다. 개인 PC에서 Docker로 독립된 공간을 만들어 깔끔하게 애플리케이션을 구축하고, 패키지(이미지)로 만들어서 업무 서버에 가져다 넣으면 그대로 작동된다. 다른 사람과 자유롭게 공유도 할 수 있다. 물론 다른 사람이 미리 만들어둔 이미지를 다운받아 조금 뜯어 고쳐 사용할 수도 있다. 어디서 많이 본것들 아닌가? 바로 VM이다. 지금까지 VM이 위에서 말한 일들을 가능하게 했다. 그럼 컨테이너 기술을 사용한다는 Docker와 다른 점은 무엇일까? VM은 하드웨어와 운영체제까지 가상화하지만 컨테이너 기술은 공간만 나눈다. 즉, 호스트 컴퓨터와 운영체제 커널과 시스템 리소스를 공유한다는 소리다. 더 이상 기존 VM처럼 운영체제 가상화 등으로 추가적인 리소스 소모를 하지 않아도 된다는 거다. 당장은 VM을 사용할 때 느끼던 장점은 따오고 단점은 보완한 이상적인 녀석이라고 이해해도 크게 문제는 없을 것 같다. 시간과 글 쓸 공간은 얼마든지 있으니, 더 자세한 Docker의 매력은 차차 진행하면서 알아보도록 하자.

Docker 설치하기

필자는 CentOS를 사랑하니 CentOS 기준으로 아래 내용을 작성했다. 혹시 레드헷 배포판을 사용하지 않는 분들은 여기를 참고하시면 된다.

sudo yum install -y yum-utils

위 명령어로 yum-utils를 설치하고 시작하자.

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

위 명령어는 Stable 버전의 Repo를 등록해준다. 참고로 저기 도메인 끝의 docker-ce는 무료 버전을 뜻하는 Docker Community Edition의 줄임말이다. 혹시 정말 중요한 기업 시스템을 돌리기 위해 Docker를 알아보고 있고 전문 기술팀의 지원이 있으면 좋을 것 같다는 분들은 이것을 읽어 보시길 바란다.

sudo yum makecache fast

이제 위 명령어로 yum 패키지 목록을 업데이트한다.

sudo yum install docker-ce

업데이트가 끝났으면 위 명령어로 Docker를 설치하면 된다. 참 쉽죠?

혹시라도 특정 버전의 Docker를 정해 사용해야 하시는 분들은 위 명령어 뒤에 원하는 버전을 sudo yum install docker-ce-<VERSION> 이런 식으로 붙혀 주시면 된다.

sudo systemctl start docker
sudo systemctl stop docker

설치가 완료된 Docker는 다른 애플리케이션과 마찬가지로 위처럼 제어할 수 있다.

Docker 이미지와 컨테이너

VM에서의 ‘이미지’를 떠올려 보자. 가상화된 OS, 변경점, 데이터 등 모든 것이 이미지에 들어 있고, 그 이미지를 복사해서 똑같은 VM을 다른 곳에 또 생성할 수도 있다. Docker에서의 이미지도 크게 다르지 않다. 필요한 애플리케이션이나 라이브러리, 데이터 등이 들어있는 저장 단위이다. 고맙게도 Docker는 Docker Hub라는 자체 저장소 서비스를 제공한다. 이곳에서 사람들이 만들어 둔 수많은 이미지를 필요에 맞게 끌어와 사용할 수도 있고, 내가 만든 이미지를 다른 사람들과 나눌 수도 있다. 혹시 VM에서의 복잡하고 용량 큰 이미지 공유를 생각했다면 잊어도 좋다. Docker는 이미지 공유를 처음부터 생각하고 디자인 된 플랫폼이다. OS 가상화 데이터 등 VM 이미지에서 가장 부피를 많이 차지하던 것들이 없어져 대부분의 Docker 이미지는 생각보다 크기가 아주 작다. 거기에 Docker는 유니온 파일 시스템을 사용해 이미지의 각 정보를 계층(레이어) 단위로 나눠 저장하여 새로운 이미지를 끌어온다 하더라도 내가 이미 가지고 있는 정보가 있다면 그 부분은 생략해주는 멋진 능력까지 가지고 있어 실 체감 용량은 훨씬 적어지기도 한다.프라이빗한 사용이 필요할 경우 자체 저장소 서버를 구축하거나 GitLab 등에서 제공하는 팀 전용 컨테이너 저장소를 이용하는 등 방법은 아주 많으니 필요에 맞게 선택하면 된다.

이제 이미지는 대충 알겠는데, ‘컨테이너’는 뭘까? Docker 이미지를 실행한 것이 바로 컨테이너다. 별 것 없다. 이미지는 각종 필요한 데이터가 저장되있는 파일. 그리고 그것을 실행한 것이 컨테이너. 이렇게 생각하면 된다. 혹시 기존에 Docker를 인터넷에서 검색해본 경험이 있다면 이미지와 컨테이너가 같이 언급되는 것을 본 적 있을 것인데, 입문자에게는 두 개념이 혼동될 수 있는 위험이 있어 최대한 짧고 간결하게 정리했다.

주절주절 이미지와 컨테이너에 대해 떠들어봤는데, 이제 직접 만져보는 시간을 가져야 흥미가 떨어지지 않을 것이다. 터미널을 띄우고 docker -v 명령어를 입력해 아까 설치한 Docker가 제대로 설치되었는지 확인하자.

sudo docker run hello-world

위 명령어는 “Hello World”를 출력하는 테스트 이미지를 Docker Hub에서 다운로드해, 바로 실행까지 해주는 역할을 한다. 정상적으로 문구가 출력되었다면 이제 Docker의 세계에 본격적으로 발을 담굴 준비가 되었다는 뜻이다. Docker에는 run 뿐만 아니라 여러 강력한 명령어들이 존재한다. 이 블로그에 아주 훌륭하게 정리가 되어 있으니 꼭 참고하길 바란다.

예를 들어, 최신 Ubuntu 컨테이너를 실행하고 싶으면 아래처럼 입력하면 된다.

sudo docker run -i -t ubuntu

참고로 저기 run 명령어 뒤에 붙은 -i, -t 옵션들은 각각 상호작용을 뜻하는 interactive와 터미널을 뜻하는 Pseudo-tty다. 필자도 머리 아프니 너무 깊게 생각하지 않아도 된다. 위 명령어를 실행했으면 최신 Ubuntu 이미지를 끌어와 자동으로 컨테이너가 실행된 후, 마치 ssh 연결을 한 것처럼 터미널 입력창까지 바뀌게 된다. 이제 이 독립된 공간에서 자유롭게 해집고 다닐 수 있다. 아, 여기에 exit를 입력하면 컨테이너의 전원도 같이 꺼뜨리고 나가지니 주의. 컨테이너를 그대로 살려둔 상태로 나가길 원한다면 ctrl + p, ctrl + q를 순서대로 누르면 된다.

수고 많으셨다. 앞으로 이어질 포스트에서 자세한 활용 방법과 관련 도구 등을 다룰 예정이니 잠깐 휴식하는 시간을 가지길 바란다 :)