본문 바로가기

카테고리 없음

도커 이미지 VS DockerFile

도커 이미지

모든 컨테이너는 이미지를 기반으로 생성되므로 이미지를 다루는 방법은 도커 관리에서 빼놓을 수 없는 부분이죠. 이미지의 이름을 구성하는 저장소, 이미지 이름, 태그를 잘 관리하는 것뿐만 아니라 이미지가 어떻게 생성되고 삭제되는지, 이미지의 구조는 어떻게 돼 있는지 등을 아는 것 또한 중요합니다. 데비안 운영체제에서 apt-get install을 실행하면 apt 리포지터리에서 패키지를 내려받고 레드햇 운영체제에서 yum install을 실행하면 yum 리포지터리에서 패키지를 내려받듯이 도커는 기본적으로 더커 허브라는 중앙 이미지 저장소에서 이미지를 내려받게 되어 있습니다. 도커 허브는 도커가 공식적으로 제공하고 있는 이미지 저 장로 써 도커 계정을 가지고 있다면 누구든지 이미지를 올리고 내려받을 수 있기 때문에 다른 사람들에게 이미지를 쉽게 공유할 수 있는 장점이 있습니다.
docker create, docker run, docker pull의 명령어로 이미지를 내려받을 때 도커는 도커 허브에서 해당 이미지를 검색한 뒤 내려받습니다. 대부분의 필요한 이미지는 도커 허브에서 공식적으로 제공하거나 다른 사람들이 도커 허브에 이미 올려놓은 경우가 대부분이기 때문에 애플리케이션 이미지를 직접 만들지 않아도 손쉽게 사용할 수 있는 것이 도커만의 장점이라고 생각하시면 됩니다. 단, 도커 허브는 누구나 이미지를 올릴 수 있기 때문에 공식 라벤이 없는 이미지는 사용법을 찾을 수 없거나 제대로 동작하지 않을 가능성이 있습니다. 또한 이미지 저장소를 다른 사람들에게 공개하지 않기 위해 비공개 저장소로 사용하려면 비공개 저장소 수에 따라 요금을 지불해야 됩니다. 이를 해결하기 위해 도커 사설 레지스티리를 사용할 수 있는데 이 부분은 추후에 설명하도록 하겠습니다. 실제로 도커 허브에 어떤 이미지가 있지 확인하기 위해서 도커 허브 사이트를 직접 접속해서 찾아볼 수 있지만 도커 엔진에서 docker serarch 명령어를 통해 사용할 수 있습니다. 예를 들어 ubuntu라는 키워드와 관련된 이미지는 어떤 것이 있는지 검색해볼까요?
# docker serach ubuntu

도커 이미지 생성 docker commit

앞에서처럼 docker serach 명령어를 통한 검색한 이미지를 pull 명령어로 내려받아 사용할 수도 있지만, 도커로 개발하는 많은 경우에는 컨테이너에 애플리케이션을 위한 특정 개발 환경을 직접 구축 한 뒤 사용자만의 이미지를 직접 생성해야 합니다. 이를 위해 컨테이너 안에서 작업한 내용을 이미지로 만드는 방법을 설명해보겠습니다. 아래 명령어를 입력해 이미지로 만들 컨테이너를 생성합니다. 컨테이너 내부에 first라는 이름의 파일을 하나 생성해 기존의 이미지로부터 변경사항을 만듭니다.

# docker run -i -t --name commit_test ubuntu:14.04
root@ # test_first! >> first

first라는 파일을 만들어 ubuntu:14.04 이미지로부터 변경 사항을 만들었다면 컨테이너에서 호스트로 빠져나와 docker commit 명령어를 입력해 컨테이너를 이미지로 만듭니다. docker commit 명령어 형식은 아래와 같습니다. 먼저 commit 옵션을 지정하고 커밋할 할 컨테이너의 이름을 명시 한 뒤 생성될 이미지의 이름을 연결합니다.

# docker commit [OPTIONS] CONTAINER

이미지 추출

