본문 바로가기
Devops/Docker

[Docker] Dockerfile (1)

by 모닥불꽃 2021. 6. 11.
반응형

Dockerfile

앞서 포스팅한 내용으로는 commit명령어로 이미지를 만들 수 있었습니다.

이번 포스팅에서는 dockerfile로 이미지를 만들어 보겠습니다.

 

Dockerfile은 docker 이미지 생성을 위한 이미지 설정 파일입니다.

Dockerfile에 사용할 수 있는 명령어들을 사용해서 docker image를 생성합니다.

 

다음 명령어로 dockerfile 생성을 시작해 봅니다.

$ vi Dockerfile

Dockerfile을 작성할 때 다음 명령어들을 설정해주면 됩니다.

 

  • FROM [이미지] / FROM [이미지] : [태그] - 어떤 이미지를 기반으로 이미지를 생성할지 설정 (필수)
  • MAINTAINER [작성자 정보] - 이미지를 생성한 사람의 정보를 설정
  • RUN [명령어] - FROM에서 설정한 이미지 위에서 명령을 실행
  • ENTRYPOINT [명령어] - 컨테이너가 시작될 때 명령 실행 (한 번만 사용 가능)
  • CMD [명령어] - 컨테이너가 시작될 때 명령 실행 (한 번만 사용 가능)

 

다음과 같이 Dockerfile을 작성해 줬습니다.

ubuntu 이미지를 기반으로 이미지를 생성하고, apt -y update, apt -y upgrade명령어를 바로 실행합니다.

해당 Dockerfile로 이미지를 생성하려면 다음 명령어를 입력합니다.

$ docker build -t my-ubuntu:1.0 .

-t 옵션: tag옵션으로 빌드한 Dockerfile을 my-ubuntu:1.0으로 빌드합니다.

이미지 목록을 확인하면 잘 생성된 것을 확인할 수 있습니다.

 

$ docker run -it my-ubuntu:1.0 bash 명령어로 해당 이미지를 실행하고 접근해서 apt -y update 명령어를 실행해보면, 모든 패키지가 up to date라고 이미 Dockerfile을 빌드하면서 apt -y update 명령어를 실행한 것을 확인할 수 있습니다.


Dockerfile을 아래와 같이 수정해 주었습니다.

$ docker build -t my-ubuntu:1.0 . 명령어를 통해 빌드해주면 $ docker images 명령어로 이미지가 생성되었음을 확인할 수 있습니다.

$ docker run my-ubuntu:1.0 명령어를 통해 해당 이미지를 실행해 보면, 다음과 같이 ls -al 명령어를 실행하고 종료되는 것을 확인할 수 있습니다.

Dockerfile의 CMD명령에서 작성한 명령어 ls -al가 실행되는 것을 볼 수 있습니다.

CMD로 설정한 명령어 같은 경우에 오버 라이딩됩니다.

 

$ docker run my-ubuntu:1.0 "date"라고 명령어를 입력하면, CMD명령어로 설정한 ls -al이 date로 오버 라이딩됩니다.


그럼 Dockerfile의 내용을 아래와 같이 수정해 보겠습니다.

Dockerfile을 수정하고 $ docker build -t my-ubuntu:1.0 . 명령어를 통해 해당 Dockerfile을 빌드해 이미지를 생성해 주었습니다.

 

생성된 이미지를 $ docker run my-ubuntu:1.0 명령어를 통해 실행하면 앞서 CMD명령어를 통해 만들었던 이미지와 동일하게 ls -al 명령어를 실행하고 종료됩니다.

 

CMD명령어를 통해 만든 Dockerfile과 ENTRYPOINT를 통해 만든 Dockerfile의 결과에는 다음과 같은 차이점이 있습니다.

 

ENTRYPOINT로 만든 Dockerfile에 의해 생성된 이미지의 경우 실행할 때 명령어를 입력하면 오버 라이딩되지 않습니다.

 

다음 사진처럼 해당 이미지를 실행할 때 "date"라는 명령어를 추가해주면 명령어는 ls -al date 가 되어 에러가 뜹니다.

 

 

CMD명령어의 경우, 이미지를 실행할 때 실행할 기본 명령어를 제공합니다. 단, 오버라이드가 가능합니다.

ENTRYPOINT명령어도, 이미지를 실행할 때 실행할 기본 명령어를 제공합니다. 단, 오버라이드가 불가능합니다.

 

RUN도 마찬가지로 명령어를 설정하지만, CMD, ENTRYPOINT와 다른 점은 RUN은 build로 이미지 파일을 생성할 때 실행된다는 점입니다.

즉, Dockerfile로 이미지파일을 만들때 layer를 하나씩 쌓아 나가는데 이때 RUN명령어가 실행됩니다.

 

CMD, ENTRYPOINT는 Dockerfile을 build 하고 해당 이미지를 run 할 때 실행됩니다.

반응형

'Devops > Docker' 카테고리의 다른 글

[Docker] Docker Compose  (0) 2021.06.11
[Docker] Dockerfile (2)  (0) 2021.06.11
[Docker] Docker 이미지 다루기 (2)  (0) 2021.06.11
[Docker] Docker 이미지 다루기 (1)  (0) 2021.06.11
[Docker] Apache 사용해보기  (0) 2021.06.10

댓글