개요
이 포스팅에서는 먼저 Docker의 설치 방법을 소개한 후, 컨테이너 환경을 정의하는 데 사용되는 Dockerfile의 주요 구성 요소에 대해 자세히 설명합니다.
Docker
Docker는 리눅스 컨테이너 기반의 가상화 기술을 제공하는 오픈 소스 플랫폼입니다. 가상화 기술이란 하드웨어 리소스를 논리적으로 분할하여 하나의 시스템에서 여러 가상 환경을 생성하는 것을 말합니다.
Docker 역할
컨테이너 기반 가상화 및 환경 표준화
애플리케이션과 필요한 실행 환경(라이브러리, 설정 파일 등)을 하나의 컨테이너로 패키징합니다. 이로 인해 개발, 배포, 실행 과정이 단순화되고 효율성이 향상됩니다.
호스트 OS 위에서 격리된 환경으로 동작하여 일관된 개발/실행 환경을 제공하여 모든 개발자가 동일한 컨테이너 이미지를 사용하므로, 환경 차이로 인한 문제를 방지할 수 있습니다.
경량화와 유연성
컨테이너는 가볍고 빠르게 실행되며, 리소스를 적게 사용합니다. 또한, 마이크로서비스 아키텍처에서 필요한 서비스만 개별적으로 배포하거나 확장할 수 있어 유연성이 높습니다.
버전 관리 및 이미지 공유
애플리케이션을 이미지로 저장하여 버전 관리가 가능하며, Docker Hub와 같은 레지스트리를 통해 이미지를 쉽게 공유하거나 배포할 수 있습니다.
CI/CD 파이프라인 통합
Jenkins, GitHub Actions 등의 도구와 연동하여 자동화된 테스트, 빌드, 배포가 가능하므로 DevOps 환경에 적합합니다.
Docker Architecture

구성 요소 | 설명 |
Docker Client | 사용자가 Docker와 상호작용할 수 있도록 CLI 또는 API를 제공하는 구성 요소입니다. 터미널에서 build, run, pull 등 명령어를 실행하여 Docker 데몬에 요청을 전달합니다. |
Docker Host | Docker가 설치되어 컨테이너가 실행되는 물리적 또는 가상 머신입니다. Docker Daemon이 실행되며, 컨테이너 및 이미지를 관리합니다. |
Docker Daemon | Docker의 핵심 엔진으로, 컨테이너와 이미지를 실제로 생성, 실행, 삭제하는 역할을 합니다. Docker Client의 요청을 받아 처리합니다. |
Docker Image | 컨테이너를 생성하기 위한 템플릿입니다. 애플리케이션 실행에 필요한 라이브러리, 설정 파일 등을 포함하며, 하나의 이미지를 바탕으로 여러 컨테이너를 만들 수 있습니다. |
Docker Container | Docker 이미지의 인스턴스로, 실제로 실행 중인 애플리케이션 환경입니다. 호스트 자원을 공유하면서도 다른 컨테이너와는 격리되어 독립적으로 동작합니다 |
Registry | Docker 이미지를 저장하고 관리하는 저장소입니다. 대표적인 Registry는 Docker Hub로, 이미지 업로드 및 다운로드를 통해 다른 사용자와 이미지를 공유할 수 있습니다. |
Docker 설치
Docekr 홈페이지에 접속해서 'Get Docker’를 클릭해서 다운로드합니다.