도커 이미지를 별도로 저장하거나 옮기는 등 필요에 따라 이미지를 단일 바이너리 파일로 저장해야 될 때가 있습니다. docker save 명령어를 사용하면 컨테이너의 커맨드, 이미지 이름과 태그 등 이미지의 모든 메타데이터를 포함해 하나의 파일로 추출할 수 있습니다. -o 옵션에는 추출될 파일명을 입력합니다.
# docker save -o ubuntu_14_94.tar ubuntu:14.04
추출된 이미지는 load 명령어로 도커에 다시 로드할 수 있습니다. save 명령어로 추출된 이미지는 이미지의 모든 메타데이터를 포함하기 때문에 load 명령어로 이미지를 로드하면 이전의 이미지와 완전히 동일한 이미지가 도커 엔진에 생성됩니다.
# docker load -i ubuntu_14.04.tar
save, load 명령어와 유사하게 사용할 수 있는 명령어로 export, import 가 있습니다. docker commit 명령어로 컨테이너를 이미지로 만들면 컨테이너에서 변경된 사항뿐만 아니라 컨테이너가 생성될 때 detached 모드, 컨테이너 커맨드와 같은 컨테이너의 설정 등도 이미지에 함께 저장됩니다. 그러나 export 명령어는 컨테이너의 파일 시스템을 tar 파일로 추출하며 컨테이너 및 이미지에 대한 설정 정보를 저장하지 않습니다.
export와 import는 다음 예제처럼 사용할 수 있습니다. export 명령어는 mycontainer라는 컨테이너의 파일 시스템을 rootFS.tar 파일로 추출하고, 이 파일을 import 명령어로 myimage:0.0이라는 이미지로 다시 저장합니다.
# docker export -o rootFS.tar mycontainer
# docker import rootFS.tar myimage:0.0
그러나 이미지를 단일 파일로 저장하는 것은 그다지 효율적인 방법은 아닙니다. 추출된 이미지는 레이어 구조 파일이 아닌 단일 파일이기 때문에 여러 버전의 이미지를 추출하면 이미지 용량을 각자 차지하게 됩니다. 

이미지 배포

이미지를 생성했다면 이를 다른 도커 엔진에 배포할 방법이 필요합니다. save나 export와 같은 방법으로 이미지를 단일 파일로 추출해서 배포할 순 있으나, 이미지 파일이 너무 크거나 도커 엔진 수가 많아지면 이미지를 파일로 배포하기가 어렵습니다. 이를 해결하기 위해 도커에서 공식적으로 제공하는 도커 허브 이미지 저장소를 사용하는 것입니다. 도커 허브는 도커 이미지를 저장하기 위한 클라우드 서비스라고 보시면 됩니다. 사용자는 단지 이미지를 올리고 내려받기만 하면 되고 매우 간단하게 사용할 수 있습니다. 단 결제를 하지 않으면 비공개 저장소의 수에 제한이 있는 게 아쉬운 부분이죠. 공개 저장소는 무료로 사용이 가능하기 때문에 만든 이미지를 다른 사용자에게도 공개해도 상관이 없다면 도커 허브를 사용하는 것을 추천합니다. 또한 도커 사설 레지스트리를 사용하는 것입니다. 도커 이미지를 사용함으로써 사용자가 직접 이미지를 저장소에 직접 만들 수 있습니다. 그러나 사용자가 이미지 저장소 및 사용되는 서버, 저장되는 공간 등을 관리해야 하므로 도커 허브보다는 사용법이 까다롭기 때문에 추천드리진 않습니다.

도커 사설 레지스트리

도커 사설 레지스트리를 사용하면 개인 서버에 이미지를 저장할 수 있는 저장소를 만들 수 있습니다. 이 레지스트리는 컨테이너로써 구현되므로 이에 해당하는 도커 이미지가 존재합니다. 이 이미지는 도커에서 공식적으로 제공하고 있기 때문에 아래 run 명령어로 간단히 사용할 수 있습니다. 

Docker File

도커는 일련의 과정을 손쉽게 기록하고 수행할 수 있는 빌드 명령어를 제공하고 있습니다. 완성된 이미지를 생성하기 위해 컨테이너에 설치해야 하는 패키지, 추가해야 하는 소스코드, 실행해야 하는 명령어와 쉘 스크립트 등을 하나의 파일에 기록해 두면 도커는 이 파일을 읽어 컨테이너에서 작업을 수행한 뒤 이미지로 만들어냅니다. 이러한 작업을 기록한 파일의 이름이 Dokcerfile이라 하며, 빌드 명령어는 Dockerfile을 읽어 이미지를 생성합니다. Dockerfile을 사용하면 직접 컨테이너를 생성하고 이미지로 커밋해야 하는 번거로움을 덜 수 있기 때문에 좀 더 편리성을 제공할 수 있습니다.

Dockerfile은 애플리케이션을 개발하는 용도 외에도 여러 목적으로 사용될 수 있습니다. 생성한 이미지를 도커 허브 등을 통해 배포할 때 이미지 자체를 배포하는 대신 이미지를 생성하는 방법을 기록해 놓은 DockerFile을 배포할 수도 있습니다. 배포되는 이미지를 신뢰할 수 없거나 직접 이미지를 생성해서 사용하고 싶다면 도커 허브에 올려져 있는 Dockerfile로 빌드하는 것도 하나의 방법입니다. 실제로 도커 허브에 올려져 있는 대부분의 이미지는 Dockerfile을 함께 제공하고 있기 때문입니다. 도커를 처음 경험하시는 분들은 Dockerfile을 작성해야 되는 이유에 대해 어렵게 느껴질 수 있겠지만 좀 더 쉽게 이미지를 저장하고 생성하는데 쉽기 때문에 추후에 방식을 익혀두는 것을 추천드립니다.