상세 컨텐츠

본문 제목

[내가 한 거 기록하는 Docker]03. Dockerfile

MLOps

by teang1995 2021. 7. 27. 00:08

본문

반응형

환경

  • linux, ubuntu 16.04.1 LTS

내가 한 거 기록하는 Docker 시리즈


이번에 다룰 내용은 Dockerfile을 이용해 이미지를 만드는 것입니다.
"Dockerhub에서 불러오면 되는 거 아니냐?" 하고 생각하실 수 있지만, Dockerfile 을 사용한다면 layer를 쌓을 수 있다는 점에서 유용합니다.
가령 Dockerhub에서 torch 이미지를 불러온 뒤 그냥 사용할 수도 있지만, torch는 1.7로, numpy는 1.1로 설정하고 싶다면 torch1.7을 기반으로 numpy 버전을 변경해준다던가 하는 것들이 가능해집니다.
본인이 수행해야 할 task 에 맞게 이미지를 설계하는 것이 가능해집니다.
이번 포스팅에서는 가볍게 Dockerfile을 만들고, 이를 빌드해 이미지를 만들고, 이것을 dockerhub에 push 하는 방법에 대해 알아보도록 하겠습니다.


01. Dockerfile 만드는 법

이번에 만들어볼 dockerfile의 base 이미지는 docker/whalesay 입니다.

Dockerfile에 자주 쓰이는 명령어들을 필요하진 않지만 종류별로 써보았습니다.
한줄 한줄 보며 의미를 파악해보겠습니다

EXPOSE

# USAGE
EXPOSE <port> [<port>/<protocol>...]

The EXPOSE instruction informs Docker that the container listens on the specified network ports at runtime. You can specify whether the port listens on TCP or UDP, and the default is TCP if the protocol is not specified.

  • EXPOSE는 해당 이미지로 생성될 컨테이너에서 개방해줄 포트를 지정해주는 명령어입니다.
  • 즉, 세 번째 줄에 있는 "EXPOSE 3000"은 3000번 포트를 개방해라! 정도의 의미라는 걸 알아두시면 되겠습니다.

ENV

# USAGE
ENV <key>=<value> ...

The ENV instruction sets the environment variable <key> to the value <value>.

  • ENV는 환경변수 "ENV <key> <value>" 와 같이 쓰이며, 환경 변수 <key>를 <value>로 정해주겠다는 의미입니다.
  • 즉 네 번째 줄의 명령어는 MYSQL_VER이라는 환경 변수의 값을 8.0으로 지정하겠다는 의미입니다.

ADD

# USAGE
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]

The ADD instruction copies new files, directories or remote file URLs from <src> and adds them to the filesystem of the image at the path <dest>.

  • 도커 공식 문서에서 ADD는 위와 같이 정리되어있습니다.
  • 해석해보면 src에 있는 URL, 혹은 파일을 dest로 보내겠다.. 이런 의미입니다.

COPY

# USAGE
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

The COPY instruction copies new files or directories from <src> and adds them to the filesystem of the container at the path <dest>.

  • 도커 공식 문서에서 COPY는 위와 같이 정리되어있습니다.
  • 해석해보면 src에 존재하는 파일만 dest로 옮길 수 있다는 의미입니다.
  • ADD와의 차이점을 아시겠나요? ADD는 url을 넘겨 파일을 저장할 수도, 로컬에 존재하는 파일도 저장할 수 있습니다. COPY는 오직 로컬에 존재하는 파일만을 복사할 수 있습니다.

RUN

# USAGE
RUN <command>
RUN ["executable", "param1", "param2"]

The RUN instruction will execute any commands in a new layer on top of the current image and commit the results. The resulting committed image will be used for the next step in the Dockerfile.

  • 사용자가 지정해준 명령어를 실행해줍니다.

ENTRYPOINT

# USAGE
ENTRYPOINT ["executable", "param1", "param2"]

