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 .
'윈도우 개발환경' 카테고리의 다른 글
시놀로지 Docker로 만드는 edge server; 2. node.js 서비스 올리기 (0) | 2023.04.20 |
---|---|
시놀로지 Docker로 만드는 edge server; 1. 우분투 서버 설치하기 (0) | 2023.04.19 |
Git Bash 활용하기 - 1. 리눅스 기능 확장하기 (0) | 2023.04.11 |
윈도우에 만드는 리눅스 개발 환경; 6. Docker로 MongoDB 시작하기 (0) | 2023.04.10 |
개발 소스코드 관리; 5. 예제로 본 Git 사용법 (기본 명령어) - 1 (0) | 2023.04.06 |