100===Dev Ops/Docker

Docker 소개

블로글러 2024. 5. 28. 12:12

오늘은 컨테이너 가상화 기술의 대표주자라 할 수 있는 Docker에 대해 알아보겠습니다!
‘도커’라는 단어를 요즘 IT 업계에서 자주 듣게 되는데, 도대체 무엇이고 왜 이렇게 많이 쓰이는 걸까요?
아래 내용을 통해 차근차근 살펴보며 Docker를 제대로 이해해봅시다.


1. Docker란? 🤔

Docker는 애플리케이션을 컨테이너라는 가상화된 환경에서 실행할 수 있게 해주는 플랫폼입니다.
쉽게 말해, “어떤 프로그램이든, OS 환경이든, 일관된 실행 환경을 묶어 포장(Package)해 어디서나 가볍게 실행”할 수 있도록 만들어 준다고 볼 수 있습니다.

  • 🔹 개념 요약:
    Docker를 이용하면 하나의 애플리케이션 및 그 애플리케이션이 필요한 라이브러리, 설정 등을 “이미지(Image)”라고 하는 형태로 묶어서 배포하고 실행할 수 있습니다. 그 이미지를 실행한 상태를 “컨테이너(Container)”라 부릅니다.

  • 🔹 실생활 예시:
    예를 들어, 어떤 음식을 만들기 위해 여러 재료와 조리기구, 레시피가 필요한데, 매번 모든 재료를 따로 구해서 요리하려면 환경 세팅이 매우 번거롭습니다. 대신 ‘밀키트’처럼 필요한 모든 것이 단일 패키지에 포함되어 있다면, 어디서든 쉽게 요리할 수 있습니다. Docker의 컨테이너가 바로 이런 ‘밀키트’와 같은 역할을 합니다.

  • 🔹 어떤 문제를 해결하는가?
    과거에는 개발 환경과 운영 환경이 달라서, “내 로컬에서는 잘 동작하는데 서버에서는 안 돼요!”라는 문제가 자주 발생했습니다. Docker를 이용하면 개발 환경과 운영 환경을 동일하게 유지할 수 있어 이러한 문제를 크게 줄여줍니다.


2. 어떻게 동작하나요? 🎬

1) 기본 개념

Docker의 핵심은 ‘컨테이너’입니다. 컨테이너는 애플리케이션이 동작하는 데 필요한 라이브러리와 설정파일 등을 포함하여, 운영 체제 위에서 격리된 공간을 형성합니다.
이전의 전통적인 가상 머신(VM)과 달리, Docker 컨테이너는 전체 운영체제를 가상화하지 않고 호스트 OS 커널을 공유하므로 훨씬 가볍고 빠르게 실행됩니다.

# Docker 설치 확인
docker --version

# Docker 이미지 목록 확인
docker images

# Docker 컨테이너 목록 확인
docker ps -a

2) 실제 적용 예시

예를 들어, 웹 애플리케이션을 개발한다고 가정해보겠습니다. 다음과 같은 단계를 거쳐 Docker를 활용할 수 있습니다:

  1. Dockerfile 작성:
    애플리케이션을 빌드하는 데 필요한 의존성(예: Node.js, Python, 라이브러리 등)과 빌드 명령어를 정의합니다.
  2. Docker 이미지 빌드:
    작성한 Dockerfile을 이용해 이미지를 생성합니다.
    # 현재 디렉토리의 Dockerfile 기반으로 my-web-app 이라는 이름의 이미지 빌드
    docker build -t my-web-app .
  3. 컨테이너 실행:
    만들어진 이미지를 컨테이너로 실행해봅니다.
    docker run -d -p 8080:80 --name web-app-container my-web-app
    • -d: 백그라운드(detached) 모드로 실행
    • -p 8080:80: 호스트의 8080 포트를 컨테이너의 80 포트와 매핑
    • --name web-app-container: 컨테이너 이름 지정

3) 동작 원리

  1. 이미지(Image) 빌드:
    Dockerfile을 이용해 레이어(Layer) 방식으로 이미지를 생성합니다. 각 명령어가 하나의 레이어로 추가되며, 변경 사항이 있으면 해당 레이어만 다시 빌드하기 때문에 빌드 시간이 효율적입니다.
  2. 컨테이너(Container) 실행:
    만들어진 이미지를 바탕으로 컨테이너가 실행됩니다. 컨테이너는 호스트 OS 커널을 공유하므로, 기존의 가상 머신과 달리 추가 OS가 필요하지 않습니다.
  3. 격리(Namespaces)와 자원할당(Cgroups):
    • Namespaces: 컨테이너별로 프로세스, 네트워크, 파일시스템 등을 분리해 격리합니다.
    • Cgroups: 각 컨테이너에 CPU, 메모리 등의 사용량을 제한하여 자원을 효율적으로 관리합니다.

