[Docker] Docker Image 빌드하기

whatSup CheatSheet·2022년 9월 29일
1

Container

목록 보기
3/9
post-thumbnail

도커 이미지란?

  • 어떤 애플리케이션에 대하여, 코드뿐 아니라 dependent한 모든 것을 함께 패키징한 데이터
  • Dockerfile: 사용자가 도커 이미지를 쉽게 만들 수 있도록 제공하는 템플릿

Dockerfile

Dockerfile 생성

  • 원하는 폴더에서 torch Dockerfile로 Dockerfile 생성

Dockerfile 기본 명령어

From

  • Dockerfile이 base image로 어떠한 이미지를 사용할 것인지 명시합니다.
FROM <image>[:<tag>][AS <name>]

# 예시)
FROM ubuntu
FROM ubuntu:20.04
FROM nginx:latest AS ngx

Copy

  • <src>의 파일 혹은 디렉토리를 <dest>경로에 복사합니다.
COPY <src>... <dest>

# 예시)
COPY test.txt /abc/def/test_copy.txt
COPY my-workspace /abc/def/test-workspace

RUN

  • 커맨드를 도커 컨테이너에서 실행시킵니다.
  • 도커파일로부터 도커 이미지를 빌드하는 순간 실행되는 명령어입니다. 주로 라이브러리를 설치하는 데 사용됩니다.
RUN <command>

# 예시)
RUN pip install -r requirements.txt

CMD

  • 이미지로부터 컨테이너를 생성하여 최초로 실행될 때 실행되는 명령어입니다.
  • 하나의 Docker image에서는 하나의 CMD만 실행할 수 있습니다.
CMD <command>

# 예시)
CMD python main.py 
CMD ["bash"]  

# CMD ["bash"] : default 명령을 bash로 설정합니다. 
# 이후 docker run 실행 시 실행할 커맨드를 주지 않으면 이 default 명령이 실행됩니다.

CMD vs ENTRYPOINT

  • Entrypoint는 CMD와 같은 역할을 합니다.
  • CMD: docker run으로 실행될 때 사용자가 직접 실행할 명령어를 입력하면 CMD에 입력해두었던 명령어 대신 새로 입력받은 명령어를 사용합니다.
  • ENTRYPOINT: ENTRYPOINT에 입력해둔 명령어는 항상 실행됩니다. 만약 새로운 명령어가 있다면, ENTRYPOINT가 실행되고 나서 실행됩니다.
  • 만약 ENTRYPOINTCMD가 둘 다 있다면, CMD는 ENTRYPOINT에 매개 변수만 전달하는 역할을 합니다.
    • ex) Dockerfile(CMD&ENTRYPOINT)

Shell vs Exec

RUN과 CMD, ENTRYPOINT 등은 커맨드 명령을 수행하는 키워드입니다. 이때, 명령을 주는 방식은 Shell과 Exec으로 나눌 수 있습니다.

  • shell : 쉘 프롬프트에 명령을 기술하는 방식
    • /bin/sh -c을 사용하여 명령을 수행하는 것과 같음.
    • ex) CMD echo "hello"
  • exec : 쉘을 경유하지 않고, 직접적으로 바로 실행하는 방식
    • ex) CMD ["/bin/echo", "Hello"]

WORKDIR

  • 이후 작성될 명령어(RUN CMD ENTRYPOINT)가 컨테이너 내 어떤 디렉토리에서 수행될 것인지를 명시하는 명령어입니다.
    • 만약 해당하는 디렉토리가 없으면, 생성합니다.
WORKDIR /path/workdir

# 예시)
WORKDIR /home/test

ENV

  • 컨테이너에서 지속적으로 사용할 환경변수의 값을 설정하는 명령어입니다.
ENV <key> <value>
ENV <key>=<value>

# 예시)
ENV PYTHONPATH=/app
ENV PYTHONBUFFERED 1

