홈으로 돌아가기

초보자를 위한 Docker 사용법: 실습 가이드

이 포괄적인 Docker 튜토리얼은 초보자에게 Docker를 사용하여 애플리케이션을 컨테이너화하는 방법을 가르칩니다. 핵심 개념, 설치, 컨테이너 실행, Dockerfile로 사용자 정의 이미지 빌드, Docker Compose로 다중 컨테이너 애플리케이션 관리 등을 다룹니다.

초보자를 위한 Docker: 첫 번째 앱 컨테이너화
Advertisement 728x90

초보자를 위한 Docker: 실전 컨테이너화 가이드

수년간 "내 컴퓨터에서는 잘 되는데요"라는 말은 소프트웨어 개발의 골칫거리였습니다. 개발자, 시스템 관리자, IT 전문가로서 Docker를 처음 시작하는 방법을 이해하려는 분이라면 바로 이곳이 적합합니다. Docker는 컨테이너라는 격리된 환경에서 애플리케이션을 패키징하고 실행할 수 있는 강력하고 가벼운 솔루션을 제공하여 이 문제를 해결합니다. 이를 통해 노트북에서 클라우드까지 모든 환경에서 일관되게 작동하도록 보장합니다.

배울 내용

이 가이드를 마치면 Docker의 핵심 개념을 이해하고, 첫 번째 컨테이너를 실행하고, 커스텀 이미지를 빌드하며, Docker Compose를 사용해 멀티 컨테이너 애플리케이션을 관리할 수 있습니다. 자신의 애플리케이션을 컨테이너화하는 명확하고 반복 가능한 프로세스를 습득하여 개발 및 배포 워크플로우를 간소화할 수 있습니다.

Docker란 무엇이며 왜 중요한가?

Docker는 애플리케이션을 빌드, 배포, 실행하는 과정을 간소화하도록 설계된 오픈 플랫폼입니다. 이를 통해 애플리케이션을 인프라에서 분리하여 소프트웨어와 그 종속성을 하나의 휴대 가능한 단위로 취급할 수 있습니다.

Google AdInline article slot

Docker를 소프트웨어를 위한 컨테이너 시스템이라고 생각해보세요. 물리적 컨테이너가 어떤 화물이든 담아 배, 기차, 트럭으로 운반할 수 있듯이, Docker 컨테이너는 모든 애플리케이션과 그 종속성을 담아 Docker가 설치된 모든 시스템에서 일관되게 실행할 수 있습니다. 이러한 표준화 덕분에 Docker는 클라우드 네이티브 애플리케이션 관리의 사실상 표준이 되었으며, 공개 레지스트리인 Docker Hub는 1,400만 개 이상의 애플리케이션 이미지를 호스팅하고 매월 110억 회 이상의 이미지 풀을 제공합니다.

Docker 사용의 주요 이점

  • 이식성 및 일관성: 컨테이너는 Docker가 설치된 모든 머신(Linux, Windows, macOS)에서 실행되며 환경별 버그를 제거합니다.
  • 경량성 및 속도: 기존 가상 머신(VM)과 달리 컨테이너는 호스트 머신의 OS 커널을 공유하므로 크기가 훨씬 작고(메가바이트 대 기가바이트) 밀리초 단위로 시작할 수 있습니다.
  • 격리성 및 효율성: 컨테이너는 서로 및 호스트 시스템과 격리되어 보안을 강화하고 충돌 없이 여러 애플리케이션을 실행할 수 있습니다.
  • DevOps 및 CI/CD: 컨테이너는 현대 CI/CD 파이프라인의 핵심 요소로, 신속한 테스트와 배포를 가능하게 합니다.

핵심 개념 이해: 이미지와 컨테이너

본격적으로 시작하기 전에 이미지와 컨테이너의 관계를 이해하는 것이 중요합니다. 이 두 가지는 Docker에서 가장 기본적인 개념입니다.

  • Docker 이미지: 이미지는 소프트웨어 실행에 필요한 모든 것(코드, 런타임, 시스템 도구, 라이브러리, 설정)을 포함하는 경량의 독립 실행형 실행 가능 소프트웨어 패키지입니다. 스냅샷이나 청사진과 유사한 읽기 전용 템플릿입니다. 예를 들어 nginx:alpine은 NGINX 웹 서버의 사전 빌드된 이미지입니다.
  • Docker 컨테이너: 컨테이너는 이미지의 실행 가능한 인스턴스입니다. Docker API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동 또는 삭제할 수 있습니다. 시스템에서 "실행 중인" 이미지입니다.

Docker 첫걸음

1. Docker 설치

시작하려면 Docker를 설치해야 합니다. Windows나 macOS에서 가장 쉬운 방법은 공식 Docker 웹사이트에서 Docker Desktop을 다운로드하여 설치하는 것입니다. 여기에는 Docker Engine, CLI, Compose 등 필요한 모든 것이 포함됩니다. Linux 사용자는 배포판의 패키지 관리자를 사용해 Docker Engine을 설치할 수 있습니다.

