Dockerfile은 사용자가 구축하고자 하는 Docker 컨테이너의 configuration 정보를 담는 설정 템플릿입니다. 이 스크립트 파일 안에는 기본 뼈대가 될 컨테이너 이미지(ex., Ubuntu, NginX 등), 환경 변수, 빌드 후 실행할 코드 등을 정의할 수 있습니다.
1. Dockerfile 기본 구문
FROM
배포할 컨테이너 기본 이미지를 지정합니다.
FROM debian:buster-slim
ENV
컨테이너 동작 과정에서 사용할 환경 변수를 설정합니다.
# ENV [변수 명] [변수 값]
ENV NGINX_VERSION 1.20.1
WORKDIR
컨테이너를 실행했을 때, 홈 디렉토리 역할을 할 경로를 지정합니다. 뒤에 설명할 RUN, CMD과 같은 명령어도 해당 경로를 기준으로 실행됩니다.
WORKDIR /usr/src/app
COPY 또는 ADD
COPY는 호스트의 파일 시스템에서 컨테이너 내부로 복사할 파일들을 지정하는 옵션입니다. 이와 비슷한 옵션으로 ADD라는 게 하나 더 있으며, ADD는 로컬 파일 경로 이외에도 URL 정보를 인자로 넣을 수 있습니다.
# COPY [호스트 내 원본 파일 경로] [컨테이너 내부 경로]
COPY docker-entrypoint.sh /
EXPOSE
컨테이너에서 지정한 포트 번호로 외부와의 통신이 가능하게끔 합니다.
EXPOSE 80
RUN 또는 CMD
RUN과 CMD는 컨테이너에서 실행될 쉘 명령어 리스트입니다. 둘의 차이는, RUN은 컨테이너 빌드 과정에서 실행되는 명령어이고 CMD는 컨테이너 빌드가 끝난 이후에 실행되는 명령어를 지정합니다. 예를 들어 컨테이너에서 Nginx 웹 서버를 호스팅하는 경우 CMD nginx 명령을 Dockerfile 내에 포함시켜 컨테이너 빌드 이후 바로 웹 서버가 돌아갈 수 있도록 합니다.
RUN set -x \\
&& addgroup --system --gid 101 nginx \\
&& adduser --system --disabled-login --ingroup nginx --no-create-home --home /nonexistent --gecos "nginx user" --shell /bin/false --uid 101 nginx \\
&& apt-get update
2. 컨테이너 이미지 빌드 예제
nginx 애플리케이션을 Dockerfile로 띄워보고자 합니다. 기본적으로 nginx 컨테이너를 생성하면 브라우저에서 좌측과 같은 페이지를 확인할 수 있었는데요. 이번에는 특별히 빌드 과정에 다른 html 파일을 삽입하여 첫 화면이 우측처럼 나타나게끔 하는 예제를 수록하였습니다.
Dockerfile
# Dockerfile
FROM nginx:latest
WORKDIR /usr/share/nginx/html
COPY index.html index.html
EXPOSE 80
컨테이너 이미지는 최신 버전 nginx로 설정하고, 아래 index.html 파일을 배치할 컨테이너 내부 경로(WORKDIR)와 COPY 명령어를 작성하였습니다. 위 예시에서 로컬 파일시스템에 있는 index.html 파일은 컨테이너 안 /usr/share/nginx/html/index.html 경로에서 확인할 수 있습니다. 마지막 줄은 nginx를 웹 브라우저에서 접근할 수 있도록 80번 포트를 EXPOSE 옵션으로 개방하는 내용입니다.
index.html
<!-- index.html -->
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>My Nginx</title>
</head>
<body>
<h1>SUCCESS!</h1>
</body>
</html>
이미지 빌드
Dockerfile을 기반으로 이미지를 빌드하는 명령어는 아래와 같습니다.
# docker image build -t [이미지 명] [Dockerfile이 있는 디렉토리]
$ docker image build -t myimg .
이미지를 빌드하면 docker image ls 명령어로 방금 생성한 이미지가 Docker 엔진에 등록되었음을 확인 가능합니다. 이제 docker run 명령어를 이용하여 myimg를 기반으로 하는 nginx 컨테이너를 생성합니다. 브라우저를 켜고 주소창에 localhost:80을 입력했을 때, 아래 2번째 이미지와 같은 화면이 나타나야 정상입니다.
docker run --name myapp -p 80:80 --rm myimg
3. 만든 이미지를 Docker Hub에 공유하기
마지막으로 사용자가 만든 이미지를 Docker hub에 publish하는 방법을 알아보겠습니다. 과정에 앞서서 우선 Docker hub 계정이 반드시 있어야 합니다.
Docker를 실행중인 터미널로 돌아와, docker login 명령어로 Docker Hub 개인 계정에 접속합니다.
# 쉘에서 Docker Hub 로그인
$ docker login
그 전에 생성한 myimg를 다른 이름으로 태깅한 뒤, 태깅한 정보를 토대로 Docker Hub로 push 합니다.
# docker tag [이미지 명] [Username]/[태그 명]
$ docker tag myimg pyro21/mynginx
# docker push [Username]/[태그 명]
$ docker push pyro21/mynginx
이제 웹 브라우저 Docker Hub 페이지로 돌아와, 상단 Repositories 탭을 클릭하면 방금 업로드한 이미지 정보를 조회해볼 수 있습니다.