docker (1) - docker의 개념

들어가기

이 글은 4편으로 구성될 docker에 관한 설명 중 첫번째 글이다.

도커는 다음에 대한 문제의식에서 시작한다.

"한 컴퓨터 내에 독립된 환경을 가상머신보다 더 가볍게 돌릴 수는 없을까?"

가상머신 vs docker

가상머신과 docker를 비교해놓은 그림을 보면 왜 도커가 더 효율적으로 작동하는지 알 수 있다. 이미지는 도커 공식 홈페이지에도 올라와있다.

가상 머신

가상머신의 경우 host위에 guest 시스템을 가상환경으로 구성한 다음 os부터 하나씩 설치하게 된다. 만약 3개의 가상머신을 돌린단면, 이것이 모두 linux라 하더라도 별도의 OS/필요 프로그램을 한벌씩 다 설치하는 셈이다.

docker on linux, windows

linux는 container라는 독립적이고 격리된 환경을 제공한다. 이 환경이 docker의 핵심 역할을 한다. 단일한 os가 돌아가고 있으므로 os가 여러벌인 가상머신에 비해 훨씬 가볍다. windows에서도 WSL2를 이용해 linux 커널이 windows위에서 바로 돌아간다.

docker on mac

다만 mac 위에서 docker를 돌릴 때는, mac위에 우선 가벼운 linux를 한벌 얹고 시작한다. 약간의 손실은 있을 수 있으나 최적화가 잘 되어있다고 한다.

container 개념

container는 같은 linux 커널 하에서도 다음과 같은 독립적인 환경을 제공한다.

  • namespace - container별 독립적인 process tree, network interface, mount point 등을 제공한다.
  • control group -  cpu, memory, disk io, network 에 대한 사용량을 독립적으로 제공한다.
  • 이것 말고도 몇개 더 제공

이 정도면 container 내에서 user는 자신이 container에 있다기보다는 독립적인 시스템에 있다고 생각하게 된다.

docker의 image

docker에는 image라는 개념이 있다. 가령 linux에 nginx를 설치하고 이를 서비스하고 싶다고 해보자.

  • 어떤 파일에 초기상태의 linux에 무엇을 해야 하는지를 적어둔다.
  • 이 파일을 docker가 읽고 nginx를 설치해준다.
  • 이 결과물을 image라고 부른다.
  • 이를 docker로 실행시킨다. (run)

즉 docker image란, container를 실행하기 위한 "불변"의 파일 시스템과 설정의 "스냅샷"이라고 말할 수 있다. 여기에는 모든 종속성과 실행에 필요한 코드를 포함하고 있다.

image는 읽기 전용인 여러개의 layer로 구성되며 더 이상 변경할 수 없다. image 생성시 어떤 파일의 삭제를 지시하더라도, 아래 layer에서 파일을 제거하는 것이 아니라 다음 layer에서 이 파일에 대한 접근을 없애는 방향으로 작업이 진행된다.

하나의 image는 종종 다른 image를 base로 해서 구성될 수 있다.

  • wordpress image는 mysql image를 base로 해서 구성된다.
  • node image는 debian image를 base로 해서 구성된다.

마지막으로 우리가 어떤 image를 가지고 container를 띄우면 docker는 여기에 쓰기 가능한 layer를 하나 추가해준다. 따라서 우리는 띄운 container 안에서 이것 저것 할 수 있게 된다.