본문 바로가기

윈도우 개발환경

Dockerfile로 만드는 docker image; Dockerfile 명령 총 정리

1. Dockerfile

Dockerfile은 사용자가 정해진 규칙/명령에 따라 Dockerfile을 만들고 docker build명령어로 실행하면 사용자가 원하는 docker image를 만들 수 있는, 일종의 설계도이다. 회사에서 프로그램을 개발해서 배포하고 관리하는 방법으로 컨테이너를 사용하려고 한다면 Dockerfile을 만들어서 docker image를 자동으로 만들 수 있다.

 

Dockerfile에 사용할 수 있는 명령은 18개가 있으며 1개는 deprecated 되었다. ONBUILD를 제외하고 아래에 정리해 봤다.

ADD 파일이나 폴더를 복사한다.
COPY와 차이점은 원격파일도 복사한다는 점이다

ex) ADD git@github.com:user/repo.git /usr/src
ARG build할 때 사용하는 매개변수를 정의한다.

ex) ARG userid=default_value
CMD 컨테이너를 실행할 때 실행할 명령어를 지정한다.
하나만 적용되며, 마지막에 지정한 CMD가 실행된다.

ex) source $HOME/env/.bash_my_env && $HOME/bin/myapp
COPY 파일이나 폴더를 복사한다.
--from으로 복사할 폴더의 위치를 지정할 수도 있다.

ex) COPY --from=build /myapp /usr/bin
ENTRYPOINT 컨테이너를 실행할 때 실행되는 명령어를 지정한다.
CMD와 같이 사용해서 추가적인 매개변수를 받게 할 수도 있다.

ex) ENTRYPOINT ["top", "-b"]
      CMD ["-c"]
로 Dockerfile을 만들면 top -b -c 가 실행된다.
ENV 환경변수를 설정한다.
한번에 여러 변수를 설정하려면 한칸씩 띄우면 된다.

ex) MY_APP_VER=1 MY_APP_NAME=app
EXPOSE 몇 번 port로 서비스를 열지를 지정한다.

ex) 80/tcp
FROM docker image를 만들기 위한 시작 이미지(base image)를 지정한다.

ex) FROM ubuntu:latest
HEALTHCHECK Docker가 컨테이너가 정상적으로 실행되는지 확인하는 방법을 제공한다.

ex) HEALTHCHECK --interval=5m --timeout=3s \
         CMD curl -f http://localhost/ || exit 1
LABEL docker image에 대한 메타데이터를 지정한다.

ex) LABEL APP_VERSION="1.0.0" \
                  APP_NAME="myapp"
RUN build할 때 실행되는 명령을 지정한다.

ex) RUN <<EOF
      apt-get update
      apt-get install -y curl
      EOF

--mount로 파일시스템을 마운트할 수 있다.
RUN --mount=type=cache,target=/root/.cache/go-build \
  go build ...
SHELL 컨테이너에서 사용하는 기본 shell을 지정한다.
기본값은 ["/bin/sh", "-c"]

ex) SHELL=["powershell", "-command"]
STOPSIGNAL 컨테이너이 실행이 종료되는 signal을 지정한다.
기본값은 SIGTERM
USER 컨테이너가 실행될 때 사용할 사용자와 그룹을 지정한다.

ex) userid: groupid
VOLUME 컨테이너가 실행될 때 마운트할 위치를 지정한다.

ex) /mnt/data
WORKDIR RUN, CMD, ENTRYPOINT, COPY, ADD가 실행되는 폴더를 지정한다.

ex) $HOME/projects/bin

2. Dockerfile 예제

Dockerfile의 예제는 아래 사이트에서 많이 구할 수 있다.

 

Dockerfile Project

Trusted Automated Docker Builds. Dockerfile Project has 36 repositories available. Follow their code on GitHub.

github.com

이 사이트에서 제공하고 있는 Dockerfile은 ubuntu, nginx, rabbitmq, redis, java, nodejs, python, ruby, 등 다양하다.

이 중 몇 가지를 열어 내용을 살펴보자.

a. 파이썬 실행환경

#
# Python Dockerfile
#
# https://github.com/dockerfile/python
#

# Pull base image.
FROM dockerfile/ubuntu

# Install Python.
RUN \
  apt-get update && \
  apt-get install -y python3 python3-dev python3-pip python3-virtualenv && \
  rm -rf /var/lib/apt/lists/*

# Define working directory.
WORKDIR /data

# Define default command.
CMD ["bash"]

 

FROM ...  dockerfile/ubuntu를 base image를 지정한다. 내 컴퓨터에서 실행할 때에는 ubuntu로 지정하면 내 컴퓨터 환경 또는 내가 사용하고 있는 image repository에서 가져온다. 버전을 지정하지 않았으므로 최신버전을 가져온다.

 

RUN ...  apt-get update, install을 순서대로 실행하고, rm으로 apt기록을 삭제한다.

 

WORKDIR ... /data으로 작업폴더를 이동하고

 

CMD ... 이 docker image를 실행하면 "bash"를 실행해서 사용자에게 작업할 수 있도록 넘겨준다.

b. nodejs 실행환경

#
# Node.js Dockerfile
#
# https://github.com/dockerfile/nodejs
#

# Pull base image.
FROM dockerfile/python

# Install Node.js
RUN \
  cd /tmp && \
  curl -O http://nodejs.org/dist/node-latest.tar.gz && \
  tar xvzf node-latest.tar.gz && \
  rm -f node-latest.tar.gz && \
  cd node-v* && \
  ./configure && \
  CXX="g++ -Wno-unused-local-typedefs" make && \
  CXX="g++ -Wno-unused-local-typedefs" make install && \
  cd /tmp && \
  rm -rf /tmp/node-v* && \
  npm install -g npm && \
  printf '\n# Node.js\nexport PATH="node_modules/.bin:$PATH"' >> /root/.bashrc

# Define working directory.
WORKDIR /data

# Define default command.
CMD ["bash"]

 

FROM ...  dockerfile/python를 base image를 지정한다. 내 컴퓨터에서 실행할 때에는 python으로 지정하면 내 환경에서, 또는 내가 사용하고 있는 리포지토리, Docker Hub에서 최신버전의 image를 가져온다.

 

RUN ...  notejs홈페이지에서 note-latest.tar.gz파일을 받고, 압축을 풀고, 다운로드한 파일은 지우고, 필요한 부분을 빌드한 후, 글로벌 nodejs환경을 설정한다.

 

WORKDIR ... /data으로 작업폴더를 이동하고

 

CMD ... 이 docker image를 실행하면 "bash"를 실행해서 사용자에게 작업할 수 있도록 넘겨준다.

3. Docker image 생성

docker buildx build명령으로 docker image를 만든다.

docker buildx build -t [이름]:[버전, latest] [Dockerfile위치]
# 또는 아래의 Alias를 사용할 수 있다.
# docker build, docker bulider build, docker image build, docker buildx b
# --help를 사용하면 도움말을 얻을 수 있다.

 

예를 들어 앞의 파이썬 실행환경을 폴더에 저장했으면

docker buildx build -t python-run .