설치 후 docker --version 으로 정상 설치되었는지 확인합니다.
docker -v
Docker 설정
.dockerignore
이미지 빌드시 제외할 파일/디렉토리 지정 (e.g. node_modules, .git, *.log)하는 파일입니다. Dockerfile과 같은 위치에 .dockerignore 생성합니다.
Dockerfile
Dockerfile은 사용자가 명령 줄에서 호출하여 이미지를 조립할 수있는 모든 명령을 포함하는 텍스트 문서입니다. Docker는 Dockerfile의 지침을 읽음으로써 이미지를 자동으로 조립할 수 있습니다. Dockerfile 조립과정을 통해 최종 도커이미지가 생성됩니다.
여러 개의 레이어로 구성되어 기본 이미지, 작업 디렉토리, 소스 코드 복사, 의존성 설치 등 컨테이너 내부 환경을 정의를 할 수 있습니다.
FROM alpine
ARG FOO=bar
COPY <<-"EOT" /script.sh
echo "hello ${FOO}"
EOT
ENTRYPOINT ash /script.sh
Dockerfile은 다음과 같은 지침을 지원합니다.
명령어 | 설명 |
ADD | 로컬 파일이나 디렉토리, 또는 원격 파일을 컨테이너에 추가. |
ARG | 빌드 타임 변수를 사용. |
CMD | 기본적으로 실행할 명령어를 지정. |
COPY | 파일과 디렉토리를 복사. |
ENTRYPOINT | 기본 실행 가능한 프로그램을 지정. |
ENV | 환경 변수를 설정. |
EXPOSE | 애플리케이션이 수신할 포트를 설명. |
FROM | 기본 이미지를 바탕으로 새로운 빌드 단계를 생성. |
HEALTHCHECK | 컨테이너의 건강 상태를 시작 시 확인. |
LABEL | 이미지에 메타데이터를 추가. |
MAINTAINER | 이미지의 작성자 정보를 지정. (이 명령어는 구식으로, 대신 LABEL로 작성자가 명시됨.) |
ONBUILD | 이 이미지가 다른 이미지에서 빌드될 때 실행될 명령어를 지정. |
RUN | 빌드 명령어를 실행. |
SHELL | 이미지의 기본 셸을 설정. |
STOPSIGNAL | 컨테이너 종료 시 사용할 시스템 호출 신호를 지정. |
USER | 컨테이너에서 사용할 사용자와 그룹 ID를 설정. |
VOLUME | 데이터 볼륨을 생성하여 외부와 연결. |
WORKDIR | 컨테이너 내에서 작업 디렉토리를 변경. |
Dockerfile을 통한 개발 환경 구성하기
베이스 이미지 선택 (FROM)
베이스 이미지(Base Image)는 Docker 이미지를 생성할 때 사용되는 기본 이미지입니다. FROM 명령어를 통해 베이스 이미지를 지정하고, 이를 바탕으로 이미지를 커스터마이즈할 수 있습니다. 보통 공식적으로 제공되는 운영 체제나 프레임워크 이미지(예: Ubuntu, Node, Python 등)를 사용합니다.
FROM node:20.04
작업 디렉토리 설정 (WORKDIR)
WORKDIR 명령어는 컨테이너 내에서 작업할 디렉토리를 설정합니다. 이 명령어는 컨테이너의 기본 경로를 설정하며, 이후 모든 명령어는 이 디렉토리에서 실행됩니다. 소스 코드와 의존성 파일(node_modules) 등을 복사할 위치를 지정합니다.
WORKDIR /app
파일 복사 (COPY / ADD)
호스트 시스템에서 파일이나 디렉토리를 이미지 내의 특정 경로로 복사합니다. COPY는 단순히 파일을 복사하는 데 사용되며, ADD는 복사 외에도 압축 파일을 자동으로 풀거나 네트워크에서 파일을 다운로드할 때 사용됩니다. 일반적으로 파일 복사에는 COPY를 사용하는 것이 권장됩니다.
// COPY [현재 로컬에서 가져갈 파일] [컨테이너로 옮길 경로]
COPY . /app
// ADD [현재 로컬에서 가져갈 파일] [컨테이너로 옮길 경로]
ADD myapp.tar.gz /app
효율적인 빌드를 위해 필요한 파일만 먼저 복사하고, 의존성 설치 후 나머지 파일을 복사하는 방식이 좋습니다.
// 비효율적 COPY 방법
COPY ./ ./
RUN npm install
/ 효율적 COPY 방법
COPY package.json ./
RUN npm install
COPY ./ ./
의존성 설치 (RUN)
RUN은 컨테이너 내에서 의존성 설치 및 시스템 설정을 할 때 사용되는 명령어입니다. 컨테이너에서 사용할 의존성 패키지를 설치하는 단계에서 사용합니다. 주로 패키지 관리자를 사용하여 필요한 소프트웨어를 설치하거나 라이브러리를 다운로드하여 이미지를 설정합니다.
RUN npm install
환경 변수 설정 (ENV)
ENV 명령어를 사용하여 컨테이너 내에서 사용할 환경 변수를 설정할 수 있습니다. 환경 변수는 애플리케이션의 실행 환경을 정의하고, 다른 설정 값들을 외부에서 관리할 수 있게 해줍니다.
ENV NODE_ENV=production
포트 노출 (EXPOSE)
EXPOSE 명령어는 컨테이너가 외부와 통신할 수 있도록 포트를 노출하는 역할을 합니다. 컨테이너가 사용할 포트를 기술적으로 알려주어 외부에서 컨테이너의 서비스에 접근할 수 있게 합니다.
EXPOSE 8080
컨테이너에서 여러 서비스를 실행하고 있다면, 여러 포트를 동시에 노출할 수 있습니다.
EXPOSE 80 443
실행 명령어 지정 (CMD | ENTRYPOINT)
컨테이너가 시작될 때 실행될 명령어를 지정합니다. CMD와 ENTRYPOINT를 사용하여 이를 설정할 수 있습니다. CMD는 컨테이너가 시작될 때 실행할 기본 명령어를 설정합니다. 다른 명령어를 실행할 경우 덮어쓸 수 있습니다.
CMD ["python3", "app.py"]
ENTRYPOINT는 컨테이너가 시작될 때 항상 실행되어야 하는 명령어를 설정합니다. ENTRYPOINT로 지정한 명령어는 컨테이너 실행 시 반드시 실행됩니다.
ENTRYPOINT ["<커맨드>", "<파라미터1>", "<파라미터2>"]
ENTRYPOINT <전체 커맨드>
종료 코드 설정 (STOPSIGNAL)
STOPSIGNAL 명령어는 컨테이너가 종료될 때 사용할 종료 신호를 설정합니다. 이는 컨테이너가 종료될 때 어떤 신호를 보낼지 지정하는데 사용됩니다.
STOPSIGNAL SIGTERM
사용자 설정 (USER)
USER 명령어는 컨테이너 내에서 실행될 명령어의 사용자를 설정합니다. 기본적으로는 root 권한으로 실행되지만, 보안을 위해 특정 사용자로 설정할 수 있습니다.
USER node
메타데이터 추가 (LABEL)
LABEL 명령어는 이미지에 메타데이터를 추가하는 데 사용됩니다. 이를 통해 이미지에 대한 정보를 보다 쉽게 관리하고, Docker 이미지가 제공하는 기능을 문서화할 수 있습니다.
LABEL version="1.0"
LABEL description="This is a Node.js application image."
LABEL maintainer="youremail@example.com"
'Docker' 카테고리의 다른 글
Node.js Docker image (1) | 2025.04.11 |
---|---|
Docker 명령어 정리 (0) | 2025.04.11 |
Docker Container, Host 파일시스템 (0) | 2025.04.11 |
WSL에서 개발 환경 구축하기 | Node.js, Git, VSCode (1) | 2024.09.26 |
WSL을 사용하여 Windows에 Linux를 설치하기 (5) | 2024.08.30 |