Django - Docker란 무엇인가?

|

패스트캠퍼스 웹 프로그래밍 수업을 듣고 중요한 내용을 정리했습니다.
개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


Docker란 무엇인가?

운영체제를 감싸는것으로 가상 운영체제를 뜻한다. 우리가 우분투를 쓴다고 하면 우분투 16.04를 환경 하나를 만들어서 그 안에서 작업을 하고 이 환경을 그대로 서버에 올린다. 서버의 운영체제는 상관없이 우분투 16.04를 기준에서 로컬에서 작업후 서버에 올린다. 그러면 서버에서는 어떤 운영체제에서건 우리가 올린 가상운영 체제에서 돌아가게 만든다.

그럼에도 불구하고 성능의 손실이 없다.


도커는 컨테이너 기반의 오픈소스 가상화 플랫폼으로 컨테이너를 관리하는 플랫폼이다.

도커에서 이용하는 컨테이너는 프로그램 실행환경을 컨테이너로 추상화하는 것으로, 우리가 만든 운영체제 자체를 하나의 컨테이너로 만들고 그 안에서 작업이 가능하게 한다. 같은 환경에 대해서는 여러개의 컨테이너를 만들 수 있고, 이 말은 같은 환경에 있을 때 한 컴퓨터안에서 여러개를 띄울 수 있다는 의미고, 그말은 또 하나의 환경에 있으면 여러 서버에 컨테이너를 띄울 수 있다는 것을 의미한다.

컨테이너는 격리된 공간에서 프로세스가 동작하는 기술로, (프로세스는 우리가 그전에 runserver가 돌아가는 것도 프로세스였고, uwsgi가 돌아가는 것 또한 프로세스였다) 가상화 기술의 하나이지만 기존 방식과는 차이가 있다.

이는 OS를 가상화 했기 때문이다.

기존의 가상머신은 호스트OS(macOS)위에 게스트OS(Ubuntu)전체를 가상화하여 사용하는 방식이었는데, 이런 방식은 비교적 사용법이 간단한 이점이 있지만 무겁고 느려서 운영환경에선 사용하기가 어렵다.(CPU를 많이 잡아먹음 - 운영환경에서는 이를 효율적으로 쓰는것이 관건, 이게 곧 비용이니까..)

따라서 이러한 문제를 개선하기 위해 프로세스를 격리 하는 방식이 등장했다.

프로세스를 격리한다는 것은 우리가 돌리는 프로세스들을 다른 영역에서 실행한다는 것으로 이해하면 된다.

하나의 서버에 여러개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행되어 가볍게 사용하는 느낌을 준다. 그리고 실행중인 컨테이너에 접속하여 명령어를 입력할 수 있고 apt-get이나 yum으로 패키지를 설치할 수 있다. 이거는 우리가 직접 서버에 접속하는 것과 비슷한 느낌이다.

ssh를 통해 aws에 있는 EC2에 접근했던 것처럼 로컬에서 킨 도커를 이용해서 도커 컨테이너 안으로 들어갈 수 있다.

이러한 새로운 컨테이너를 만드는데 드는 시간은 1초도 거의 안걸린다고 생각하면 된다.

이미지(Image)

이미지는 환경을 말한다. 환경 하나를 만들면 여러개의 컨테이너를 만들 수 있다고 했는데, 그때 말하는 하나의 환경을 이미지라고 한다. 만약 MySQL이라는 이미지가 있고 이를 생성 혹은 실행시키면 MySQL을 실행시킬 수 있고 WorldPress라는 이미지가 있으면 이를 또 실행시킬 수 있다.

그래서 어떤 하나의 이미지를 생성하면 그 이미지 안에서 두개의 이미지를 가져와 합치고 두개를 적절히 융합하는 코드를 작성해 실행시키면 하나의 컨테이너가 생성된다.

이러한 이미지는 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것으로 상태값을 가지지 ㅇ낳고 변하지도 않는다.

이미지는 그 이미지를 이용해 만들어진 컨테이너 안에서 상태를 변화시키는 것은 가능하지만 이미지 자체가 변하지는 않는다. 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장된다. 우리가 만약 컨테이너를 지워버리면 지금까지 저장된 내용이 전부 사라진다.

레이어 저장방식

우리가 우분투를 사용하기 위해서는 우분투 이미지에 3개의 레이어를 쌓아올렸다고 가정을 해본다. 그리고 그 이후에 nginx가 추가된 이미지를 생성하게 되면 용량의 손실없이 기존 우분투의 3개의 레이어를 공유한 상태에서 nginx의 용량만이 추가가 된다.

이미지 경로

이미지는 url방식으로 관리하는데, ubuntu:16.04로 앞의 ubuntu는 이미지, 뒤의 16.04는 태그를 의미한다. 이는 우리가 앞으로 우분투를 사용할 것이고 그 우분투의 16.04버전을 달라는 명령어를 뜻한다.

앞으로 django에서 사용할 Dockerfile은 우리가 앞서 실행했던 deploy.sh와 같은 것인데, 여기서 Dockerfile은 도커의 이미지를 만들어주는 것이다. 그래서 어떤 이미지로 시작해서 어떤 명령어를 거친다음에 어떤 프로그램 혹은 외부에 포트를 개방한다는 명령들을 넣어놓고 나중에 이 Dockerfile만 봐도 도커의 이미지가 어떻게 만들어지는지 알 수 있다.

우분투 어떤 버전으로 시작해서 어떤 라이브러리를 깔고 시작해서 실행하는지 등등~

Docker Hub

도커 이미지의 용량은 우리가 기존에 깃헙에 올렸던 소스파일 저장소와는 다르다. 소스파일은 이미지 파일이 많지 않은한 그 용량의 크기가 크지 않은데, 운영체제를 가상화한다는 것은 굉장히 많은 용량을 차지한다.

이를 로컬에서 관리하다가 잃어버리면 문제가 되기에 이를 관리하기 위해 Hub이 존재한다.