[Dockerfile] Dockerfile이란? Dockerfile 옵션

[Dockerfile] Dockerfile이란? Dockerfile 옵션

Dockerfile은 인프라 구성을 효을적으로 관리하기 위한 파일로, 쉘 파일과 비슷한 dockerfile을 작성해서 해당 도커 이미지를 사용자의 환경에 맞춰서 운영할 수 있도록 합니다.

위 도커 파일을 build하게 되면 도커의 이미지를 생성할 수 있습니다!

웹서버를 도커에서 구동하려면

1) 특정 웹서버 이미지를 도커를 통해 다운

2) 웹서버 이미지를 컨테이너로 실행

3) 컨테이너에 웹서버에 빌드할 서버파일을 import

4) 서버를 구동

이러한 순서로 진행했는데,

dockerfile을 사용하게 되면 이 순서가 엄~청 단축됩니다!

1) 서버파일 측에서 dockerfile을 작성

2) dockerfile build해서 웹서버 이미지를 생성

3) 방금 빌드한 이미지를 컨테이너로 실행하면 자동으로 서버가 구동

이런 식으로 간편하게 작업을 간소화할 수 있게 됩니다.

주의할 점은, 이 dockerfile을 빌드할 경우 dockerfile을 포함하고 있는 디렉터리의 서브디렉터리까지 docker 데몬으로 보내고 처리하기 때문에 느려지기 때문에, 위 dockerfile은 최대한 하위 디렉터리에서 진행할 수 있도록 합니다!

이 도커 파일에 대해 이해하려면 먼저 이미지와 컨테이너에 대한 이해가 선행이 되어야 합니다!

1. dockerfile 옵션

FROM : Docker Base Image (기반이 되는 이미지, <이미지 이름>:<태그> 형식으로 설정)

MAINTAINER : 메인테이너 정보 (작성자 정보)

RUN : Shell Script 또는 명령을 실행

CMD : 컨테이너가 실행되었을 때 명령이 실행

LABEL : 라벨 작성 (docker inspect 명령으로 label 확인할 수 있습니다.)

EXPOSE : 호스트와 연결할 포트 번호를 설정한다.

ENV : 환경변수 설정

ADD : 파일 / 디렉터리 추가

COPY : 파일 복사

ENTRYPOINT : 컨테이너가 시작되었을 때 스크립트 실행

VOLUME : 볼륨 마운트

USER : 명령 실행할 사용자 권한 지정

WORKDIR : "RUN", "CMD", "ENTRYPOINT" 명령이 실행될 작업 디렉터리

ARG : Dockerfile 내부 변수

ONBUILD : 다른 이미지의 Base Image로 쓰이는 경우 실행될 명령 수행

SHELL : Default Shell 지정

2. Dockerfile 예시

FROM node:12 # 작업용 앱 디렉터리 생성 WORKDIR /usr/src/app # 앱 의존성 설치 COPY package*.json ./ RUN npm install # 앱 소스 추가 COPY ./ ./ EXPOSE 8080 CMD [ "node", "server.js" ]

사실 도커파일 옵션만 보면 무슨 소리를 하는지 잘 모르기 때문에, 예시로 작성된 도커 파일을 많이 보고, 직접 실행을 시켜보고 수정해보는 것이 이해하기가 빠릅니다.

1) FROM부분은 node라고 하는 공식 이미지를 기반으로 작성하며, : 뒤는 버전을 뜻합니다. 만약, 뒤가 생략되었다면 최신버전(Latest)으로 기반으로 작성됩니다.

2) WORKDIR부분은 작업용 디렉터리를 설정하기 위해 사용됩니다. 만약 위 경로의 디렉터리가 존재하지 않는다면 디렉터리를 새로 생성합니다. 보통 RUN 명령어 이전에 작업경로를 변경하기 위해 사용합니다.

3) COPY부분은 좌측은 dockerfile 기준의 파일 경로를 의미하고 우측은 복사할 경로를 의미합니다. 복사하는 경로를 입력해도 되고, 파일을 입력해도 됩니다.

4) RUN부분은 FROM 명령에서 설정한 베이스 이미지에 대해 실행하는 명령어를 지정합니다. 보통 패키지 설치 및 명령 실행에 사용됩니다.

5) EXPOSE 부분은 컨테이너의 공개 포트를 호스트와 연결(지정)할 때 사용합니다. 위 expose는 내부적으로 운영되는 포트이며 실행중인 컨테이너와 호스트와 연결만 하고, 만약 외부에서 사용하려면 docker run -p 옵션으로 별도로 지정해야합니다.

6) CMD부분은 이미지를 바탕으로 생성된 컨테이너 실행 시 매번 명령을 실행합니다.(자동) 보통 Exec 방식인 CMD [“(arg)”, “(arg)”, “(arg)”]으로 작성합니다.

다른 예시로 아래 도커 파일을 보면 이해가 쉬우실 겁니다.

### Base Image 지정 FROM ubuntu:20.04 ### TimeZone 환경 변수 지정 ENV TZ Asia/Seoul ### TimeZone 설정 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone ### /home/dev 폴더 생성 RUN mkdir /home/dev ### update 및 패키지 설치 RUN apt update && apt -y install vim git tar gzip build-essential curl alien openjdk-8-jdk nginx ### nodejs 설 RUN curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_14_setup.sh && bash nodesource_14_setup.sh && apt -y install nodejs ### build, tomcat, maven, nginx(default.conf) 파일 복사 COPY build.tar.gz /home/dev/build.tar.gz COPY tomcat-9.0.45.tar.gz /home/dev/tomcat-9.0.45.tar.gz COPY apache-maven-3.8.1.tar.gz /home/dev/apache-maven-3.8.1.tar.gz COPY default.conf /etc/nginx/conf.d/default.conf ### ubuntu01 계정 생성 RUN addgroup --gid 1100 ubuntu01 && adduser --disabled-password --home /home/dev --no-create-home --system -q --uid 1000 --ingroup ubuntu01 ubuntu01 ### Github Source 파일 다운로드 RUN git clone https://github.com/bc-hwang/TEST.git /home/dev/deverse ### /home/dev 폴더 이동 WORKDIR /home/dev ### 암축 파일 해제 RUN tar -zxvf apache-maven-3.8.1.tar.gz RUN tar -zxvf tomcat-9.0.45.tar.gz RUN tar -zxvf build.tar.gz ### maven link 설정 RUN ln -s /home/dev/apache-maven-3.8.1/bin/mvn /usr/bin/mvn ### Build 실행 RUN cd /home/dev/build && bash ./back_build.sh RUN cd /home/dev/build && bash ./front_build.sh ### Nginx & Tomcat Service 실행 CMD nginx -g 'daemon on;' && /home/dev/tomcat-9.0.45/bin/catalina.sh run ### 서비스 포 EXPOSE 80 8080

3. dockerfile build

도커 파일을 빌드하려면 아래와 같이

# docker build -t <이미지 이름>:<태그명> <이미지 생성 위치>

을 입력해주면 됩니다. 여기서 -t는 이미지 이름과 태그명을 입력하겠다는 옵션입니다.

from http://narup.tistory.com/204 by ccl(A) rewrite - 2021-12-21 16:00:23