프로그래밍/Docker

Docker - 이미지 생성

Cian 2024. 5. 25. 20:36

도커 이미지

도커 컨테이너를 생성하는데 사용되는 파일 시스템의 스냅샷다. 여러 개의 레이어로 구성되어 있으며, 각 레이어는 컨테이너 파일 시스템의 특정 상태를 나타낸다. 이 레이어들은 읽기 전용이며 변하지 않는다는 특징이 있다. 쉽게 말해, 도커 이미지는 마치 애플리케이션을 만들기 위한 설계도와 같다. 이 설계도에는 애플리케이션을 구성하는 레이어와 설정이 모두 기록되어 있다고 이해하면 좋다. 이렇게 이미지를 한 번 만들어 놓으면, 필요할 때마다 빠르고 쉽게 컨테이너로 만들어서 실행할 수 있으며, 이미지를 공유하거나 백업하여 여러 곳에서 사용할 수 있다.

 

 

▶ 순서

이미지를 만드는 과정은 다음과 같은 단계로 이루어진다.

 

 1. 도커 파일 작성: 도커 파일은 이미지를 만들기 위한 명령어들이 기록된 텍스트 파일이다. 이 파일은 애플리케이션을 실행하기 위해 필요한 환경을 정의한다. 주요 명령어로는 FROM, RUN, COPY, CMD, EXPOSE, WORKDIR 등이 있다.

 2. 도커 파일 빌드: 작성한 Dockerfile을 사용하여 도커 이미지를 빌드다. 이 과정에서 Docker 엔진은 Dockerfile에 작성된 명령어들을 순차적으로 실행하여 이미지를 생성합니다. (docker build -t 이미지이름:태그 경로)

 3. 이미지 태깅: 만들어진 이미지를 구분하고 식별하기 위해 태그를 붙여준다. 기본적으로 latest 태그가 붙지만, 사용자가 원하는 다른 태그를 지정할 수도 있다.

 4. 이미지 공유 또는 저장: 생성된 이미지를 Docker Hub와 같은 이미지 레지스트리에 업로드하여 공유할 수도 있고, 로컬 환경에 저장할 수도 있다.

 

 

▶ 적용

 

Step 1. Dockerfile 작성

# 1.
FROM node:22-alpine

# 2.
WORKDIR /app

# 3.
COPY package.json package-lock.json ./

# 4.
COPY src ./

# 5.
RUN npm ci

# 6.
EXPOSE 7777

# 7.
ENTRYPOINT ["node", "server.js"]

 1. Base Image

Node.js 22 버전의 경량 Alpine 리눅스 이미지를 기반으로 한다. Alpine 이미지는 크기가 작고 보안성이 높아서 컨테이너 이미지를 작게 유지하는 데 유리하다.

 

 2. Working Directory

작업 디렉토리를 /app으로 설정한다는 뜻이다. 이후의 모든 명령어는 이 디렉토리를 기준으로 실행된다. 만약 해당 디렉토리가 존재하지 않으면, 도커가 자동으로 생성한다. (자동 생성 디렉토리명도 '/app')

 

 3. Copy Dependency Files

현재 디렉토리의 package.jsonpackage-lock.json 파일을 컨테이너의 작업 디렉토리 (/app)로 복사합니다. 이 파일들은 Node.js 프로젝트의 의존성을 정의한다.

 

 4. Copy Application Source

현재 디렉토리의 src 폴더를 컨테이너의 작업 디렉토리 (/app)로 복사한다. 여기서 src 폴더는 애플리케이션의 소스 코드를 포함하고 있다.

 

 5. Install Dependencies

의존성을 설치합니다. npm cinpm install과 비슷하지만, CI/CD 환경(소프트웨어 개발 및 배포 프로세스를 자동화하고 개선하기 위한 방법론)에 최적화되어 있으며, 정확한 버전의 패키지를 설치하여 일관된 빌드를 보장한다. package-lock.json 파일을 기반으로 의존성을 설치한다.

 

 6. Expose Port

컨테이너가 내부적으로 사용하는 포트 7777을 외부에 노출한다. 이 포트를 통해 외부에서 애플리케이션에 접근할 수 있다.

 

 7. Entry Point

컨테이너가 시작될 때 실행할 기본 명령을 설정한다. 여기서는 node server.js 명령어를 실행하여 server.js 파일을 Node.js로 실행한다. ENTRYPOINT는 컨테이너가 실행될 때 항상 실행되는 명령어를 지정한다.

 

 

Step 2. Dockerfile 이미지 빌드

docker build -t {원하는 이미지명 작성(중괄호 없이)} .

실행을 해보니 이런 문구를 받았는데, 첫 번째는 도커 계정에 로그인하지 않아 서비스의 원활한 사용을 위한 로그인할 것을 안내하는 것이었고, 두 번째는 Docker Scout를 이용해서 이미지의 보안 취약점과 권장 사항을 확인해보라는 메시지였다. 해서 docker scout quickview를 사용해보니, 새 버전이 출시되어 있으니 최신 버전 사용을 권장하고, 인덱싱된 패키지를 알려주었다.

 

빌드를 하고 나면 docker desktop에서 이미지가 생성된 것을 볼 수 있다. (노란색 표시는 모자이크)