본문 바로가기
docker

[docker] 도커 개념 정리

반응형

도커(docker)

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼 이다.

서버는 다양한 프로그램, 실행환경을 컨테이너로 추상화하여 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다. 서버, 데이터베이스, 메시지 큐 등 모든 프로그램을 컨테이너로 추상화할 수 있고 AWS, Azure, CCP 등 어디서든 실행할 수 있다!!

컨테이너(Container)

그렇다면 컨테이너는 기존의 OS 가상화의 차이점은 뭘까?
Vmware나 VirtualBox같은 가상머신은 호스트 OS 위에 게스트 OS 전체를 가상화하는 방식으로 여러 OS를 가상화(윈도우에서 리눅스)할 수 있지만 무겁고 느리다는 단점이 있다. 이를 개선하기 위해 컨테이너가 등장하는데 프로세스를 격리하는 방식으로 리눅스에서는 리눅스 컨테이너라고 부른다. 단순히 프로세스를 격리시키기 때문에 가볍고 빠르게 동작하고, CPU나 메모리는 프로세스가 필요한 만큼 추가로 사용하여 성능적으로도 거의 손실이 없다.

도커의 기본 네트워크 모드는 Bridge모드로 약간의 성능 손실이 있습니다. 네트워크 성능이 중요한 프로그램의 경우 --net=host 옵션을 고려해야 합니다.

하나의 서버에 여러개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행되어 마치 가벼운 VM을 사용하는 느낌을 준다. 실행중인 컨테이너에 접속하여 명령어를 입력할 수 있고 apt-get이나 yum으로 패키지를 설치할 수 있으며 사용자도 추가하고 여러개의 프로세스를 백그라운드로 실행할 수도 있습니다. CPU나 메모리 사용량을 제한할 수 있고 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉토리를 내부 디렉토리인 것처럼 사용할 수도 있습니다.

이미지(Image)

도커에서 가장 중요한 개념은 컨테이너와 함께 이미지라는 개념이다.

이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하는 것으로 상태값을 가지지 않고 변하지 않는다(Immutable). 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장된다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있다.

이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에(Gitlab 이미지는 centos를 기반으로 ruby, go, database, redis 등을 가짐) 더이상 의존성 파일을 컴파일하고 추가적으로 이것저것을 설치할 필요가 없다. 즉, 서버를 추가하기 위해 미리 만들어 놓은 이미지를 다운받고 컨에티너를 생성만 하면 된다!!

도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있습니다.

레이어(layer)

하지만, 도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 용량이 크다. 처음 이미지를 다운받을 땐 크게 부담이 안되지만 기존 이미지에 파일 하나를 추가했다고 이미지 전체를 다시 다운받는 것은 매우 비효율적일 것이다.

그래서 도커는 레이어라는 개념을 도입한다. 유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있다. 이미지는 여러개의 읽기 전용(read only) 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성된다. ubuntu 이미지가 A + B + C의 집합이라면, ubuntu 이미지를 베이스로 만든 nginx 이미지는 A + B + C + nginx가 된다. 추가적으로 nginx 소스를 수정하면 nginx(v2) 레이어만 다운받으면 되기 때문에 굉장히 효율적이다.

컨테이너를 생성할 때도 레이어 방식을 사용하여 기존의 이미지 레이어 위에 읽기/쓰기read-write 레이어를 추가한다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러개의 컨테이너를 생성해도 최소한의 용량만 사용한니다.

Dockerfile

도커는 이미지를 만들기 위해 Dockerfile이라는 파일에 자체 DSL(Domain-specific language) 언어를 이용하여 이미지 생성 과정을 적는다. 이것은 굉장히 간단하지만 유용한 아이디어인데, 서버에 어떤 프로그램을 설치하려고 이것저것 의존성 패키지를 설치하고 설정파일을 만들었던 경험이 있다면 더 이상 그 과정을 블로깅 하거나 메모장에 적지 말고 Dockerfile로 관리하면 된다!! 이 파일은 소스와 함께 버전 관리 되고 원한다면 누구나 이미지 생성과정을 보고 수정할 수 있도 있다.


References


🏋🏻 개인적으로 공부한 내용을 기록하고 있습니다.
잘못된 부분이 있다면 과감하게 지적해주세요!! 🏋
반응형

댓글