티스토리 뷰

Docker Image를 Dockerfile 기반으로 만들기



Dockerfile은 Dockerimage를 설정하기 위한 파일이다.
기본 이미지를 토대로 자신만의 이미지를 생성하는 방식으로 Docker Hub에서 Official 한 이미지 외에 검증되지 않은 이미지를 받는 것 보다는 훨씬 안정적이고 효율적인 형태로 필요에 따라 이미지를 생성할 수 있다.

도커파일의 문법 구조는 아래와 같다.

FROM

기본 이미지를 지정한다. 최근에는 경량화된 운영체제인 Alpine LInux를 많이 사용하기도 한다.

FROM “사용할 이미지 이름"
FROM centos:latest

MAINTAINER / LABEL

이미지를 생성한 저자에 대한 정보 및 라벨링을 할 수 있다.
최근에는 LABEL을 많이 사용한다.

MAINTAINER “이미지 생성한 사람 관련 정보"
MAINTAINER WOO HYUNG CHOI whchoi98@gmail.com

RUN

패키지 인스톨 및 Shell 명령을 기본이미지를 실행 할때, 함께 수행할 수 있다.

RUN “기본 이미지에서 스크립트 또는 명령을 실행시키는 명령어"
RUN yum -y update
RUN yum -y install net-tools


CMD

이미지를 통해 컨테이너가 만들어지고 나서 가장 처음 실행될 명령어를 선언 한다.
단 한번만 적용되기 때문에, 필요에 따라 지정해서 사용하면 된다.

CMD “컨테이너에서 실행할 명령어를 실행시키는 명령"
CMD touch /home/test.txt

EXPOSE

EXPOSE는 docker run —expose 옵션과 동일하며 호스트와 연결될 포트 번호를 설정하는 명령이다.

EXPOSE 호스트와 연결할 포트번호를 설정하는 명령
EXPOSE 8888 80

ENV

환경변수를 설정할 수 있다. Docker run -e 와 유사한 결과를 가질 수 있다.

ENV “환경변수”
ENV nginx_vhost /etc/nginx/sites-available/default

ADD

현재 폴더 내부의 파일을 이미지에 추가할 수 있으며 , 반드시 절대경로를 지정한다.

ADD http://test.com/test.txt /home/test/
# Image 내부 /home/test 폴더에 test.txt를 저장

COPY

ADD와 유사하지만 URL, tar에 대한 압축을 풀 수는 없다.


ENTRYPOINT

컨테이너가 실행될 때 사용할 명령어를 지정할 수 있다.

VOLUME

지정된 호스트 볼륨에 특정 디렉토리를 저장할 수 있도록 마운트 시킬 수 있다.

VOLUME [“호스트 디렉토리”, “이미지 내부 디렉토리”]
VOLUME [“/home/whchoi” , “/home/guest”]

USER

RUN,CMD, ENTRYPOINT에서 실행될 계정을 선언한다.

USER “User Name”
USER admin

ONBUILD

ONBUILD는 최초 이미지를 생성할 때는 동작하지 않으며, 최초에 생성된 이미지에 바인딩되어 이후 해당 이미지를 부모 이미지로 기반으로 자식 이미지들을 만들 때 자동으로 바인딩 된다.

ONBUILD RUN touch /thisisremade.txt
WORKDIR

명령을 실행하게 되는 디렉토리를 설정하는 명령이다. 주로 RUN, CMD, ENTRYPOINT에서 설정한 실행 파일이 실행될 디렉토리가 된다.

WORKDIR “작업 디렉토리”
WORKDIR “/home/whchoi"

Dockerfile 예제

# VERSION 1.0

FROM alpine
# alpine linux 이미지를 기본으로 사용

MAINTAINER Woo Hyung Choi, whchoi98@gmail.com
# 생성자 표시

# basic package install , pip install


RUN apk update \
&& apk upgrade \
&& apk add vim git python python-dev py-pip gcc g++ make bash \
&& pip install flask flask-admin flask-bootstrap flask-cors flask-httpauth flask-sqlalchemy flask-wtf gitpython \
&& pip install graphviz ipaddress jsonschema py-radix pymysql requests tabulate websocket-client deepdiff

# Alpine linux 생성 이후 설치 패키지

# acitoolkit setup


RUN git clone https://github.com/datacenter/acitoolkit.git \
&& cd /acitoolkit \
&& python ./setup.py install \
&& cd /acitoolkit \
&& python ./setup.py develop


# nxtoolkit setup


RUN git clone https://github.com/datacenter/nxtoolkit.git \
&& cd /nxtoolkit \
&& python ./setup.py install \
&& cd /nxtoolkit \
&& python ./setup.py develop


# CiscoUCSM SDK setup


RUN git clone https://github.com/CiscoUcs/ucsmsdk \
&& pip install ucsmsdk \
&& cd /ucsmsdk \
&& make install


# vmware SDK pyvmomi setup


RUN pip install pyvmomi \
&& git clone https://github.com/whchoi98/whchoi_pyvmomi-community-samples.git


WORKDIR /

#실행 디렉토리

CMD [“/bin/bash"]

# docker run에서 실행될 때 가장 먼저 실행.


공지사항