[Docker Mastery] - 3

도커 이미지 만들기

시작

이미지 생성 및 실행

이제 이미지를 직접 만들어 보겠습니다. 노드 애플리케이션을 예로 들겠습니다. 우선 애플리케이션 루트에 Dockerfile을 생성합니다.
이 단계에서 docker확장 프로그램 설치를 추천합니다.

yaml
# OS와 같다고 보면 됩니다. 이 이미지를 기반으로 환경이 구성됩니다.
FROM node

# 컨테이너 디렉토리 경로를 /app 공간으로 변경합니다. 이 공간에서 다음 명령이 수행됩니다.
WORKDIR /app

# 첫 번째 경로는 컨테이너 외부 즉 현재 컨텍스트입니다.(.)
# 두 번째 경로는 컨테이너 내부입니다. 
# 프로젝트내 모든 파일을 컨테이너 내부에 복사합니다.
# 두 번째 경로는 . 으로 해도 괜찮지만 명시적으로 /app이라 작성합니다.
COPY . /app

# 기본적으로 RUN 명령은 컨테이너 내부에서 이루어집니다.
RUN npm install

# 이 컨테이너는 로컬에서 80포트로 노출합니다. 이 부분은 선택사항입니다.
# 이 명령은 명시적으로 80으로 실행된다 뿐이지 docker run 시 -p 옵션으로 엑세스 설정이 필요합니다.
# 따라서 이 방법은 선택이지만 모범적인 사용법입니다.
EXPOSE 80

# CMD는 이미지가 생성될때 실행되지 않고 컨테이너가 시작될 때 실행됩니다.
# RUN node server.js
CMD ["node", "server.js"]

이제 터미널을 실행해 이미지를 생성해봅시다.

bash
# 이미지명이 Dockerfile이 아닌 경우 docker build -f [파일명]
docker build .

이후 이미지를 컨테이너로 실행해봅시다.

bash
docker run [이미지명 혹은 ID]

이후 정지시 stop을 이용합니다.

bash
docker stop [이미지명 혹은 ID]

단 여기까지 했다고해서 컨테이너로 접속은 되지 않습니다. EXPOSE 80을 했지만 아직 로컬에서 접속은 불가능합니다. 다음 -p옵션이 설정되어야 합니다.

bash
# 로컬 머신 어떤 포트가 내부의 도커 특정 포트에 엑세스 할 수 있는지 설정이 필요합니다. -p (publish) 옵션을 이용해 로컬의 3000번 포트로 내부 도커 컨테이너 80으로 엑세스하도록 설정합니다.
docker run -p 3000:80 [이미지명 혹은 ID]

레이어 아키텍처와 이미지 최적화

나중에 코드를 변경하는 경우 이미지 빌드가 다시 필요합니다. 다만 이전 빌드보다는 빠르게 수행됩니다. 빌드과정이 캐시되기 때문이죠. 이를 레이어 기반 아키텍처라고 합니다. 또한 이미지는 읽기 전용으로만 생성된다는 것을 알 수 있습니다.
도커의 레이어 아키텍처란 한 파일을 수정한 경우 해당 레이어로 부터 이후 레이어 명령이 다시 수행되는 원리입니다. 변경이 감지된 레이어부터 다시 명령이 수행된다.이 점이 중요합니다. 이 과정을 덜 수행하도록 최적화를 진행해봅시다.

yaml
FROM node

WORKDIR /app

COPY package.json /app

RUN npm install

COPY . /app

EXPOSE 80

CMD ["node", "server.js"]

위와 같이 변경하면 소스가 변경되어 다시 수행이 필요하다고 감지된 COPY . /app명령 레이어부터 다시 진행되죠. 이전보다 빌드 속도를 더 늘릴 수 있게 되었습니다.