3장 실습은 web-ping이라는 간단한 애플리케이션으로 진행된다. 지정한 웹 사이트가 노출되는지 확인하는 기능을 하며, 컨테이너에서 실행돼 지정된 URL에 HTTP 요청을 3초마다 보내는 동작을 컨테이너가 종료될 때까지 반복한다.
도커 파일 vs 도커 이미지 vs 도커 컨테이너
먼저 도커 파일, 도커 이미지와 도커 컨테이너의 차이를 대략적으로 이해해보자.
도커 파일 == 서버 운영 기록
도커 이미지 == 도커 파일 + 실행 시점
도커 컨테이너 == 도커 이미지 + 환경 변수
아래 링크를 참고하였으므로, 더 자세한 내용이 궁금하다면 아래 내용을 참고바란다.
왜 굳이 도커(컨테이너)를 써야 하나요? - 컨테이너를 사용해야 하는 이유
컨테이너는 서버 애플리케이션을 배포하고 서버를 운영하는 표준적인 기술이 되어가고 있습니다. 하지만 처음 사용해본다면 그 장점이 잘 와닿지 않을 수도 있습니다. 왜 굳이 도커 컨테이너를
www.44bits.io
docker container run과 docker image pull
docker container run
위 명령어는 컨테이너를 실행하는 명령어로, 이미지가 로컬 컴퓨터에 없는 경우 도커 플랫폼은 자동으로 해당 이미지를 내려받는다.
더 정확하게 말하자면, 위 명령어가 실행되면 도커는 로컬 이미지 스토리지에서 해당 이미지를 검색한다. 이미지가 없는 경우 도커 허브나 사용자가 지정한 레지스트리에서 이미지를 내려받는다. 이후 해당 이미지를 기반으로 컨테이너를 실행한다.
이는 도커 플랫폼이 소프트웨어 배포 기능을 포함하고 있어서 가능한 일이다.
docker image pull // ex. docker image pull diamol/ch03-web-ping
위 명령어는 명시적으로 이미지를 내려받는 명령어이며, Docker Hub나 다른 Docker 레지스트리에서 이미지를 내려받는다. 특정 이미지의 특정 버전을 명시적으로 내려받을 수 있어, 이미지의 버전 관리에 유용하다.
레지스트리(registry)
이미지를 제공하는 저장소
이미지 레이어
도커 이미지는 물리적으로 여러 개의 작은 파일로 구성돼 있다.
도커가 해당 파일들을 조립해 컨테이너의 내부 파일 시스템을 만드는 것이다.
환경 변수
도커 컨테이너는 별도의 환경 변수를 가지는데, 기본 값은 도커가 호스트명이나 IP처럼 부여한다.
애플리케이션의 설정을 동적으로 구성하고, 동일한 이미지를 여러 환경에서 사용할 수 있도록 한다.
// 1. Dockerfile에서 ENV 명령어 사용
// : 해당 이미지를 기반으로 생성된 모든 컨테이너에서 사용할 수 있다.
ENV API_ENDPOINT https://api.example.com
// 2. docker run 명령어에서 -e 옵션 사용
// : 해당 컨테이너에서만 사용할 수 있다.
docker run -e "API_ENDPOINT=https://api.example.com" my_image
// 3. 환경 변수 파일(.env 파일) 사용
// : 여러 환경 변수를 한 번에 설정해야 할 경우 유용하다.
docker run --env-file ./.env my_image
설정된 환경 변수는 컨테이너 내부에서 $변수이름 형태로 참조할 수 있다.
민감한 정보를 관리할 경우, 그 정보를 Dockerfile, 소스 코드, 환경 변수 파일 등에 직접 기록하는 것은 좋지 않다. 이러한 경우 Docker Swarm으로 해결할 수 있다.
Dockerfile 작성
// web-ping 애플리케이션의 Dockerfile 스크립트
FROM diamol/node
ENV TARGET="blog.sixeyed.com"
ENV METHOD="HEAD"
ENV INTERVAL="3000"
WORKDIR /web-ping
COPY app.js .
CMD ["node", "/web-ping/app.js"]
From
해당 Docker 이미지는 diamol/node를 기본 이미지를 기반으로 한다.
diamol/node 이미지는 Node.js 애플리케이션을 실행할 수 있는 환경이 이미 설정되어 있는 이미지이다.
ENV
환경 변수 값을 지정한다.
WORKDIR
컨테이너 내부에서 작업 디렉토리를 /web-ping으로 설정한다.
COPY
app.js 파일을 현재 작업 디렉토리로 복사한다.
CMD
도커가 이미지로부터 컨테이너를 실행했을 때 실행할 명령을 지정한다.
각각을 인스트럭션이라고 한다.
컨테이너 이미지 빌드
// ex. docker image build --tag web-ping .
docker image build
--tag (이미지의 이름) (Dockerfile 및 이미지에 포함시킬 파일이 위치한 경로)
// 'w'로 시작하는 태그명을 가진 이미지 목록 출력
docker image ls 'w*'
도커 이미지와 이미지 레이어
도커 이미지의 구성
도커 이미지는 컨테이너의 파일 시스템을 형성할 파일 + 메타데이터 정보(ex. 이미지를 구성하는 각각의 레이어의 정보)로 구성돼 있다.
도커 이미지는 여러 개의 레이어로 구성되어 있으며, 각 레이어는 Dockerfile의 각 인스트럭션에 의해 생성된다.
// web-ping 이미지의 히스토리 출력
docker image history web-ping
이미지 레이어
이미지 레이어는 도커 엔진의 캐시에 물리적으로 저장된 파일이다. 또한, 여러 이미지와 컨테이너에서 공유된다.