Google AdInline article slot

설치가 완료되면 터미널 또는 명령 프롬프트를 열고 설치를 확인합니다:

docker --version

2. 첫 번째 컨테이너 실행

모든 것이 제대로 작동하는지 확인하기 위해 "Hello World" 컨테이너를 실행해 보겠습니다. 이는 Docker를 처음 시작하는 방법을 이해하기 위한 전통적인 첫 단계입니다.

docker run hello-world

이 명령은 여러 작업을 수행합니다: hello-world 이미지가 로컬에 있는지 확인하고, 없으면 Docker Hub에서 다운로드한 후 해당 이미지로 컨테이너를 생성하고 실행합니다. 컨테이너는 환영 메시지를 출력하고 종료됩니다. 로컬 확인, 레지스트리에서 풀, 실행으로 이어지는 이 흐름이 Docker 작업의 핵심입니다.

Google AdInline article slot

3. 실제 웹 서버 실행

이제 실제 웹 서버인 NGINX를 백그라운드에서 실행하여 더 흥미로운 작업을 해보겠습니다. 이 명령은 세 가지 필수 플래그를 소개합니다:

docker run -d -p 8080:80 --name mywebserver nginx
  • -d (Detached): 컨테이너를 백그라운드에서 실행합니다.
  • -p 8080:80 (Publish): 호스트 머신의 포트 8080을 컨테이너 내부의 포트 80에 매핑합니다. 이제 http://localhost:8080에서 웹 서버에 접속할 수 있습니다.
  • --name mywebserver: 컨테이너에 임의의 ID 대신 친숙한 이름을 부여합니다.

이제 브라우저에서 http://localhost:8080을 열어보세요. NGINX 환영 페이지가 보일 것입니다! 이는 실제 웹 서버가 컨테이너에 격리되어 실행 중이며 머신에서 접근 가능함을 증명합니다.

나만의 Docker 이미지 빌드하기

사전 제작된 이미지를 실행하는 것도 유용하지만, Docker의 진정한 힘은 자신의 애플리케이션을 패키징하는 데 있습니다. 이를 위해 Dockerfile을 사용합니다.

Dockerfile이란?

Dockerfile은 Docker 이미지를 빌드하는 방법에 대한 일련의 지침이나 명령이 포함된 간단한 텍스트 파일입니다. 애플리케이션을 위한 휴대 가능하고 자체 포함된 환경을 만드는 레시피 역할을 합니다.

간단한 Node.js 애플리케이션 만들기

Node.js 애플리케이션을 컨테이너화하는 간단한 Dockerfile을 만들어 보겠습니다. 이는 많은 프로젝트에 적용할 수 있는 실용적인 템플릿이 될 것입니다.

  1. 프로젝트 폴더 생성:
    mkdir my-node-app && cd my-node-app
  2. 간단한 앱 생성: app.js 파일을 만듭니다.
    const http = require('http');
    
    const server = http.createServer((req, res) => {
      res.writeHead(200, { 'Content-Type': 'text/plain' });
      res.end('Hello, World! My app is running in a container!\n');
    });
    
    server.listen(3000, () => {
      console.log('Server running at http://localhost:3000/');
    });
  3. package.json 생성: 앱의 종속성을 선언하는 package.json 파일을 만듭니다.
    {
      "name": "my-node-app",
      "version": "1.0.0",
      "main": "app.js"
    }

Dockerfile 작성하기

이제 같은 디렉토리에 확장자 없는 Dockerfile 파일을 만들고 다음 내용을 작성합니다:

FROM node:18-alpine
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]

각 명령어를 설명하겠습니다:

  • FROM node:18-alpine: 베이스 이미지에서 빌드를 초기화합니다. Alpine Linux 기반의 공식 Node.js 버전 18 이미지를 사용합니다. Alpine Linux는 매우 작은 Linux 배포판으로 이미지를 더 가볍게 만듭니다.
  • WORKDIR /app: 이후의 RUN, CMD, COPY, ADD 명령어에 대한 작업 디렉토리를 설정합니다. 디렉토리가 없으면 생성됩니다.
  • COPY package.json ./: 로컬 디렉토리의 package.json 파일을 이미지 내 현재 작업 디렉토리로 복사합니다.
  • RUN npm install: 컨테이너 내에서 npm install 명령을 실행하여 package.json에 정의된 모든 종속성을 설치합니다.
  • COPY . .: 나머지 애플리케이션 소스 코드를 로컬 디렉토리에서 이미지 내 작업 디렉토리로 복사합니다.
  • EXPOSE 3000: Docker에 컨테이너가 런타임에 포트 3000에서 수신 대기함을 알립니다.
  • CMD ["node", "app.js"]: 이 이미지에서 컨테이너가 시작될 때 실행할 명령을 지정합니다.

