이재홍의 언제나 최신 Docker - Unit 7.2 FROM

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

Dockerfile 자세히 알아보기

이재홍 http://www.pyrasis.com

FROM

FROM은 어떤 이미지를 기반으로 이미지를 생성할지 설정합니다. Dockerfile로 이미지를 생성할 때는 항상 기존에 있는 이미지를 기반으로 생성하기 때문에 FROM은 반드시 설정해야 합니다.

다음과 같이 이미지 이름을 설정하거나 이미지 이름과 태그를 함께 설정할 수도 있습니다. 이미지 이름만 설정하면 latest를 사용합니다. 또한, 이미지 이름은 생략할 수 없습니다.

Dockerfile
FROM ubuntu
Dockerfile
FROM ubuntu:22.04

FROM <이미지> 또는 FROM <이미지>:<태그> 형식입니다.

앞에서 설명한 것처럼 FROM은 항상 설정해야 하고 맨 처음에 와야 합니다. 이미지를 생성할 때 FROM에 설정한 이미지가 로컬에 있으면 바로 사용하고, 없으면 Docker Hub에서 받아옵니다.

Dockerfile 파일 하나에 FROM을 여러 개 설정할 수도 있습니다. FROM을 두 개 설정했다면 이미지가 두 개 생성됩니다. --tag 옵션으로 이미지 이름을 설정했다면 맨 마지막 FROM에 적용됩니다.

하지만, 이런 경우보다는 빌드와 파일 포함을 분리하고자 할 때 FROM을 여러 개 사용합니다.

예를 들어 C 언어 소스 파일을 컴파일한 뒤 소스 파일은 제외하고 실행 파일만 이미지에 넣어보겠습니다.

먼저 hello 디렉터리를 생성한 뒤 hello 디렉터리로 이동합니다.

$ mkdir hello
$ cd hello

다음 내용을 hello.c로 저장합니다.

hello.c
#include <stdio.h>

int main ()
{
    printf("Hello Docker\n");
    return 0;
}

그리고 다음 내용을 Dockerfile로 저장합니다.

Dockerfile
FROM ubuntu:22.04 AS builder

RUN apt update
RUN apt install -y gcc
WORKDIR /tmp
ADD hello.c ./
RUN gcc hello.c -static -o hello

FROM alpine:3.16.2
WORKDIR /tmp
COPY --from=builder /tmp/hello ./

CMD ["/tmp/hello"]

ubunbu:22.04 이미지에 gcc를 설치한 뒤 hello.c 파일을 컴파일합니다. 그리고 alpine:3.16.2 이미지를 기반으로 hello 실행 파일만 추가하여 이미지를 생성합니다.

  • FROM ubuntu:22.04 AS builder: ubuntu:22.04 이미지를 builder로 약칭을 지정합니다.
  • COPY --from=builder /tmp/hello ./: COPY로 파일을 복사할 때 --from 옵션을 지정하면 로컬이 아닌 해당 이미지에서 파일을 복사해옵니다. 여기서는 --from=builder이므로 FROM ubuntu:22.04 AS builder의 builder에서 파일을 복사해옵니다. 즉, builder에 있는 /tmp/hello./로 복사합니다.

docker build 명령으로 이미지를 생성합니다.

~/hello$ sudo docker build --tag hello:0.1 .

이제 alpine:3.16.2 이미지를 이용해서 만든 hello:0.1 이미지를 컨테이너로 생성합니다.

$ sudo docker run --rm hello:0.1
Hello Docker

Hello Docker가 출력되면 실행 파일이 정상적으로 실행된 것입니다.

이렇게 두 번의 과정을 거치는 이유는 최종 이미지 파일을 경량화하기 위해서입니다. 처음 FROM ubuntu:22.04 AS builder에서는 apt로 gcc를 설치하기 때문에 이미지의 크기가 커집니다. 그리고 실행에 필요없는 hello.c 소스 파일도 포함됩니다. 여기서는 다시 FROM alpine:3.16.2를 사용하여 COPY --from=builder /tmp/hello ./hello 실행 파일만 복사하므로 이미지의 크기가 매우 작아집니다.

즉, 이미지의 크기가 작아지면 이미지 저장 공간도 아낄 수 있고 push, pull 속도도 빨라집니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

2022-10-03