본문 바로가기
Development Tools/Docker

Docker 이미지 만들기

by jjerryhan 2017. 12. 31.
반응형

Docker 이미지 만들기

자 이제 docker 이미지를 직접 만들어 봅시다.

docker 이미지는 Dockerfile 을 정의한 후 build 명령어를 수행하면 Dockerfile 에 기술된 내용대로 build 하여 만들어 집니다. 



Dockerfile 을 통한 Container 정의

Docker 이미지는 read only 이기 때문에 항상 구동시마다 구동 이후 필요한 작업들, 예를 들어 추가 프로그램을 설치한다거나 환경 구성을 바꾼다거나 하는 작업을 반복할 수 만은 없겠죠? 

이런 경우 Dockerfile 을 정의하여 모든 사후 작업이 이미 처리가 완료된 Container 를 정의할 수 있습니다. 

아래는 파이썬으로 작성된 프로그램에 대한 컨테이너를 정의하는 예시입니다. 

# 공식 파이선 2.7 이미지로 부터 컨테이너를 만들거구요.
FROM python:2.7-slim

# 컨테이너가 실행된 후 작업 경로는 컨테이너 상의 /app 에서 수행하겠습니다. (명령어가 이 경로에서 수행됩니다.)
WORKDIR /app

# 현재 호스트의 디렉토리에 있는 모든 파일을 컨테이너 안의 /app 경로에 복사합니다.
ADD . /app

# 컨테이너 안에서 pip 을 실행하여 실행에 필요한 추가 프로그램들을 설치 합니다.
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# 컨테이너의 80 포트를 외부로 엽니다.
EXPOSE 80

# 환경 변수를 정의하고요.
ENV NAME World

# 컨테이너 안에서 python 명령어를 통해 app.py 를 실행합니다.  실행경로는 위의 WORKDIR 에서 정의한 /app
CMD ["python", "app.py"]


Dockerfile 을 통한 Node Container 정의

제가 docker 를 다시 들여다본 목적은 현재 개발하고 있는 node 프로그램을 heroku 에 deploy 하기 위함이구요. 

아래와 같이 정의했습니다. 

FROM node:latest


ENV NODE_ENV=production

ENV PORT=4000


COPY . /var/www


WORKDIR /var/www


#VOLUME ("/var/www")

#VOLUME 은 heroku 에서 지원이 안됩니다. 당연하게도.


RUN npm install

RUN npm run build


EXPOSE 4000


CMD ["npm", "start"]

#heroku 는 CMD 가 필수입니다. ENTRYPOINT 가 정의되어 있다해도 말이죠.

ENTRYPOINT ["npm", "start"]


Docker build 를 통한 이미지 빌드

Dockerfile 이 완성되면, 빌드해서 이미지를 만듧니다.

docker build -t jerry/node .

// build 명령어로 이미지를 빌드하되, 이미지 이름을 "jerry/node" 로 taging 하도록 지정했습니다.

// Dockerfile 은 현재 경로에 있는 파일 (.) 을 지정하였구요. -f 옵션을 통해 특정 Dockerfile 을 지정할 수도 있습니다.

Dockerfile 에 정의한 순서대로 실행이 되고, jerr/node:lastest 이미지가 정상적으로 생성되었습니다.

생성된 이미지 실행

이미지를 생성한 이유는 컨테이너 실행을 하기 위한 것이니 아래와 같이 실행하면 됩니다.

docker run -p 80:4000 jerry/node

// jerry/node 이미지를 이용해서 컨테이너를 실행하며, 호스트의 80 포트를 컨테이너의 4000 포트에 연결!.

정상적으로 구동되었습니다. 


이번 포스트는 여기까지 입니다.