9. Dockerfile 작성하기

본 섹션에서는 Dockerfile을 통해 자체적으로 Docker 이미지를 만드는 방법에 대해서 배워보도록 하겠습니다. 컨테이너를 실행하고, 소프트웨어를 설치하고 이미지를 만들기 위해 commit을 수행하여 이미지를 만들어볼 계획입니다.

Dockerfile은 이미지를 작성하는 방법에 대한 지침을 작성한 텍스트 파일입니다. Dockerfile에서 지원하는 문법의 일부를 이번 섹션에서 배우게 될 것입니다.

이미지를 만드는 방법에 대해서 기술합니다.

  1. Dockerfile을 작성합니다.

  2. 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”]와 같은 다른 명령어로 수정하고 이미지를 다시 빌드하고 컨테이너를 시작해보세요.