An ENTRYPOINT allows you to configure a container that will run as an executable.
CMD vs RUN vs ENTRYPOINT

  • RUN, CMD, ENTRYPOINT의 비교를 해둔 포스팅입니다. 여기서 다루기에 저도 공부가 더 필요할 것 같아 따로 빼서 정리하고자 하니 우선 위의 포스팅을 참고해주세요! 설명이 업데이트 되는대로 제 포스팅을 임베딩해두도록 하겠습니다.

WORKDIR

# USAGE
WORKDIR /path/to/workdir

The WORKDIR instruction sets the working directory for any RUN, CMD, ENTRYPOINT, COPY and ADD instructions that follow it in the Dockerfile. If the WORKDIR doesn’t exist, it will be created even if it’s not used in any subsequent Dockerfile instruction.

  • 위에 소개한 다양한 명령어들이 실행될 위치를 지정해줍니다. linux의 cd 와 같다고 보시면 되겠습니다.

2. Dockerfile 빌드

  • 필요한 명령어들을 이용해 dockerfile을 만들어보았습니다. 이를 build해주어야 우리가 사용하고자 하는 이미지가 완성됩니다.
    docker build -t test .
  • dockerfile이 있는 경로에서 위의 명령어를 입력해주면 이미지가 생성됩니다.
  • -t의 의미는 이미지의 이름을 test로 지정하겠단 의미이고, . 의 의미는 현재 위치에서 Dockerfile이라는 이름을 가진 파일을 이용해 빌드하겠다는 의미입니다.

  • 이미지 빌드가 잘 되었네요 ㅎㅎ
  • docker/whalesay 이미지를 만들기 위해 필요한 이미지를 pull해오고. 각 step에서는 위에 dockerfile에서 지정해준 명령어를 실행해줌을 확인할 수 있습니다.
  • 전 포스팅에서 확인했던 docker image 명령어를 통해 test이미지가 잘 생성되었나 확인해보겠습니다.
  • test라는 이미지가 latest tag를 가지고 3분 전에 생성되었다는 것을 확인할 수 있습니다.
  • 흥미로운(?) 점은 우리가 만든 도커파일만을 빌드했는데 docker/whalesay 이미지도 같이 생긴 것입니다.
  • 베이스 이미지도 같이 생성되니 이미지 파일 용량 관리할 때 주의하시면 좋을 것 같습니다.
  • 위에 링크를 첨부해둔 docker/whalesay에서 실행하는 방법을 적어두어 따라해보았습니다.
  • 고래가 귀엽습니다.

3. 이미지 push

3-1. docker login

  • 우선, 도커에 로그인합니다.
  • 그 전에, dockerhub에 가서 회원 가입을 해야 합니다. 어렵지 않으니 공식 홈페이지에서 가입해주세요!

3-2. docker push

  • 허무하게도, 이게 끝입니다.
    docker push <username>/>image name> 
    과 같이 입력해주시면 되겠습니다.
  • test로 만들었던 이미지 이름을 tag 명령어를 통해 바꿔줍니다. test -> teang1995/test로요.
  • 제 아이디는 teang1995 이므로 docker push teang1995/test 라고 입력하면..
  • 잘 된 것을 확인할 수 있습니다.
  • 이제 docker hub에서 본인 계정의 repositories에서 해당 이미지로 가면..
  • 몇 초 전에 이미지가 push 되었음을 확인할 수 있습니다.

정리

  • Dockerfile에 사용되는 명령어들을 알아보았습니다.
  • 해당 Dockerfile을 빌드하여 이미지를 만드는 법을 알아보았습니다.
  • 이미지를 Docker hub에 push 하는 법을 알아보았습니다.
  • 다음 포스팅에선 container와, container를 만들고, 실행하는 법에 대해 다루도록 하겠습니다. 고생 많으셨습니다.

    출처

docker documentation
Dockerfile의 ADD와 COPY의 차이
understanding-dockerfile

많이 부족합니다! 비난 없는 질문과 비판은 모두 환영합니다!

관련글 더보기

댓글 영역