본문 바로가기

Tech/Docker & Kubernetes

[Docker] 도커 Overview, 도커 이미지, 컨테이너

반응형

이미지 출처 : pixabay

참고문헌 : 시작하세요! 도커/쿠버네티스 (https://wikibook.co.kr/docker-kube/)

Docker & K8S 스터디 진행을 위한 TIL 요약본입니다.


도커

도커는 리눅스 컨테이너 기반의 가상화 기술입니다.

기존의 가상화 기술은 하이퍼바이저를 이용해 여러 개의 운영체제를 하나의 호스트에서 생성해 사용하는 방식이었습니다.

하이퍼바이저에 의해 생성되는 Guest OS는 각각 완전히 독립된 시스템 자원을 할당받습니다.

이 경우 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 하이퍼바이저를 거쳐야 하기 때문에 성능 손실이 발생하며, 각 Guest OS는 독립된 라이브러리와 커널등을 전부 포함하고 있어야 하기 때문에 이미지의 크기가 커지는 단점이 있습니다.

반면 도커 컨테이너는 리눅스의 chroot, namespace, cgroup 을 사용해 프로세스 단위의 격리 환경을 만들어 가상화된 공간을 생성합니다. 컨테이너에 필요한 커널은 호스트의 커널을 공유해 사용하고, 어플리케이션을 구동하기 위한 바이너리와 라이브러리만 포함하면 되기 때문에 이미지의 크기도 작아집니다.

도커는 리눅스 컨테이너를 제어하는 API를 Golang으로 구현한 libcontainer를 사용하기 때문에 대부분의 리눅스 운영체제에서 사용할 수 있습니다.

 

맥 OS에 실습하기 위한 Docker Desktop은 다음 링크에서 다운로드받을 수 있습니다: 

https://www.docker.com/products/docker-desktop/

 

Docker Desktop - Docker

Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!

www.docker.com

Docker for Mac OS는 xhyve 기술을 사용해 리눅스 커널 기능과 도커 엔진을 구성한다고 되어있는데, xhyve가 뭔지 너무 궁금해서 조금 더 찾아봤는데, Docker for mac은 BSD Hypervisor(bhyve)를 Mac OS로 포팅한 xhyve를 기반으로 맥의 가상화 기술인 hypervisor.framework를 통해 구동되고 있었습니다.

도커 이미지

도커 엔진에서 사용하는 기본 단위는 이미지와 컨테이너입니다.

이미지는 컨테이너를 생성할 때 필요한 요소로 여러 개의 계층으로 된 바이너리 파일로 존재하고, 컨테이너를 생성하고 실행할 때 읽기 전용으로 사용됩니다.

기본적으로 [저장소 이름]/[이미지 이름]:[태그] 형태로 구성됩니다. (ex. ubuntu:latest)

저장소 이름: 이미지가 저장된 장소를 의미하며, 저장소 이름이 명시되지 않은 경우는 Docker Hub의 공식 이미지를 뜻합니다.

이미지 이름: 말그대로 이미지의 이름을 나타냅니다.

태그: 일반적으로 버전/리비전 관리에 사용되며, 태그를 생략하는 경우에는 latest로 인식됩니다.

도커 컨테이너

이미지로 컨테이너를 생성하면 해당 이미지의 목적에 맞는파일시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 환경이 생성되고 이를 컨테이너라 칭합니다.

컨테이너는 이미지를 읽기 전용으로 사용하되 이미지에서 변경된 사항만 컨테이너 계층에 저장합니다.

즉, 컨테이너에서 어떤 변경 사항이 있더라도 이미지에는 어떠한 영향을 끼치지 않습니다.

생성된 컨테이너는 격리된 환경에서 실행되므로 한 컨테이너의 변경사항은 다른 컨테이너 혹은 호스트로 전파되지 않습니다.

컨테이너의 생성

도커 엔진의 설치는 다루고자 하는 주제를 벗어나기 때문에 생략하도록 하겠습니다.

저는 도커 데스크탑을 설치한 다음 터미널에서 CLI로 작업을 진행했습니다.

https://www.docker.com/products/docker-desktop/

 

Docker Desktop - Docker

Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!

www.docker.com

도커 CLI에서 docker run 명령어를 수행하면 컨테이너를 생성하고 실행하는 역할을 수행합니다.

docker run 명령어 수행 시 -i 옵션으로 상호 입출력을, -t 옵션으로 tty를 활성화 해 bash shell을 사용할 수 있도록 설정합니다.

docker run 명령어는 docker pull, create, start, attach(-i, -t 옵션을 사용한 경우) 명령어를 순차적으로 실행합니다.

컨테이너 실행 시 커맨드를 지정해 줄 수도 있는데, 커맨드는 대부분의 이미지에 미리 내장되어 있기 때문에 별도로 설정해 줄 필요는 없습니다. 이미지에 내장되니 커맨드는 docker run/create 명령어의 맨 끝에 입력해서 override해 줄 수 있습니다.

 

더이상 사용하지 않는 컨테이너는 rm 명령어를 사용해 삭제할 수 있습니다.

 

컨테이너를 생성하면 VM과 마찬가지로 가상 IP 주소를 할당받습니다. 하지만 아무런 설정을 해 주지 않는다면 외부에서 접근할 수 없으며, Docker for mac에서는 호스트에서도 컨테이너 IP로의 접근도 불가합니다. 외부에 컨테이너를 노출하기 위해서는 컨테이너의 포트를 호스트의 포트와 바인딩해 주어야 합니다.

 

또한 서비스를 컨테이너화할 때 여러 개의 어플리케이션을 한 컨테이너에 올려줄 수도 있으나, 이는 컨테이너 간 독립성을 보장할 수 없고 버전 관리 및 소스코드 모듈화 측면에서 바람직하지 않은 방법입니다. 한 컨테이너에 하나의 프로세스만 실행하는 것이 도커의 철학이기 때문에 권장하지 않습니다.

이때 컨테이너간 link를 설정하거나 같은 도커 네트워크 상에 위치시켜 상호 접근이 가능하게 만들어 주는 방법이 있습니다.

도커 볼륨

도커 이미지로 컨테이너를 생성하고 나면 변경 사항만 저장해서 각 컨테이너의 정보를 보존합니다. 따라서 컨테이너를 삭제하면 컨테이너 계층의 정보들도 모두 삭제된다는 단점이 있습니다. 이를 방지하기 위해 컨테이의 데이터를 볼륨을 활용해 영속시키는 방법이 있습니ㅣ다.

호스트와 볼륨을 공유하거나 볼륨 컨테이너를 사용할 수도 있고, 도커가 관리하는 볼륨을 생성할 수도 있습니다.

-v 옵션을 사용해 호스트 디렉토리를 컨테이너 디렉토리에 직접 마운트할 수 있습니다.

혹은 볼륨을 사용하는 컨테이너를 다른 컨테이너와 공유하는 방법이 존재합니다. 이 방법은 -v 옵션을 사용해 볼륨만 공유하고 별도의 역할을 담당하지 않는 볼륨 컨테이너를 --volumes-from 옵션을 적용해 사용합니다.

마지막으로 docker volume 명령어를 사용해서 도커 자체에서 제공하는 볼륨 기능을 활용하는 방법도 있습니다.

docker volume create 명령어를 사용해 도커 볼륨을 생성하고 -v 옵션을 사용해 도커 볼륨을 마운트해 사용합니다.

도커 볼륨도 호스트 볼륨 공유와 마찬가지로 호스트에 데이터가 저장되지만 실제로 파일이 어디에 저장되는지는 관심사가 아닙니다.

 

이렇게 컨테이너가 아닌 외부에 데이터를 저장하고 컨테이너는 그 데이터로 동작하도록 설계하는것을 stateless 하다고 칭합니다. 컨테이너 자체는 상태가 없고, 상태를 결정하는 데이터는 외부로부터 제공받습니다. 즉 컨테이너가 삭제되더라도 데이터에 영향을 미치지 않는 바람직한 시스템을 구성할 수 있도록 도와줍니다.

반응형