docker 체험문서에서 

docker 의 이미지를 다운 받고 컨테이너를 실행하고 제거하는 방법을 알아 보았습니다.

자 처음 받은 우분투 이미지는 내부에 많은 것들이 있지는 않습니다.

그래서 패키지들을 설치하여야 합니다.

그러면 컨테이너를 생성할때 마다 이짓을 해야 할까요?

당연히 아니죠!

이때는 동작 중인 컨테이너의 상태를 그대로 이미지로 만들면 됩니다.

어떻게?

바로 commit 란 명령입니다.

어떻게 사용할까요?

자 알아 봅시다. 

우선 정리하는 차원에서 ubuntu:14.04 이미지를 새로 받고 이걸로 실행해 보죠

왜 이 이미지로 하느냐 하면 ubuntu:12.04 는 네트워크 설정 명령등 몇 가지 부족한게 있어서 

ubuntu:14.04 를 사용하는 겁니다. 

이제 우분투 14.04 를 받아 봅시다. 

$ docker pull ubuntu:14.04
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              14.04               826544226fdc        10 days ago         194.2 MB
ubuntu              12.04               c17f3f519388        10 days ago         106.7 MB
이제 컨테이너를 실행합니다. 
$ docker run -i -t --name t1 ubuntu:14.04 /bin/bash
root@01ab2dcac9e8:/#

우선 gcc 명령이 있나 확인해 봅시다.

root@01ab2dcac9e8:/# gcc
bash: gcc: command not found

없내요..

개발 패키지를 설치해 봅시다.

root@01ab2dcac9e8:/# apt-get update
root@01ab2dcac9e8:/# apt-get install build-essential
다시 gcc 명령이 있나 확인해 봅시다.

root@01ab2dcac9e8:/# gcc --version
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

잘 설치되었네요 ^^

이제 종료하고 나서 컨테이너의 목록을 봅니다. 

root@01ab2dcac9e8:/# exit
exit
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
01ab2dcac9e8        ubuntu:14.04        "/bin/bash"         5 minutes ago       Exited (0) 3 seconds ago                       t1
$
t1 이라는 이름으로 컨테이너가 중지된 상태임을 알 수 있습니다. 

이제 컨테이너가 처음 이미지 상태에서 어떤 파일 변경들이 있는지 봅시다. 

이때 사용하는 명령은 diff 입니다. 

docker diff <컨테이너 이름> 
컨테이너 이름 대신 컨테이너 ID를 사용해도 됩니다.

$ docker diff t1
A /.bash_history
C /etc
C /etc/alternatives
A /etc/alternatives/c++
A /etc/alternatives/c++.1.gz
:
:
개발 환경 패키지인  build-essential 이 설치되면서 많은 파일 들이 설치 되었다는 것을 알 수 있습니다. 

여기서 처음 나오는 대 문자는 다음과 같은 의미가 있습니다. 

A : 추가된 파일
C : 변경된 파일
D : 삭제된 파일
자 이제 이미지를 만들어 보죠..

다음과 같이 만들면 됩니다. 

$ docker commit -a "유영창 <frog@falinux.com>" -m "개발 패키지 설치" t1 ubuntu/c_dev:0.2
95c7d4215a6b3f95229709aa529f1d20bd27bc39b41c898d37672ec363cfb98e

commit 명령은 다음과 같은 형식을 가지고 있습니다 .

docker commit <옵션> <컨테이너 이름> <이미지 이름>:<태그> 
여기서 컨테이너 이름 대신에 컨테이너 ID를 사용해도 됩니다. 

그리고 옵션으로 사용한 -a 와 -m 은 다음과 같은 의미가 있습니다. 

-a : 이미지를 작성한 작성자 이름을 지정함
-m : 이미지 생성과 관련된 로그 메세지를 지정함

이 옵션은 필수 조건이 아닙니다. 

이제 어떻게 이미지가 생성되었나 봅시다.

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu/c_dev        0.2                 95c7d4215a6b        2 minutes ago       316.5 MB
ubuntu              14.04               826544226fdc        10 days ago         194.2 MB
ubuntu              12.04               c17f3f519388        10 days ago         106.7 MB

ubuntu/c_dev 란 이미지가 0.2 태그를 달고 생성 되었음을 알 수 있습니다. 

이제 t1 컨테이너는 다음과 같이 제거 합니다. 

이제 필요 없거든요 ^^

$ docker rm t1
t1
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

이제 새로 만든 이미지를 이용해서 컨테이너를 하나 만들어 본 후 gcc 의 버전을 확인해 봅시다. 

$ docker run -i -t --name t2 ubuntu/c_dev:0.2 /bin/bash
root@451d9830c35e:/# gcc --version
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

root@451d9830c35e:/#
죽이죠?

정말 이미지 쉽게 만들 수 있습니다.