나만의 Image 만들기
docker run 시 Docker 는 Docker 호스트에서 이미지를 다운받아 저장한다.
Docker 호스트에 이미지가 없을 때는 기본적으로 Docker Hub 저장소에서 다운받는다.
이 다운로드 받은 이미지의 설정을 변경하고 어플리케이션을 추가하고 새 이미지로 생성하여 Docker Hub 저장소에 올릴 수 있다.
docker search 명령을 사용하거나 Docker Hub 사이트에서 다른 사람들이 올린 이미지를 검색할 수 있다.
# docker search ubuntu NAME DESCRIPTION STARS OFFICIAL AUTOMATED ubuntu Ubuntu is a Debian-based Linux operating s... 3108 [OK] ubuntu-upstart Upstart is an event-based replacement for ... 61 [OK] torusware/speedus-ubuntu Always updated official Ubuntu docker imag... 25 [OK] ubuntu-debootstrap debootstrap --variant=minbase --components... 24 [OK] tleyden5iwx/ubuntu-cuda Ubuntu 14.04 with CUDA drivers pre-installed 19 [OK] rastasheep/ubuntu-sshd Dockerized SSH service, built on top of of... 19 [OK] | cs |
검색 결과를 보면 우측에 두가지 저장소 형태가 있다.
OFFICIAL 저장소는 Docker사 에서 제공되는 것이고, 이름에 접두어가 붙지 않는다.
AUTOMATED 저장소는 이미지의 소스와 컨텐츠를 사용자가 검증하도록 하는 것이다.
NAME 의 슬래시(/) 앞의 접두어는 해당 이미지를 만든 username 이다.
새 기본 이미지를 하나 다운받는다. (태그 없이 latest 버전을 사용하는 것보다 특정 태그를 명시하여 이미지를 사용하는 것이 명확하고 좋다.)
# docker pull ubuntu:14.04 | cs |
이미지를 다운받아 내용을 변경하고 이미지를 생성하는데는 docker commit 과 docker build 을 사용하는 두가지 방법이 있다.
- docker commit 으로 변경된 새로운 이미지 생성하기
- docker build (Dockerfile) 로 이미지 생성하기
1. docker commit 으로 이미지 생성하기
이미지를 변경하기 위해 해당 이미지로부터 컨테이너를 생성한다.
# docker run -t -i ubuntu:14.04 /bin/bash root@8df050ac77ba:/# apt-get update root@8df050ac77ba:/# apt-get upgrade root@8df050ac77ba:/# exit | cs |
패키지를 업데이트 및 업그레이드를 했으므로 컨테이너는 변경되었다.
이제 변경된 컨테이너를 이미지로 커밋한다.
docker commit 은 컨테이너를 새 이미지로 생성한다.
# docker commit -m "Added apt update" -a "ggamzzak" 8df050ac77ba ggamzzak/ubuntu:v1 15d7b97c7364cdde78fb39368b468098065ede849e8c6ee665ae3e1810cdb6c1 | cs |
-m 옵션은 커밋 메시지, -a 옵션은 커밋한 사람(author)을 지정한다.
이미지로 생성할 컨테이너 id 8df050ac77ba, 마지막에는 새로 생성될 이미지와 태그를 지정한다.
생성된 이미지를 확인한다.
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ggamzzak/ubuntu v1 15d7b97c7364 19 seconds ago 216.5 MB ubuntu 14.04 6cc0fc2a5ee3 13 days ago 187.9 MB | cs |
2. docker build (Dockerfile) 로 이미지 생성하기
docker commit 은 이미지를 확장하는 아주 간단한 방법이지만 이미지 개발 과정을 쉽게 공유할 수 없다.
docker build 는 Dockerfile 을 기반으로 이미지를 생성하므로 Dockerfile 로 개발 과정을 공유할 수 있다.
# vi Dockerfile FROM ubuntu:14.04 MAINTAINER Gabriel Lee <test@test.com> RUN apt-get update && apt-get upgrade | cs |
# docker build -t ggamzzak/ubuntuf:v1 . Step 1 : FROM ubuntu:14.04 ---> 6cc0fc2a5ee3 Step 2 : MAINTAINER Gabriel Lee <test@test.com> ---> Running in 5148283c2f29 ---> c167d91fdfa4 Removing intermediate container 5148283c2f29 Step 3 : RUN apt-get update && apt-get upgrade ---> Running in e415cec47fe0 Ign http://archive.ubuntu.com trusty InRelease Get:1 http://archive.ubuntu.com trusty-updates InRelease [64.4 kB] ... Successfully built 94010692cd90 | cs |
docker build 명령의 마지막 . 은 Dockerfile 경로이다.
Dockerfile 을 빌드하면 위에서 처럼 Dockerfile 의 각 명령 별로 새로운 컨테이너가 생성/제거되는 것을 볼 수 있다.
각 명령을 독립적으로 처리하는 것을 볼 수 있고, 각 명령별로 생성되는 컨테이너를 레이어라고도 한다.
WRITTEN BY
- 손가락귀신
정신 못차리면, 벌 받는다.