[Docker] 4. Docker File
도커 파일 (Dockerfile) : 서버 운영 기록을 코드로 저장한 파일을 특정 시점의 도커 이미지로 빌드
- 눈송이 서버 (
Snowflakes Server) : 각 서버마다 운영 기록이 달라 서로 모양이 다른 서버들이 공존하는 상황… 서버 간의 운영체제, 컴파일러, 설치된 패키지 등의 차이로 발생하는 문제 개선을 위해 서버 운영 기록을 저장하자!
도커 파일을 생성하는 과정은 테스트 주도 개발의 순환에 부합하다고 볼 수 있다.
- 테스트 주도 개발 (
Test Driven Development) : 선 테스트 후 개발 사이클을 반복하는 개발 방법론
- 테스트를 작성한다. → 도커 파일을 만든다.
- 테스트에 실패하고 코드를 수정한다. → 도커 이미지의 빌드에 실패하고 도커 파일을 수정한다.
- 테스트에 성공한다면, 코드를 리펙터링한다. → 도커 이미지의 빌드에 성공한다면, 도커 파일의 내용을 리펙터링한다.
- 처음으로 되돌아간다.
DSL (Domain-Specific Language) : 도커 파일을 작성할 때 쓰는 언어 (도커 이미지의 생성 과정 표현)
생성 과정을 표현? : 도커 파일은 일련의 인스트럭션을 실행된 결과로 도커 이미지를 생성한다.
- 도커 파일의 인스트럭션과 이미지 레이어는
1:1의 관계를 가진다.
-
FROM: 다른 컨테이너 이미지를 빌드의 시작점으로 지정AS: 컨테이너에 이름을 붙일 수 있음
-
ENV: 컨테이너 내에서 사용될 환경 변수를 지정 -
WORKDIR: 컨테이너 이미지의 파일 시스템에 디렉터리를 만들고, 해당 디렉터리를 작업 디렉터리로 지정 -
COPY: 로컬의 파일 시스템 내 파일, 디렉터리를 컨테이너 이미지로 복사--from=: 해당 파일이 호스트 컴퓨터가 아닌 다른 컨테이너의 파일임을 알려줌
-
CMD: 도커가 이미지로부터 컨테이너를 실행했을 때 실행할 명령을 지정 -
RUN: 빌드 과정에서 컨테이너 안에서 명령을 실행한 다음에 그 결과를 이미지 레이어에 저장
Q. 도커 파일을 쓰는 이유?
A1. 동일한 환경에서 어플리케이션을 실행 가능하게 한다.
- 모든 빌드 과정은 도커 컨테이너 내부에서 이루어지며, 각 컨테이너는 모든 도구를 정확한 버전으로 갖추고 있다.
- 신규 개발자의 적응 기간, 빌드 서버의 관리 부담, 개발자 간의 도구 버전의 차이로 인한 빌드 실패를 줄일 수 있다.
A2. 멀티 스테이지 환경에서 각 단계는 자신만의 캐시를 가져 성능을 향상시킬 수 있다.
- 도커는 빌드 중에 각 인스트럭션에 해당하는 레이어 캐시를 찾는다.
- 만약 해당되는 캐시를 찾지 못하면 남은 인스트럭션이 모두 실행되지만, 그 범위가 해당하는 단계 안으로 국한된다.
- 이어지는 다음 단계는 캐시를 재사용하면서 시작되므로, 캐시 재사용을 통해 빌드 단계에서 시간 절약이 가능하다.
A3. 멀티 스테이지 스크립트를 통해 최종 산출물의 크기를 가능한 한 작게 유지할 수 있다.
- 최종 산출물인 도커 이미지에 불필요한 도구를 제외하여 어플리케이션의 의존 모듈 자체를 줄일 수 있다.