도커 이미지를 도커 허브에 있던 것 말고,
1. 직접 생성해서도 사용할 수 있고
2. 도커 허브에 올려서 공유할 수도 있다.
도커 이미지를 이용해 도커 컨테이너 생성
docker create <이미지이름>

도커파일(Docker file)이란?
도커 이미지를 만들기 위한 설정 파일
컨테이너가 어떻게 행동해야하는지에 대한 설정들을 정의해주는 곳이다.
도커 이미지를 만들기 위한 설정 파일이므로, 도커 이미지가 필요한 것이 무엇인지를 생각해야한다. 도커 이미지는 시작 시 실행 될 명령어와 파일 스냅샷으로 구성되어있으므로, 이 두 가지를 만들어야 한다.
도커 파일 만드는 순서
1. 베이스 이미지 명시(파일 스냅샷에 해당)
2. 추가적으로 필요한 파일을 다운 받기 위한 몇 가지 명령어를 명시(파일 스냅샷에 해당)
3. 컨테이너 시작 시 실행 될 명령어를 명시해준다. (시작시 실행 될 명령어에 해당)
도커 이미지는 여러 개의 레이어들로 되어있다. 그 중에서 베이스 이미지는 이 이미지의 기반이 되는 부분이다.


FROM RUN CMD 등은 도커 서버에게 무엇을 하라고 알려주는 것이다.
FROM
이미지 생성 시 기반이 되는 이미지 레이어
<이미지이름>:<태그> 형식으로 작성
태그를 안 붙이면 자동적으로 가장 최신 것으로 다운 받음
ex) ubuntu:14.04
RUN
도커 이미지가 생성되기 전에 수행할 쉘 명령어
CMD
컨테이너가 시작되었을 때
실행할 실행 파일 또는 셸 스크립트이다.
해당 명령어는 DockerFile 내 1회만 쓸 수 있다.

도커 파일에 입력된 것들이 도커 클라이언트에 전달되어서 도커 서버가 인식하게 해야한다.
그렇게 하기 위해서 docker build ./ 또는 docker build .
build명령어는
./와 .는 둘 다 현재 디렉토리를 가리킨다.그래서 docker build .을 해보면

이미지를 빌드할 때 Docker는 Dockerfile을 읽고 각 명령어에 따라 레이어(layer)를 쌓아 이미지를 생성한다.
위 사진의 빌드 로그에 나타난 주요 단계는 다음과 같다.
1. load build definition from Dockerfile
Docker가 현재 디렉터리에서 Dockerfile을 찾고, 이를 읽어서 빌드를 시작한다.
2. transferring Dockerfile
Dockerfile의 내용을 Docker데몬에 전송하여 빌드를 준비한다. 여기서 264B는 Dockerfile의 크기이다.
3. load metadata for docker.io/library/alpine
FROM alpine 명령에 따라, alpine이미지를 기반으로 사용한다. 여기서는 Docker가 최신 버전(apline:latest)의 메타데이터를 가져온다.
4. load .dockerignore
Docker는 .dockerignore 파일을 로드하여 빌드 과정에서 제외할 파일이나 폴더를 확인한다. .dockerignore파일에 지정된 내용은 빌드 시 제외된다.
5. transferring context
현재 디렉터리의 모든 내용을 Docker 데몬에 전송한다. 이때 전송된 데이터의 크기는 2B로 매우 작다. 컨텍스트(context)는 Docker가 빌드할 때 필요로하는 파일 및 폴더의 집합이다.
6. CACHED[1/1]FROM docker.io/library/alpine
캐시된 alpine이미지를 사용하여 빌드를 빠르게 처리한다. 캐시된 레이어가 있으면 이를 재사용하여 빌드 시간을 단축!
7. exporting to image
모든 명령을 처리한 후, 최종 이미지를 생성하여 저장
8. exporting layers / writing image
빌드가 완료된 이미지를 저장하고, 이미지의 해시 값을 출력한다. 이 해시값은 이미지의 고유ID이다.
결과적으로 이 빌드과정은 alpine기반 이미지 위에 CMD["echo","hello"]명령을 추가하여 최종 Docker이미지를 생성하는 과정을 나타낸다.

원래는 이런식으로 빌드 과정에서 각 레이어와 컨테이너 ID가 터미널에 표시되었었다. 그런데, 최근 Docker버전에서는 빌드 과정의 출력을 간소화하면서 세부적인 레이어 ID와 컨테이너 ID 대신 요약된 정보를 출력하도록 변경되었다.

ID를 확인하고싶다면, docker images 명령어를 통해서 확인할 수 있다.
결론적으로

만든 도커 이미지를 실행하려면, docker images 명령어를 통해 확인한 이미지ID를 이용해야 한다.
ex. docker run b7a652f17135
IP Address가 기억하기 힘들기에 Domain이름을 새로 만들어서 이용하는 것과 비슷하게 우리가 만드는 도커 이미지에 이름을 줄 수 있다.
이를 위해 도커 이미지에 이름을 주면, 그 이름으로 실행시킬 수 있다.

도커 이미지를 사실 아무렇게나 주어도 상관없다.
그런데, 사람들이 통상적으로 사용하는 규칙이 아래의 주황색 박스로 표현되어있다.

실제로 명령어를 사용해 보았을 때, 로그의 마지막에 naming to~ 로 이름설정이 잘 적용되었음을 확인할 수 있다.

설정한 이름을 기반으로 실행한 화면이다.
의도했던 대로 hello가 잘 출력된 것을 확인할 수 있다.