이전 강좌에서 컨테이너를 이용한 이미지를 생성하는 방법을 알아 보았습니다. 

이렇게 이미지를 만드는 방법은 직관적이기도 하고 편하기는 한데

내부에 특정 작업을 해서 암호라든가 기타 등등의 외부에 보이면 안되는 

데이터가 포함될 가능성이 있습니다. 

그래서 컨테이너가 아니라 이미지에서 새로운 이미지를 만드는 방법이 있는데 

그것이 바로 Dockerfile 파일을 이용하여 새로운 이미지를 만드는 방법입니다. 

이 Dockerfile 은 일종의 이미지 작성 문서이면서 스크립트 입니다. 

이 스크립트에서 사용할 수 있는 명령은 많지만 여기서는 다음 세 가지만 가지고 

설명하겠습니다. 

FROM
RUN
CMD
그 외에는 다음 문서를 참조 하시기 바랍니다. 

https://docs.docker.com/reference/builder/


이전 강좌 A006_docker 컨테이너 이미지 생성 과 동일한 기능을 하는 이미지를 만들 겁니다. 

우선 다음과 같이 임의 디렉토리를 하나 만듭니다. 

이 디렉토리의 위치와 이름은 여러분 마음대로 만들어도 상관없습니다. 

$ cd ~
$ mkdir -p ~/docker/images/ubuntu_dev
그리고 이 디렉토리로 이동합니다. 

$ cd ~/docker/images/ubuntu_dev
여기에 다음과 같은 Dockerfile 파일을 만듭니다. 

---[Dockerfile]----------------------------------------------------------
FROM ubuntu:14.04

RUN apt-get update
RUN apt-get install -y build-essential

CMD ["/bin/bash"]
--------------------------------------------------------------------------

이제 이 Dockerfile 파일을 이용해서 이미지를 만듭니다. 

이때 사용하는 명령이 build 인데

다음과 같은 형식을 가집니다. 

docker build <옵션> <Dockerfile 경로>

이 옵션중 --tag 옵션으로 이미지 이름과 태그를 설정할 수 있습니다. 

이미지 이름만 설정하면 태그는 latest로 설정됩니다.

자 실제로 만들어 봅시다. 

$ docker build --tag ubuntu_dev:0.3 ./

성공적으로 빌드 되었다면 

다음과 같은 명령으로 이미지가 생성되었나 확인 합니다. 

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu_dev          0.3                 cf5ad7fed327        3 minutes ago       316.8 MB
ubuntu/c_dev        0.2                 95c7d4215a6b        47 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

자 만들어진 이미지로 컨테이너를 실행해 보죠..

그리고 gcc 가 잘 설치되어 있는지 확인해 봅시다. 

$ docker run -i -t --name t3 ubuntu_dev:0.3
root@13a5c83ccdcc:/# 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@13a5c83ccdcc:/#


깔끔하게 잘 설치되었다는 것을 확인해 볼 수 있습니다. 

죽이죠?
(**)  docker Dockerfile 를 이용한 이미지 생성시 실패 했을 경우 

build 명령의 실행은 내부적으로 빌드 컨테이너가 실행되어 진행되게 됩니다. 

예를 들어 위 예문에서  apt-get install 을 수행할 경우 사용자 입력이 있을 때 

-y 옵션을 사용하지 않으면 중지됩니다. 

이때는 

docker ps -a 명령으로 확인하시고 docker rm 명령으로 

해당 컨테이너 ID 를 이용하여 빌드 컨테이너를 제거 하신후 

docker images 명령으로 빌드중인 이미지의 id 를 확인 한 후 

docker rmi 명령으로 제거 하시면 됩니다. 

그리고 난 후 해당 원인이 되는 Dockerfile  을 수정한 후 

재 빌드 하시면 됩니다. 
(**)   샘플 Dockerfile 분석

앞에서 빌드 한 Dockerfile 은 

정말 간단한 세가지 명령만 사용했습니다. 

이제 각각의 의미를 분석해 보죠

---[Dockerfile]----------------------------------------------------------
FROM ubuntu:14.04

RUN apt-get update
RUN apt-get install -y build-essential

CMD ["/bin/bash"]
--------------------------------------------------------------------------

첫번째 FROM 은 원본 이미지를 지정합니다. 

이 원본 이미지는 로컬에 설치된 이미지만을 참조 할 수 있습니다.

반드시 가장 처음 나와야 합니다. 

두번째 와 세번째 RUN  은 수행할 쉘 스크립트 명령을 지정합니다. 

여러분이 명령창에 쓰는 명령들을 사용하면 됩니다. 

네번째 CMD 는 컨테이너를 실행할 때 수행할 명령을 마지막에 넣는데 

이것을 생략 할 경우 이 명령이 디폴트로 수행되게 됩니다. 

그래서 앞에서 컨테이너를 수행할 때 조금 다르게 수행 시켰다는 것을 알 수 있습니다. 

$ docker run -i -t --name t3 ubuntu_dev:0.3

CMD 명령은 필수는 아닙니다. 

간단하게 사용예를 보기 위해서 이렇게 한 것인데 기타 자세한 사항은 

https://docs.docker.com/reference/builder/

를 보시고 응용 하시기 바랍니다. 

어쩄든 이미지 만들기 쉽죠?