본 섹션에서는 Dockerfile을 통해 자체적으로 Docker 이미지를 만드는 방법에 대해서 배워보도록 하겠습니다. 컨테이너를 실행하고, 소프트웨어를 설치하고 이미지를 만들기 위해 commit을 수행하여 이미지를 만들어볼 계획입니다.
Dockerfile은 이미지를 작성하는 방법에 대한 지침을 작성한 텍스트 파일입니다. Dockerfile에서 지원하는 문법의 일부를 이번 섹션에서 배우게 될 것입니다.
이미지를 만드는 방법에 대해서 기술합니다.
Dockerfile을 작성합니다.
docker build 명령을 이용하여 1단계에서 만든 Dockerfile을 기반으로 Docker 이미지를 만듭니다.
기본 명령
FROM - 빌드 프로세스를 사용하고 시작할 기본 이미지를 정의합니다.
RUN - 이미지에서 명령을 실행하려면 명령과 인수가 필요합니다.
CMD - RUN 명령과 유사한 기능이지만 컨테이너가 인스턴스화 된 후에 실행됩니다.
ENTRYPOINT - 컨테이너가 생성 될 때 이미지의 기본 어플리케이션을 대상으로 합니다.
ADD - 파일을 소스에서 컨테이너 내부로 복사합니다.
ENV - 환경 변수를 설정합니다.
로컬 홈디렉토리에 docker_image라는 폴더를 생성합니다.
grouq:~ giljae$ mkdir docker_image
cd 명령을 통해 해당 디렉토리로 이동합니다.
grouq:~ giljae$ cd docker_image
vi 혹은 사용하는 편집기를 열어서 Dockerfile을 만듭니다.
FROM busybox:latest
MAINTAINER Giljae Joo
Docker 이미지는 서로 위에 쌓여진 Layer일 뿐이기에 기본 이미지부터 시작하는 것이 좋습니다. FROM은 기본 이미지를 설정하는 명령어입니다. MAINTAINER는 생성된 이미지의 작성자를 알려줍니다. FROM 명령어에서 다른 기본 이미지(e.g. ubuntu:latest)도 사용할 수 있습니다.
파일을 저장하고 터미널로 돌아갑니다. /image 디렉토리에서 아래의 명령을 실행합니다.
grouq:docker_image giljae$ docker build -t myimage:latest .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM busybox:latest
---> b534869c81f0
Step 2/2 : MAINTAINER Giljae Joo
---> Running in e52ae914f0d1
Removing intermediate container e52ae914f0d1
---> c3825f344149
Successfully built c3825f344149
Successfully tagged myimage:latest
docker build 명령을 실행했습니다. 이 명령은 Docker 이미지를 빌드할때 사용됩니다. -t 옵션은 Docker 이미지 태그입니다. 이미지 이름과 태그를 지정할 수 있습니다. “.”은 Dockerfile의 위치를 지정합니다. Docker 빌드를 실행하는 디렉토리내에 Dockerfile이 존재하기에 현재 디렉토리를 의미하는 “.”으로 지정했습니다.
docker images 명령을 실행하여 myimage 이미지가 존재하는지 확인해봅시다.
grouq:docker_image giljae$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myimage latest c3825f344149 About a minute ago 1.22MB
giljae/ubuntu-git latest bf60f2de446a 3 days ago 186MB
busybox latest b534869c81f0 2 weeks ago 1.22MB
httpd latest 2ae34abc2ed0 3 weeks ago 165MB
redis latest dcf9ec9265e0 3 weeks ago 98.2MB
ubuntu latest 775349758637 7 weeks ago 64.2MB
alpine latest 965ea09ff2eb 8 weeks ago 5.55MB
localhost:5000/alpine latest 965ea09ff2eb 8 weeks ago 5.55MB
registry latest f32a97de94e1 9 months ago 25.8MB
docker run 명령을 이용하여 컨테이너를 시작합니다.
grouq:docker_image giljae$ docker run -it myimage
/ #
exit로 쉘을 빠져나와서 Dockerfile을 수정하도록 합시다. 에디터로 Dockerfile을 열고 CMD 명령어 라인을 추가합니다. FROM busybox:latest
MAINTAINER Giljae Joo
CMD ["date"]
다시 빌드하고 컨테이너를 시작합니다.
grouq:docker_image giljae$ docker build -t myimage:latest .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM busybox:latest
---> b534869c81f0
Step 2/3 : MAINTAINER Giljae Joo
---> Using cache
---> c3825f344149
Step 3/3 : CMD ["date"]
---> Running in 45db681e73af
Removing intermediate container 45db681e73af
---> cfd5ea2fd982
Successfully built cfd5ea2fd982
Successfully tagged myimage:latest grouq:docker_image
giljae$ docker run -it myimage
Fri Dec 20 04:20:08 UTC 2019
grouq:docker_image giljae$
쉘에 접속하면 날짜가 출력되는 것을 확인할 수 있습니다.
연습:
CMD 명령을 수정해봅시다. CMD [“ls”,”-al”]와 같은 다른 명령어로 수정하고 이미지를 다시 빌드하고 컨테이너를 시작해보세요.