1. 개요
<Docker 가상 환경 구축 입문>의 <Chapter 3. 컨테이너 기동 방법을 이해하자>를 읽고 정리한 내용으로,
이번 문서의 주된 내용은 Docker 컨테이너 실행의 흐름과 Docker Image, Docker Hub의 소개입니다.
2. Docker Hub
- Docker사가 제공하는 서비스로, 이미지를 보관하고 공개할 수 있음
- 이미지는 오픈 소스 커뮤니티가 제공하는 official한 이미지와 개인이 작성하여 공개한 것이 있음
- 이와 같이 이미지를 보존해두는 서비스를 “레지스트리 서비스”라고 하며, 이러한 보관장소를 “레지스트리”라고 함
- Docker Hub에 공개된 이미지에는 태그에 따른 정보가 제공되어 있어, 이를 기반으로 관리가 됨
- Docker Hub 이외에도 quay.io라는 레지스트리 서비스를 이용하거나, 자신이 직접 관리하는 Docker Registry 등 사용 가능
3. Docker Image
- 컨테이너 실행에 필요한 파일이나 메타 데이터 등을 종합한 것
- AUFS(Union File System) 등 특수한 파일시스템이 사용됨
- 이미지 상의 파일이나 메타 데이터는 레이어(계층) 구조이며, read only로 구성됨
- 각각의 레이어는 DockerFile이라는 도커 이미지 작성을 위한 설정 파일에 의해 생성
- 컨테이너는 디폴트 설정 상, 외부와 통신이 불가하므로 필요에 따라 포트 포워딩 설정을 통해 외부에서 컨테이너로 접속이 가능하게 해야 함
- 컨테이너 기동 시 실행하는 커맨드나 포트 포워딩 등 설정이 필요하며, 이러한 정보를 메타 데이터로서 담아두는 것
- Union File System의 장점
- 이미지 간 공통 레이어에 대해 두 번 다운로드 하지 않고, 공통되는 레이어를 재이용할 수 있음
- 갱신된 이미지를 다운로드할 경우, 변경이 있는 부분만 다운로드할 수 있음
- 이미지 업데이트에 따른 이상이 발생한 경우 과거 이미지 버전으로 복구할 수 있음
4. Docker Image 관리
- 다운로드한 도커 이미지 목록 표시
$ docker images
- 도커 이미지 삭제
$ docker rmi hello-world:latest
- 컨테이너를 실행하지 않고 이미지 다운로드만 실행
$ docker pull hello-world:latest
- 이미지 상세 내용 표시
$ docker inspect hello-world:latest
5. Docker 컨테이너 실행 흐름
- docker run hello-world 커맨드 실행 시 동작
① Docker Client를 사용하여 커맨드 실행
② Docker Daemon이 docker 커맨드의 명령을 받아 hello-world 이미지가 현재 가상머신 상에 존재하는 지 조사
③ 다운로드 되어있지 않다면 Docker Hub에 해당 이미지 요청
④ 요청을 받은 Docker Hub 서버가 hello-world 이미지를 검색하여 이미지 데이터를 Docker Daemon에게 송신
⑤ Docker Daemon은 Docker Hub로부터 다운로드한 hello-world 이미지를 사용하여 컨테이너 생성
⑥ 컨테이너 생성 후 사전에 이미지에 설정된 커맨드를 컨테이너 내부에서 실행하여 그 결과가 Docker Client에 보내짐
- docker run 커맨드는 다음의 커맨드를 순서대로 실행하는 것과 같은 의미
$ docker pull : 이미지 취득
$ docker create : 컨테이너 생성
$ docker start : 컨테이너 기동
- Docker 파일에 CMD 명령을 기술하면 작성한 이미지로 컨테이너를 기동할 때 디폴트로 실행할 커맨드가 설정됨