EXPOSE

  • 컨테이너에서 뚫어줄 포트/프로토콜을 지정합니다.
  • 프로토콜을 지정하지 않으면 TCP가 디폴트로 설정됩니다.
EXPOSE <port>
EXPOSE <port>/<protocol>

# 예시)
EXPOSE 8080

Dockerfile 작성해보기

아까 생성시킨 Dockerfile을 실행하여 Dockerfile을 작성해봅시다.

명령어가 많아지면 레이어가 쌓여 메모리가 커지게 됩니다. 이를 해결하기 위해 다음과 같은 방법을 사용할 수 있습니다.

  • Dockerfile RUN 명령을 이어서 사용합니다.
# 안 좋은 예시
RUN apt-get update && apt-get install -y
RUN aufs-tools
RUN automak
...

# 좋은 예시
RUN apt-get update && apt-get install -y \
    aufs-tools \
    automake \
    build-essential \
    ...
  • 이미지 내부 임시 파일을 삭제합니다.
RUN apt-get update && apt-get install -y \
    aufs-tools \
    automake \
    build-essential \
    ... \
    && RUN  rm -rf /var/lib/apt/lists/*

Docker 빌드하기

Dockerfile로부터 Docker 빌드

docker build [OPTIONS] PATH | URL | -

  • Dockerfile로부터 Docker Image를 만들어냅니다
    • -t : 태그를 지정
  • ex) docker build -t my-first-image:v1.0.0 .

Docker 컨테이너 커밋(commit)

docker commit [OPTIONS] CONTAINER [REPO/IMG:TAG]

  • 기존에 있는 컨테이너로부터 이미지를 생성합니다.
  • 옵션
    • -a : 작성자 설정
    • -m : 커밋 메시지 지정
  • 예시)
# 실행 중인 test-container를 test/ubuntu:1.1로 커밋
docker commit -a "whattsup" -m "test" test-container test/ubuntu:1.1

컨테이너 혹은 이미지를 압축파일로 전달

  • 컨테이너 혹은 이미지를 압축파일로 전달할 수도 있습니다.
# 컨테이너
docker export [container-name] > [tar-name.tar]   # container -> tar
cat [tar-name.tar] | docker image import - [REPO/IMG:TAG]   # tar -> image

# 이미지
docker image save -o [tar-name.tar] [image-name] # image -> tar
docker image load -i [tar-name.tar]      # tar -> image 

Docker Image 저장소

1. Docker Registry에 Push 하기

Docker Registry는 이미지를 저장 및 다운로드할 수 있는 공간입니다.

  • docker registry를 띄웁니다
    docker run -d -p 5000:5000 --name registry registry
  • 생성한 my-first-image:v1.0.0을 방금 생성한 registry를 바라보도록 tag합니다.
    docker tag my-first-image:v1.0.0 localhost:5000/my-first-image:v1.0.0
  • my-first-image를 registry에 push합니다.
    docker push localhost:5000/my-first-image:v1.0.0
  • 확인해봅시다.
    curl -X GET http://localhost:5000/v2/_catalog
    : localhost:5000이라는 registry에 뭐가 있는지 리스트를 확인합니다.
    curl -X GET http://localhost:5000/v2/my-first-image/tags/list
    : my-first-image라는 이미지(이름)에 어떤 태그가 저장되어 있는지 리스트를 출력합니다.

2. Docker Hub에 Push 하기

Docker Hub를 이용하기 위해선, 먼저 회원가입이 필요합니다.

  • 로그인하기
    docker login
  • Docker Hub를 바라보도록 tag를 생성합니다.
    docker tag my-first-image:v1.0.0 <username>/<imagename>:<tag>
  • my-first-image를 Docker Hub에 push합니다.
    docker push <username>/<imagename>:<tag>
  • Docker Hub의 repository에서 이를 확인할 수 있습니다.
profile
AI Engineer : Lv 0

0개의 댓글