이미지 빌드 및 실행하기

  1. 이미지 빌드: 터미널에서 docker build 명령을 실행합니다:

    docker build -t my-node-app:1.0 .
    • -t my-node-app:1.0: 이미지에 이름과 버전을 태그합니다.
    • .: Docker에게 현재 디렉토리에서 Dockerfile을 찾도록 지시합니다.
  2. 컨테이너 실행: 이제 새로 만든 이미지를 실행하고 호스트 포트를 컨테이너 포트에 매핑합니다:

    docker run -d -p 3000:3000 --name my-running-app my-node-app:1.0

브라우저에서 http://localhost:3000으로 이동하면 "Hello, World!" 메시지가 표시됩니다. 축하합니다! 나만의 커스텀 Docker 이미지를 성공적으로 빌드하고 실행했습니다!

Docker Compose로 멀티 컨테이너 앱 관리하기

현대 애플리케이션은 단일 서비스로 구성되는 경우가 드물며, 종종 웹 프론트엔드, 데이터베이스, 캐시 등을 포함합니다. 여러 docker run 명령으로 이를 관리하는 것은 번거로울 수 있습니다. Docker Composecompose.yaml(또는 docker-compose.yml) 파일 하나로 멀티 컨테이너 애플리케이션을 정의하고 실행할 수 있는 도구입니다.

예제: Redis를 사용한 웹 앱

다음은 웹 서비스와 Redis 캐시 서비스를 정의하는 compose.yaml 파일 예제입니다:

services:
  web:
    image: nginx:alpine
    ports:
      - "8082:80"
  cache:
    image: redis:alpine

이 파일은 두 가지 서비스를 정의합니다:

  • web: 공식 nginx:alpine 이미지를 사용하며 호스트의 포트 8082를 컨테이너 내부 포트 80에 매핑합니다.
  • cache: 공식 redis:alpine 이미지를 사용합니다.

두 서비스를 실행하려면 다음 명령어를 사용하면 됩니다:

docker compose up -d
docker compose ps

이렇게 하면 두 컨테이너가 전용 네트워크에서 함께 시작되어 서로 통신할 수 있습니다. docker compose down으로 모든 것을 중지하고 제거할 수 있습니다.

자주 묻는 질문

Docker 컨테이너와 가상 머신(VM)의 주요 차이점은 무엇인가요?

핵심 차이는 리소스 사용입니다. 컨테이너는 호스트 OS 커널을 공유하므로 가볍고 밀리초 단위로 시작되며 최소한의 리소스를 사용합니다. VM은 각 인스턴스에 전체 게스트 OS가 필요하므로 크기가 더 크고(GB 단위), 시작 속도가 느리며, 더 많은 리소스를 소비합니다.

Docker 컨테이너에서 생성된 데이터를 어떻게 유지하나요?

컨테이너는 기본적으로 상태 비저장입니다. 컨테이너를 삭제하면 내부에 저장된 모든 데이터가 손실됩니다. 데이터를 유지하려면 Docker 볼륨을 사용할 수 있습니다. 볼륨은 호스트 머신의 특수 디렉토리로 컨테이너에 마운트되어 데이터가 컨테이너 재시작 및 제거 후에도 유지되도록 보장합니다.

Docker 컨테이너에 구성 설정을 어떻게 전달하나요?

환경 변수를 사용하여 데이터베이스 URL이나 API 키와 같은 구성 설정을 런타임에 컨테이너에 전달할 수 있습니다. docker run 명령에 -e 플래그를 사용하거나(예: docker run -e MY_VAR=value my-image), docker-compose.yml 파일에 정의할 수 있습니다.

Docker Hub란 무엇인가요?

Docker Hub는 컨테이너 이미지를 찾고 공유할 수 있는 클라우드 기반 레지스트리 서비스입니다. 수백만 개의 공식 및 커뮤니티 생성 이미지를 호스팅합니다. 로컬 머신에서 실행할 이미지를 풀하거나, 자신의 커스텀 이미지를 푸시하여 다른 사람과 공유하거나 프로덕션에 배포할 수 있습니다.

Dockerfile이란 무엇인가요?

Dockerfile은 Docker 이미지를 빌드하는 방법에 대한 지침이 포함된 텍스트 파일입니다. 베이스 이미지를 정의하고, 환경을 설정하며, 애플리케이션 코드를 복사하고, 종속성을 설치하며, 애플리케이션 실행 방법을 지정하는 "레시피"입니다.

출처

  1. Docker Docs. "Introduction."
  2. Docker Docs. "Overview of the Docker workshop."
  3. Docker Docs. "What is Docker?"
  4. Docker Setup for DevOps Beginners (GitHub)
  5. KodeKloud. "Docker Tutorial for Beginners in 2026: First Steps."
  6. Microsoft Learn. "When to use Docker containers."
  7. freeCodeCamp. "How to Containerize a Node.js Application Using Docker."
  8. Docker Docs. "Get started."
  9. Communications of the ACM. "A Decade of Docker Containers."
  10. Flatcar. "Getting started with Docker."
  11. Manning Publications. "Learn Docker in a Month of Lunches."

— Editorial Team

Advertisement 728x90

다음 읽기