이미지 레이어는 불변하며(읽기 전용), 새로운 것이 추가되거나 기존 레이어가 변경될 때마다 새로운 레이어가 생성된다. 이 구조는 Docker 이미지의 재사용성과 효율성을 높여준다. 즉, 레이어는 다른 이미지에서 재사용될 수 있다.
이미지 레이어의 캐시
Docker는 이미지를 빌드할 때 레이어를 캐시한다. 캐시된 레이어는 동일한 인스트럭션으로 다시 빌드할 때 재사용되어 빌드 시간을 줄여주며, 디스크 공간과 네트워크 대역폭을 절약한다.
이미지 레이어 캐시의 무효화
Dockerfile 스크립트의 인스트럭션은 각각 하나의 이미지 레이어와 1:1로 연결된다. 이미지 레이어 캐시는 순서에 민감하다. Dockerfile의 특정 인스트럭션에 의해 만들어진 레이어가 변경되면, 그 위의 모든 레이어는 재빌드되어야 한다.
이미지 레이어 캐시를 이용한 Dockerfile 스크립트 최적화
: 이미지 전송 시간, 디스크 용량, 네트워크 대역폭 절약
즉, Dockerfile은 잘 수정하지 않는 인스트럭션이 앞으로 오고 자주 수정되는 인스트럭션이 뒤에 오도록 배치돼야한다. 이렇게 하면 캐시에 저장된 이미지 레이어를 되도록 많이 재사용할 수 있다.
FROM diamol/node
CMD ["node", "/web-ping/app.js"] // 수정이 자주 일어나지 않음
ENV TARGET="blog.sixeyed.com" \ // 하나의 ENV 인스트럭션으로 여러 개의 환경 변수 정의
METHOD="HEAD" \
INTERVAL="3000"
WORKDIR /web-ping
COPY app.js .
app.js 파일을 수정하고 이미지를 빌드하면 마지막 단계를 제외하고 모든 레이어를 캐시에서 재사용한다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] 헬스 체크와 디펜던시 체크 (0) | 2023.07.18 |
---|---|
[Docker] 도커 컴포즈와 분산 애플리케이션 (0) | 2023.07.18 |
[Docker] 도커 볼륨과 마운트 (0) | 2023.07.18 |
[Docker] 도커 레지스트리와 도커 허브: 이미지 공유와 관리 (0) | 2023.07.18 |
[Docker] 멀티 스테이지와 애플리케이션 빌드 (0) | 2023.07.09 |