
3. Docker Container
Docker Container에 대해서 간단히 알아봅시다.
2024년 10월 10일
Jisoo.
기술블로그
이미지에 대해 알아보고 Dockerfile을 통해 이미지를 생성해보겠습니다.
Dockerfile
은 애플리케이션 패키징을 위한 스크립트입니다.
이 스크립트를 작성하여 이미지를 생성할 수 있습니다.
1FROM diamol/node 2 3ENV TARGET="blog.sixeyed.com" 4ENV METHOD="HEAD" 5ENV INTERVAL="3000" 6 7WORKDIR /web-ping 8COPY app.js . 9 10CMD ["node", "/web-ping/app.js"]
각 줄은 Instruction
에 해당하며 하나 하나가 실행 관련 명령어에 해당합니다.
FROM
, ENV
, WORKDIR
, CMD
등 다양한 인스트럭션을 제공합니다.
자주 사용되는 인스트럭션은 다음과 같습니다.
인스트럭션 | 설명 |
---|---|
FROM | 이미지의 기준을 정의합니다. 다른 이미지가 기준이 될 수 있습니다. |
COPY | 로컬 파일 시스템의 파일, 디렉토리를 이미지 내부로 복사합니다. |
CMD | 컨테이너가 실행될 때 실행 할 명령을 지정합니다. |
ENV | 이미지 환경 변수 값을 설정합니다. |
EXPOSE | 컨테이너가 외부에 노출할 포트를 명시적으로 지정합니다. 실제로 노출되지 않습니다. |
RUN | 빌드 과정에서 명령을 실행하고 결과를 이미지에 저장합니다. 주로 의존성 설치에 사용됩니다. |
WORKDIR | 이미지 내부에 디렉토리를 생성하고 해당 디렉토리를 작업 디렉토리로 사용합니다. |
Dockerfile
을 이용하여 이미지를 생성(빌드)할 수 있습니다.
1docker image build --tag my-image .
이미지를 생성할 경우 다음과 같이 일련의 메시지가 출력됩니다.
1=> CACHED [builder 1/3] FROM docker.io/diamol/golang:latest@sha256:ffc0... 2=> CACHED [stage-1 1/5] FROM docker.io/diamol/base:latest 3=> [internal] load build context = 4=> transferring context: 569B 5=> [builder 2/3] COPY main.go . 6=> [builder 3/3] RUN go build -o /gols 7=> [stage-1 2/5] COPY --from=builder /gols / 8=> [stage-1 3/5] RUN chmod +x /gols 9=> [stage-1 4/5] WORKDIR /init 10=> [stage-1 5/5] COPY ./existing/ . 11=> exporting to image = => exporting layers 12=> writing image sha256:50c78... 13=> naming to docker.io/library/my-image
자세히 읽어보면 Dockerfile
의 내용과 일치하는 것을 확인할 수 있습니다.
순차대로 Dockerfile
의 인스트럭션을 실행하며 이미지를 빌드할 수 있습니다.
이미지는 소스 코드, 라이브러리 등 애플리케이션 실행에 필요한 파일을 가지고 있는 파일입니다.
이러한 이미지를 토대로 독립적인 환경을 가진 컨테이너를 만들 수 있게 됩니다.
예를 들면 하나의 CD로 여러 대의 컴퓨터에서 똑같은 프로그램을 설치할 수 있는 것과 비슷합니다.
프로그램은 어디서나 동일하게 설치되고 설치된 프로그램 간에 서로 영향을 주지 않습니다.
이미지는 여러 개의 작은 파일로 이루어져있습니다.
이미지를 다운로드 받을 경우 다음처럼 여러 줄에 걸쳐서 이루어지는 것을 확인할 수 있습니다.
각 줄은 이미지를 구성하는 작은 파일로써 이 또한 이미지에 해당합니다.
history
명령어를 통해 이미지가 어떤 명령으로 빌드됐는지 알 수 있습니다.
각 줄마다 이미지 레이어에 대한 정보가 출력되며 Dockerfile
에 작성된 하나의 인스트럭션이 하나의 이미지를 의미하는 것을 알 수 있습니다.
즉, 하나의 이미지는 다른 이미지가 겹겹이 쌓인 파일을 의미합니다.
이를 이미지 레이어라고합니다.
Docker를 사용하면 이미지 배포 및 공유가 가능합니다.
내부적으로 소프트웨어 배포 기능이 포함되어 있기 때문에 push, pull
명령어를 통해 도커 허브에 이미지를 공유할 수 있습니다.
공유된 이미지 레이어는 Dockerfile
의FROM
명령어를 통해 해당 이미지를 기반으로 새로운 이미지를 생성할 수 있습니다.
이미지 레이어는 다른 이미지에서도 공유가 가능하기 때문에 수정될 경우 관련된 모든 이미지에서 문제를 초래할 수 있습니다.
따라서 생성된 이미지는 수정이나 실행이 불가능한 읽기전용 파일입니다.
//
하나의 인스트럭션은 하나의 이미지 레이어와 연결됩니다.
이미지 빌드시, Hash
를 이용해서 캐시에 일치하는 레이어가 있는지 확인합니다.
인스트럭션 결과가 기존과 같다면 캐시된 해당 이미지 레이어를 재사용합니다.
인스트럭션은 위에서 아래로 순서대로 실행되며 캐시되지 않은 인스트럭션을 만날 경우 해당 인스트럭션 이후의 모든 과정은 캐시 데이터를 사용하지 않습니다.
따라서 이미지 빌드 시 자주 변경되는 파일 관련 인스트럭션을 마지막에 배치하면 인스트럭션의 낭비를 줄일 수 있습니다.
또한 이미지 빌드 시간이 감소하는 효과를 가져올 수 있습니다.
//
나중에 다시 쓰기 ㅎ
1