🐳 Docker란?
1. Docker의 개념
- 도커(Docker)는 가상화 기술이다.
- Docker는 가상화 컨테이너에 application 배포를 자동화 시켜주는 오픈소스 엔진이다. (container engine)
- Docker 라는 회사가 container virtualization 을 개발하였고 그래서 docker가 container virtualization 기술의 또다른 이름으로 오해하시는 분들이 있는데 container virtualization은 docker 이전에 이미 개발되어 존재 하고 있었다
- Docker는 container 가상화 실행 환경 위에 application 배포 엔진을 더함으로서 사용자의 코드를 어디서든 빠르고 가볍게 실행시킬수 있는 기술을 제공한다
- 이는 요즘 널리 사용되는 MSA(Micro Service Architecture)와 CI/CD 와 아주 잘 조화되어서 많은 각광을 받고 있다. 실제로 docker는 한 컨데이너 당 하나의 application이나 프로세스를 실행하는 것을 권한다. MSA의 철학과 일맥상통 한다.
- 어플리케이션을 패키징 할 수 있는 툴. 컨테이너라고 불리는 하나의 유닛안에 어플리케이션 + system tool + dependencies를 하나로 묶어서 다른 pc나 서버에서 배포하고 사용할 수 있게 해줌
2. Hypervisor 가상화 VS Container 가상화 ✍️
3. Docker 구조
구성
- Docker Client와 Server ( Server는 docker engine으로 불리기도 함 )
- Docker 이미지
- Docker registries
- Docker containers
1) Docker Client와 Server
- Docker는 클라이언트와 서버 구조로 이루어져 있다. 클라이언트가 서버에 명령을 전달하고 서버가 실행시키는 구조이다
- docker binary 커맨드가 docker 클라이언트 이고 dockerd 가 docker daemon 혹은 docker engine이다.
- Docker engine과 interact하기 위한 Restful API도 제공된다.
- 클라이언트와 서버는 동일한 호스트 안에서 운영 될수도 있으며 서로 다른 호스트에서 운영 될수도 있다.
2) Docker 이미지
- Docker의 life cycle에서 docker 이미지는 “build”의 부분에 해당된다. Docker container에서 실행시키고 싶은 application을 docker 이미지로 빌드해서 실행시키게 된다.
3) Docker Registries
- Docker registires는 docker 이미지를 저장하는 repository라고 보면 된다. Source code를 github에 저장하여 관리하듯 docker 이미지는 dockerhub 같은 docker registries에 저장한다고 생각하면 된다. Github와 마찬가지로 public registry 가 있고 private registry가 있다.
4) Docker containers
- Docker container에서 docker 이미지가 실행된다. 즉 docker 이미지를 실행시키는 가상화 공간이다.
- Docker container는 하나 혹은 그 이상의 프로세스를 실행 시킬수 있다 (하지만 하나의 프로세스만 실행시키는 것을 권장).
5) Docker Compose And Swarm
- Docker에서 제공하는 여러 docker container들로 이루어진 stack이나 cluster를 관리 하는 서비스
- Docker compose는 복수의 docker container들을 모아서 종합적인 application stack을 정의 하고 운영할수 있도록 해주는 서비스이다. Compose 파일을 사용하여 전체적인 application 서비스를 설정한후, application을 이루고 있는 각각의 컨테이너들 (예를 들어, web 서버 컨테이너, api 서버 컨테이너 등등)을 따로 실행시킬 필요 없이 한번에 생성하고 실행할 수 있도록 해준다.
- Docker swarm은 docker containers 들로 이러우진 cluster를 관리할수 있도록 해주는 서비스이다. 즉 docker container를 위한 clustering tool 이다.
4. Docker 이미지 구조
1. Docker Images
Docker의 life cycle에서 docker 이미지는 “build”의 부분에 해당된다.
Docker container에서 실행시키고 싶은 application을 docker 이미지로 빌드해서 실행시키게 된다.

- Docker image는 파일시스템들의 layer로 만들어져 있다.
가장 base layer는 boot filesystem bootfs로 일반적인 Linux boot 파일시스템으로 되어있다. Docker 유저가 직접적으로 boot filesystem을 사용할 일은 없으며, 실제로 container가 부팅이 되면 메모리로 옴겨지고 boot 파일시스템은 unmount된다.
- Boot layer 다음에는
rootfs 라고 하는 root 파일 시스템 layer이다.
Root 파일 시스템은 실제 OS 가 설치된다(예를 들어 Debian 이나 Ubuntu).
원래 리눅스에서는 root filesystem은 처음 mount될때는 read-only로 mount가 된후 integrity check후 read-write으로 바뀐다.
하지만 Docker에서는 계속해서 read-only 모드이다.
Read-write 모드로 변환하지 않는 이유는 Docker는 union mount를 사용해서 read-only 파일 시스템들을 root 파일 시스템 위에 덮는 구조로 이루어져 있기 때문이다.
참고로 union mount는 여러게의 파일 시스템을 mount하되 하나의 파일 시스템만이 mount된것 처럼 사용하는 방법이다.
- Docker 구조에서는 이러한 파일 시스템 하나 하나가 바로 image이다.
그럼으로 image들을 서로 위에 layer시키는 구조로 되어있다. Base가 되는 이미지를 부모 이미지라고하며 맨 위의 이미지 부터 가장 밑 부분의 이미지 까지 횡단 하는 구조로 되어있다. 즉 filesystem / image를 수정하는 구조가 아니라 read-only filesystem / image 들을 서로 위에 layer 시키되 union mount 기법으로 마지막에는 하나의 파일 시스템으로 보이는 구조를 가지고 있는 것이다.
- 모든 read-only 파일시스템들이 mount가 되고 docker 컨테이너가 이미지로부터 시작될때 docker는 마지막으로 read-write 파일 시스템을 파일 시스템 layer 맨 위에 mount한다. 마지막에는 read-only가 아니라 read-write으로 올려놓는 이유는 read-write 파일 시스템에 컨테이너가 필요한 프로세스를 생성하고 실행하기 위해서이다.
- 이러한 pattern을 copy on write이라고 한다. 이 copy on write 구조는 Dockerfile 을 이용해 docker image 를 빌드할때 효과적이다. Docker image를 빌드할때 Dockerfile의 각각의 instruction이 바로 filesystem / image가 되는것이다. 그러므로 빌드를 할때 처음부터 다 빌드하는 것이 아니라 바뀐 파일시스템만 mount하면 됨으로 효과적이고 빠르게 빌드 할 수 있으며 빌드가 도중에 실패하더라도 마지막으로 성공한 instruction은 빌드가 되어있는 상태이므로 그 이미지에 shell 접속을 해서 디버깅을 한다거나 하는 것이 가능해진다.