Docker In Action 3. Software Installation Simplified
이미지를 어떻게 확인하는 가 How do I identify software?
Repository
Repository란 image를 모아둔 저장소. 이미지 저장소에 대한 주소는 위 예시 처럼 url 형식으로 표현된다.
{RegistryHost}/{UserName}/{ShortName}:{Tags}
Tags
각 이미지에 대한 빌드 태그(이름), git의 브랜치처럼 특정 기능 혹은 날짜에 대한 별칭을 의미.
latest라는 특별 태그는 항상 최신으로 빌드된 이미지를 뜻 함.
이미지를 어디서 설치하는 가 Where do I find sofware to install?
Repositories는 Registry에서 검색하여 이미지를 확인하고 설치할 수 있다.
Docker Inc에서 관리하는 Docker Hub는 공개된 registry로 docker pull과 docker run을 이용할 때 검색하게 되는 기본 registry이다.
도커 이미지 검색하기
docker search
검색된 이미지 이름, 설명, 받은 스타 개수, 공인 여부, 자동화된 빌드 버전 정보를 알 수 있다.
Docker Hub에서 확인하기
도커허브 레지스트리에 등록된 이미지를 공식 사이트 주소에서 확인 가능하다.
비공식 registry에서 이미지 받기
도커는 registry를 호스팅하는 소프트웨어를 제공한다. 직접 registry를 호스팅하여 자신의 이미지를 등록하여 비공개된 방식으로 이미지를 관리할 수 있다.
docker pull [REGISTRYHOST]/[USERNAME]/[NAME](:TAG)
비공식 레지스트리에서 이미지를 직접 받는 경우 필요한 정보가 담긴 repository 저장소 주소를 명시한다.
이미지를 파일로 저장하고 로드하기
- 이미지를 비디오 게임의 세이브 파일 처럼 파일로 save 및 load 하는 것이 가능하다.
위 명령어로 busybox 이미지를 가져온 후 myfile.tar 파일로 저장한다.
docker rmi busybox
docker load -i myfile.tar
도커 이미지를 삭제하고 myfile.tar 이미지 파일을 이용하여 다시 이미지를 설치하는 것이 가능하다.
docker images 명령어로 busybox 이미지가 설치됌을 확인 가능하다.
Dockerfile로 부터 설치하기
docker build -t dia_ch3/dockerfile:latest ch3_dockerfile
dockerfile에 이미지 설치에 필요한 정보를 작성한다.
docker build {image_name} 명령어를 통해 도커 이미지를 설치할 수 있다.
-t 옵션은 이미지를 설치할 때 부여할 tag이다. 최종 설치되는 이미지는 [image_name]{:Tag} 로 설치된다.
어떤 파일이 설치되고 어떻게 구분되어지는가 What files are installed and how are they isolated?
docker pull dockerinaction/ch3_myapp
docker pull dockerinaction/ch3_myotherapp
서로 다른 이미지를 설치해보자. 두번째 이미지는 첫번째 이미지를 설치할 때보다 빠르게 설치된다.
두 이미지가 사용하는 base 이미지가 있는데 java:6 라는 공통 이미지를 가진다.
첫번째 이미지를 설치할 때 java:6를 설치하므로 두번째 이미지를 설치할 때는 해당 이미지를 제외한 나머지만 가져오면 된다.
docker rmi {image_name}
설치된 도커 이미지를 삭제한다.
도커 이미지의 구성 Layer relationships
도커의 이미지는 layer 형식으로 이미지의 부모/자식 layer image가 있을 수 있다.
각 이미지는 설치될 때 UID를 부여받는다. Java6 이미지를 빌드 하기 위해서 의존하는 상위 이미지들이 존재한다.
자신이 필요로 하는 이미지만을 base로 하여금 빌드함으로써 가벼운 이미지를 만들어 낼 수 있다.
컨테이너 파일 시스템 추상화와 고립
컨테이너의 기반이 되는 이미지를 바탕으로 프로그램을 실행할 때 이미지에 포함된 모든 파일은 각 컨테이너의 파일 시스템에 복사되는 것처럼 보이도록 한다. 이를 가능하게 하는 union file system은 각 이미지 레이어가 포함하는 파일들을 호스트의 파일 시스템에 마운트한다.
도커는 리눅스 커널이 제공하는 MNT system의 namespace 기능을 이용하여 컨테이너를 만들고 고유의 MNT system를 갖도록 한다. 그리고 새 마운트 지점을 제공하여 기반으로 하는 이미지를 사용할 수 있게 한다.
마지막으로 chroot는 이미지 파일 시스템의 root를 container 관점에서의 root로 만든다. 이는 컨테이너가 다른 호스트 파일을 접근하지 못 하도록 한다.
union file system의 취약성
도커는 실행되는 파일 시스템에 맞는 파일 시스템을 선택하나 모든 워크로드에 완벽한 기능을 동작을 보장하지는 못 한다. 다른 파일 시스템은 속성, 사이즈, 이름, characters 등 다른 특징을 가질 수 밖에 없고 union file system은 적절한 파일 시스템간 translation을 제공해야한다. 또한 union file system은 linux 기능인 copy-on-write과 memory-mapped- files 기능을 사용하기 어렵게 한다.