3. 주요 장점 🌟

  1. 가벼움 & 빠른 실행 속도:
    가상 머신과 달리 OS 전체를 포함하지 않으므로 실행 속도가 빠르고, 메모리 사용량도 적습니다.

  2. 이식성(Portability):
    이미지로 패키징된 애플리케이션은 어디서든 같은 환경으로 실행 가능합니다. (로컬, 서버, 클라우드 등)

  3. 개발 효율성:
    환경 설정 및 배포 과정을 단순화하여, “환경 구성”보다는 “개발”에 집중할 수 있습니다.

  4. 버전 관리 & 롤백:
    Docker 이미지를 레지스트리에 버전별로 저장할 수 있어, 필요하면 이전 버전으로 손쉽게 롤백이 가능합니다.


4. 주의할 점 ⚠️

  1. 데이터 영속성(Persistence) 문제:
    컨테이너는 휘발성 특성이 있어 컨테이너가 삭제되면 내부 데이터도 사라집니다. 중요한 데이터는 반드시 볼륨(Volume) 또는 바인드 마운트를 통해 별도 보관해야 합니다.

  2. 보안 이슈:
    여러 컨테이너가 호스트 OS 커널을 공유하기 때문에, 취약점이 발견될 경우 VM 방식보다 영향을 크게 받을 수 있습니다. 보안 패치 적용과 권한 설정에 신경 써야 합니다.

  3. 이미지 용량 관리:
    불필요한 라이브러리를 많이 포함하면 이미지가 커집니다. Dockerfile 작성 시, 멀티 스테이지 빌드(Multi-stage build) 등을 통해 이미지 크기를 최소화해야 합니다.

  4. Host-OS 종속성:
    Docker는 리눅스 커널 기반이므로 윈도우, 맥 등에서 실행 시 추가적인 호환 계층 또는 Docker Desktop이 필요합니다.


5. 실제 사용 예시 📱

다음은 Node.js 애플리케이션을 Docker로 컨테이너화하여 실행하는 간단한 예시입니다.

예시 Node.js 애플리케이션 구조

my-node-app/
 ┣ server.js
 ┣ package.json
 ┗ Dockerfile

server.js:

const http = require('http');

const PORT = 3000;
const server = http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello from Dockerized Node.js App!');
});

server.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

package.json:

{
  "name": "my-node-app",
  "version": "1.0.0",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "http": "latest"
  }
}

Dockerfile:

# 1. 베이스 이미지 설정 (Node 14 버전 사용 예시)
FROM node:14

# 2. 작업 디렉토리 설정
WORKDIR /app

# 3. package.json과 package-lock.json을 복사하고 의존성 설치
COPY package*.json ./
RUN npm install

# 4. 애플리케이션 소스 복사
COPY . .

# 5. 앱이 실행될 포트 설정
EXPOSE 3000

# 6. 컨테이너 실행 시 Node.js 앱 시작
CMD ["npm", "start"]

빌드 및 실행

# 이미지 빌드
docker build -t my-node-app .

# 컨테이너 실행
docker run -d -p 3000:3000 --name node-container my-node-app

이제 브라우저에서 http://localhost:3000을 접속하면 "Hello from Dockerized Node.js App!" 메시지를 확인할 수 있습니다.


6. 마치며 🎁

지금까지 Docker의 핵심 개념부터 동작 원리, 실제 예시까지 살펴보았습니다.
Docker를 잘 활용하면 환경 설정으로 인한 불필요한 시간 낭비를 줄이고, 애플리케이션을 배포하고 운영하는 과정을 훨씬 효율적으로 만들 수 있습니다.
특히, 마이크로서비스 아키텍처나 CI/CD 파이프라인에서 Docker는 필수적으로 자리 잡고 있습니다.
Docker를 제대로 이해하고 사용한다면, 애플리케이션 배포와 운영의 많은 부분을 자동화·효율화하여 생산성을 대폭 높일 수 있을 것입니다!


참고 자료 및 출처

이상으로 Docker 완벽 가이드를 마칩니다!
여러분의 프로젝트에 Docker를 도입해 배포 자동화, 일관된 실행 환경, 마이크로서비스 구축 등의 다양한 장점을 경험해 보세요.

728x90