20230913 Docker란?

Docker란?

한마디로, 컨테이너 기반의 오픈소스 가상화 플랫폼이다.

비유를 들어보자.
컨테이너라 하면 배에 실는 화물 수송용 박스를 생각할 수 있는데 각각의 컨테이너 안에는 옷, 신발, 전자제품, 술, 과일 등 다양한 화물을 넣을 수 있고 규격화되어 컨테이너선이나 트레일러 등 다양한 운송수단으로 쉽게 옮길 수 있다.

서버에서 이야기하는 컨테이너도 이와 비슷하다.
다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다. 백엔드 프로그램, 데이터베이스 서버, 메시지 큐등 어떤 프로그램도 컨테이너로 추상화할 수 있고 조립 PC, AWS, Goggle Cloud등 어디에서든 실행할 수 있다.

기존 VM vs Docker

기존 VM

  • Abstract of physical hardware
  • Each VMs include full copy of OS
  • A lot of memory spaces (OS load) (we need full OS each VM)
  • Long boot-up time (minutes)
  • Data volume can be shared
  • Difficult to scale up
  • OS-level Virtualization
    기존의 가상화 방식은 주로 OS를 가상화했다. 호스트 OS 위에 게스트 OS 전체를 가상화하여 사용하는 방식.
  • 즉, 추가적인 OS를 설치해야 됨 -> 성능문제 발생.
  • 기존의 가상머신이라하면 virtual box 같은 것을 말함.

Docker

  • Abstract at app layer
  • Multiple containers share OS kernel with other containers
  • Less memory space
  • Short boot-up time (just few seconds)
  • Data volume cannot be shared
  • Easy to scale up
  • Containerization
    container 기반 가상화. 하나의 서버에 여러개의 컨테이너를 실행할 수 있는 방식.
  • 프로세스 격리 -> 가볍고 빠르게 동작.
  • 앞서 말했듯이, 하나의 서버에 여러개의 컨테이너를 실행할 수 있기 때문에 서로 영향을 미치지 않고 독립적으로 실행되어 가벼운 VM을 사용하는 느낌을 줌.

+(etc blah)
실행중인 컨테이너에 접속하여 명령어를 입력할 수 있고 패키지를 설치할 수 있으며 사용자도 추가하고 여러개의 프로세스를 백그라운드로 실행할 수도 있다.
CPU나 메모리 사용량을 제한할 수 있고 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉토리를 내부 디렉토리인 것처럼 사용할 수도 있다.
새로운 컨테이너를 만드는데 걸리는 시간은 겨우 1-2초(체감 0.001초)로 가상머신과 비교도 할 수 없이 빠르다.

이미지(Image)

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

ex) ubuntu이미지는 ubuntu를 실행하기 위한 모든 파일을 가지고 있다.

말그대로 이미지는 컨테이너를 실행하기 위한 모오오오오든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없다. 이제 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운받고 컨테이너를 생성만 하면 된다. 한 서버에 여러개의 컨테이너를 실행할 수 있고, 수십, 수백, 수천대의 서버도 문제없다.

레이어 저장방식

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

도커는 이런 문제를 해결하기 위해 레이어(layer)라는 개념을 사용하고 유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해준다. 이미지는 여러개의 읽기 전용(read only) 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성된다.

ubuntu 이미지가 A + B + C의 집합이라면, ubuntu 이미지를 베이스로 만든 nginx 이미지는 A + B + C + nginx가 된다. webapp 이미지를 nginx 이미지 기반으로 만들었다면 예상대로 A + B + C + nginx + source 레이어로 구성된다. webapp 소스를 수정하면 A, B, C, nginx 레이어를 제외한 새로운 source(v2) 레이어만 다운받으면 되기 때문에 굉장히 효율적으로 이미지를 관리할 수 있다.

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

가상화의 특성상 이미지 용량이 크고 여러대의 서버에 배포하는걸 감안하면 단순하지만 엄청나게 영리한 설계다.

CODE

docker pull <image_name>:<tag_name>

: docker hub에서 local로 docker image들을 가져오는 코드.
e.g. docker pull ubuntu:22.10

docker images

: 가지고 있는 image들 보여줌.

docker ps

: 실행중인 컨테이너 목록을 보여줌. 어떤 이미지를 기반으로 만들었는지, 어떤 포트와 연결되어있는지 등.

docker ps -a

: 종료된 컨테이너도 함께 보여줌.

docker run -i -t -d --name my_ubuntu ubuntu

: ubuntu라는 이미지들로부터 my_ubuntu라는 docker container를 만들고, my_ubuntu 컨테이너가 실행(run)되고 터미널이 컨테이너에 연결(attach)된다.

docker stats --no-stream

: docker stats 확인

docker stats --no-stream -a



docker stop <container_name>

: 컨테이너 중지. e.g. docker stop my_ubuntu

docker start <container_name>

: 중단된 컨테이너 시작. e.g. docker start my_ubuntu

docker attach <container_name>

: 실행중(running)인 컨테이너에 터미널 연결(attach) e.g. docker attach my_ubuntu

docker rm <container_name>

: 중단된(stopped) 컨테이너나 생성된(created) 컨테이너 삭제

docker rm -f <containder_name>



docker container prune
docker rm $(docker ps -a -q)

: 모든 컨테이너 한번에 삭제

Categories:

Updated:

Leave a comment