내부 호스트에 Docker 컨테이너 배포 가이드

DockerBeginner
지금 연습하기

소개

이 포괄적인 튜토리얼은 내부 호스트에서 Docker 컨테이너를 배포하는 과정을 안내합니다. Docker 에 처음 접하는 사용자이든 경험이 풍부한 사용자이든, Docker 를 설치하고 컨테이너를 생성 및 구성하며 조직의 인프라 내에서 효과적으로 관리하는 방법을 배울 것입니다. 이 가이드를 마치면 호스트 Docker 내부의 애플리케이션 배포 및 관리를 간소화하기 위해 Docker 의 기능을 활용할 수 있는 지식과 기술을 갖추게 될 것입니다.

Docker 컨테이너 이해

Docker 는 컨테이너를 사용하여 애플리케이션을 개발, 배포 및 관리하는 인기 있는 오픈소스 플랫폼입니다. 컨테이너는 애플리케이션 실행에 필요한 모든 종속성, 라이브러리 및 구성을 포함하는 경량의 독립 실행형 실행 가능 소프트웨어 패키지입니다.

Docker 컨테이너란 무엇인가요?

Docker 컨테이너는 애플리케이션과 모든 종속성을 하나의 휴대 가능한 단위로 패키징하여 Docker 가 설치된 모든 시스템에서 쉽게 배포 및 실행할 수 있도록 하는 방법입니다. 컨테이너는 기본 인프라에 관계없이 애플리케이션이 동일한 방식으로 동작하도록 보장하는 일관되고 안정적인 애플리케이션 실행 환경을 제공합니다.

Docker 컨테이너의 장점

  1. 이식성: Docker 컨테이너는 개발, 테스트 및 프로덕션과 같은 서로 다른 환경 간에 호환성 문제 없이 쉽게 이동할 수 있습니다.
  2. 확장성: Docker 컨테이너는 애플리케이션의 리소스 요구 사항에 따라 쉽게 확장 또는 축소할 수 있으므로 수요 변동을 더욱 쉽게 처리할 수 있습니다.
  3. 효율성: Docker 컨테이너는 기존 가상 머신보다 경량적이고 효율적입니다. 호스트 운영 체제를 공유하고 애플리케이션 실행에 필요한 구성 요소만 포함하기 때문입니다.
  4. 일관성: Docker 컨테이너는 서로 다른 환경에서 애플리케이션이 동일한 방식으로 실행되도록 보장하여 예기치 않은 동작이나 오류의 위험을 줄입니다.

Docker 컨테이너 아키텍처

graph TD A[Docker 호스트] --> B[Docker 엔진] B --> C[Docker 이미지] B --> D[Docker 컨테이너] D --> E[애플리케이션]

Docker 컨테이너 아키텍처의 주요 구성 요소는 다음과 같습니다.

  • Docker 호스트: Docker 엔진을 실행하고 Docker 컨테이너를 호스팅하는 물리적 또는 가상 머신입니다.
  • Docker 엔진: Docker 플랫폼의 핵심으로 Docker 컨테이너의 생성, 실행 및 수명주기를 관리합니다.
  • Docker 이미지: Docker 컨테이너를 생성하는 데 사용되는 템플릿으로 애플리케이션 코드, 종속성 및 구성을 포함합니다.
  • Docker 컨테이너: 애플리케이션과 종속성을 캡슐화하는 Docker 이미지의 실행 인스턴스입니다.

Docker 컨테이너 배포 워크플로우

  1. Docker 이미지 생성: Dockerfile 에서 애플리케이션의 종속성, 구성 및 빌드 지침을 정의하여 Docker 이미지를 생성합니다.
  2. Docker 이미지 푸시: Docker Hub 또는 프라이빗 레지스트리와 같은 컨테이너 레지스트리에 Docker 이미지를 업로드하여 배포에 사용할 수 있도록 합니다.
  3. Docker 컨테이너 배포: 레지스트리에서 Docker 이미지를 가져와 대상 Docker 호스트에서 컨테이너로 실행합니다.
  4. 컨테이너 관리 및 모니터링: 확장, 업데이트 및 성능과 상태를 모니터링하는 등 실행 중인 컨테이너의 수명주기를 관리합니다.

Docker 컨테이너의 기본 사항을 이해함으로써 다음 섹션에서 다룰 내부 호스트에서 Docker 컨테이너를 배포 및 관리하는 방법을 탐색할 수 있습니다.

내부 호스트에 Docker 설치

필수 사항

내부 호스트에 Docker 를 설치하기 전에 다음 사항을 확인하세요.

  • Linux 기반 운영 체제 (예: Ubuntu 22.04)
  • Docker 설치 및 구성을 위한 루트 또는 sudo 권한

Ubuntu 22.04 에 Docker 설치

  1. 패키지 인덱스를 업데이트하고 필요한 종속성을 설치합니다.
sudo apt-get update
sudo apt-get install -y \
  ca-certificates \
  curl \
  gnupg \
  lsb-release
  1. 공식 Docker GPG 키를 추가하고 Docker 리포지토리를 설정합니다.
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. Docker 엔진, Docker CLI 및 Docker Compose 를 설치합니다.
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
  1. 다음 명령어를 실행하여 설치를 확인합니다.
sudo docker run hello-world

이렇게 하면 테스트 이미지를 다운로드하고 컨테이너에서 실행하여 Docker 가 올바르게 설치되고 작동하는지 확인합니다.

내부 호스트용 Docker 구성

  1. 네트워크 구성: 기본적으로 Docker 는 bridge 네트워크 드라이버를 사용하여 컨테이너를 위한 개인 네트워크를 생성합니다. 다른 호스트 또는 인터넷에서 컨테이너에 액세스해야 하는 경우 네트워크 설정을 해당 환경에 맞게 구성해야 합니다.

  2. 저장소 구성: Docker 는 기본적으로 /var/lib/docker 디렉토리에 컨테이너 데이터를 저장합니다. 전용 저장 볼륨 또는 네트워크 연결 저장소와 같은 필요에 따라 저장 드라이버와 위치를 구성할 수 있습니다.

  3. 사용자 권한: Docker 명령어를 실행할 때마다 sudo를 사용하지 않으려면 사용자 계정을 docker 그룹에 추가할 수 있습니다.

sudo usermod -aG docker $USER

그런 다음 변경 사항이 적용되도록 로그아웃하고 다시 로그인합니다.

  1. 프록시 구성: 내부 호스트에서 인터넷에 액세스하기 위해 프록시가 필요한 경우 Docker 데몬이 프록시 설정을 사용하도록 구성해야 합니다. 이는 systemd 구성 파일을 생성하여 수행할 수 있습니다.

이 단계를 따르면 내부 호스트에 Docker 를 성공적으로 설치하고 Docker 컨테이너를 배포할 준비를 할 수 있습니다.

Docker 컨테이너 생성 및 구성

Docker 이미지 생성

Docker 컨테이너를 생성하려면 먼저 Docker 이미지를 생성해야 합니다. 이는 Dockerfile 에서 애플리케이션의 종속성, 구성 및 빌드 지침을 정의하여 수행합니다.

다음은 간단한 Node.js 애플리케이션을 위한 예시 Dockerfile 입니다.

## 공식 Node.js 이미지를 기반으로 사용
FROM node:14

## 작업 디렉토리를 /app으로 설정
WORKDIR /app

## package.json 및 package-lock.json 파일 복사
COPY package*.json ./

## 애플리케이션 종속성 설치
RUN npm install

## 애플리케이션 코드 복사
COPY . .

## 애플리케이션 빌드
RUN npm run build

## 애플리케이션 포트 노출
EXPOSE 3000

## 애플리케이션 시작
CMD ["npm", "start"]

다음 명령어를 사용하여 Docker 이미지를 생성할 수 있습니다.

docker build -t my-node-app .

이렇게 하면 현재 디렉토리의 Dockerfile 을 기반으로 my-node-app이라는 새 Docker 이미지가 생성됩니다.

Docker 컨테이너 실행

방금 생성한 이미지에서 Docker 컨테이너를 실행하려면 다음 명령어를 사용합니다.

docker run -d -p 8080:3000 --name my-node-container my-node-app

이 명령어는 다음과 같습니다.

  • 컨테이너를 분리 모드 (-d) 로 실행
  • 호스트 포트 8080 을 컨테이너 포트 3000 으로 매핑 (-p 8080:3000)
  • 실행 중인 컨테이너에 이름 my-node-container 할당
  • my-node-app 이미지를 사용하여 컨테이너 시작

Docker 컨테이너 구성

Docker 컨테이너의 다양한 측면을 구성할 수 있습니다.

  1. 환경 변수: -e 또는 --env 플래그를 사용하여 환경 변수를 설정합니다. 예: docker run -e DB_PASSWORD=mypassword ...
  2. 볼륨: -v 또는 --volume 플래그를 사용하여 호스트 디렉토리 또는 이름이 지정된 볼륨을 컨테이너에 마운트합니다. 예: docker run -v /host/path:/container/path ...
  3. 네트워크 구성: --network 플래그를 사용하여 특정 네트워크에 컨테이너를 연결합니다. 예: docker run --network my-network ...
  4. 리소스 제한: --cpus, --memory, 또는 --blkio-weight 플래그를 사용하여 CPU, 메모리 또는 I/O 와 같은 컨테이너의 리소스 제한을 설정합니다. 예: docker run --cpus 2 --memory 512m ...

Docker 이미지를 생성하고 다양한 구성으로 Docker 컨테이너를 실행하는 방법을 이해함으로써 내부 호스트에서 애플리케이션을 배포하기 시작할 수 있습니다.

내부 호스트에 Docker 컨테이너 배포

내부 호스트 준비

내부 호스트에 Docker 컨테이너를 배포하기 전에 다음 단계를 완료했는지 확인하세요.

  1. 이전 섹션에서 설명한 대로 내부 호스트에 Docker 를 설치합니다.
  2. 내부 호스트가 데이터베이스, 외부 서비스 또는 인터넷 (필요한 경우) 과 같은 필요한 리소스에 액세스하기 위한 필요한 네트워크 연결 및 방화벽 규칙을 갖추고 있는지 확인합니다.
  3. (선택 사항) 공개 레지스트리 (예: Docker Hub) 대신 개인 컨테이너 레지스트리를 설정하여 Docker 이미지를 저장합니다.

Docker 컨테이너 배포

특정 요구 사항 및 인프라 설정에 따라 내부 호스트에 Docker 컨테이너를 배포하는 여러 가지 방법이 있습니다.

Docker CLI 사용

Docker 컨테이너를 배포하는 가장 간단한 방법은 내부 호스트에서 직접 Docker 명령줄 인터페이스 (CLI) 를 사용하는 것입니다. 이전에 생성한 my-node-app 컨테이너를 배포하는 방법의 예는 다음과 같습니다.

docker run -d -p 8080:3000 --name my-node-container my-node-app

이 명령은 컨테이너를 분리 모드로 시작하고 호스트 포트 8080 을 컨테이너 포트 3000 으로 매핑합니다.

Docker Compose 사용

여러 컨테이너 및 서비스가 있는 더 복잡한 배포를 위해 Docker Compose 를 사용할 수 있습니다. 서비스 및 해당 구성을 정의하는 docker-compose.yml 파일을 생성한 다음 다음 명령을 사용하여 스택을 배포합니다.

docker-compose up -d

이렇게 하면 docker-compose.yml 파일에 정의된 모든 컨테이너가 분리 모드로 시작됩니다.

컨테이너 오케스트레이션 플랫폼 사용

대규모 프로덕션 환경 배포를 위해 Kubernetes 또는 LabEx Platform 과 같은 컨테이너 오케스트레이션 플랫폼을 사용할 수 있습니다. 이러한 플랫폼은 여러 호스트에서 Docker 컨테이너를 관리, 확장 및 모니터링하기 위한 고급 기능을 제공합니다.

컨테이너 오케스트레이션 플랫폼을 사용하여 Docker 컨테이너를 배포하려면 필요한 구성 파일 (예: Kubernetes 매니페스트) 을 정의하고 플랫폼의 CLI 또는 웹 기반 인터페이스를 사용하여 컨테이너를 배포해야 합니다.

배포 확인

Docker 컨테이너를 배포한 후 다음 명령을 사용하여 상태를 확인하고 실행 중인 애플리케이션에 액세스할 수 있습니다.

## 실행 중인 컨테이너 목록
docker ps

## 컨테이너 로그 보기
docker logs my-node-container

## 실행 중인 애플리케이션 액세스
curl http://localhost:8080

이러한 단계를 따르면 내부 호스트에 Docker 컨테이너를 성공적으로 배포하고 사용자 또는 다른 애플리케이션에서 액세스할 수 있도록 할 수 있습니다.

Docker 컨테이너 관리 및 모니터링

Docker 컨테이너 관리

Docker 컨테이너를 배포한 후에는 시작, 중지, 확장 및 업데이트를 포함하여 컨테이너의 수명주기를 관리해야 합니다. 다음은 일반적인 Docker 관리 명령입니다.

## 컨테이너 시작
docker start my-node-container

## 컨테이너 중지
docker stop my-node-container

## 컨테이너 재시작
docker restart my-node-container

## 컨테이너 복제본 수량 확장/축소
docker scale my-node-container=3

## 새 이미지로 컨테이너 업데이트
docker pull my-node-app:v2
docker stop my-node-container
docker run -d -p 8080:3000 --name my-node-container my-node-app:v2

Docker 컨테이너 모니터링

Docker 컨테이너의 상태와 성능을 모니터링하는 것은 애플리케이션의 안정성과 확장성을 보장하는 데 중요합니다. 다양한 도구와 기술을 사용하여 Docker 환경을 모니터링할 수 있습니다.

Docker CLI

Docker CLI 는 다음과 같은 기본 모니터링 명령을 제공합니다.

## 실행 중인 컨테이너 목록
docker ps

## 컨테이너 로그 보기
docker logs my-node-container

## 컨테이너 세부 정보 검사
docker inspect my-node-container

Docker 메트릭

Docker 는 Docker API 를 사용하거나 모니터링 도구와 통합하여 액세스할 수 있는 내장 메트릭을 제공합니다. 컨테이너의 CPU, 메모리, 네트워크 및 스토리지 사용량과 같은 메트릭을 수집할 수 있습니다.

타사 모니터링 도구

LabEx Platform, Prometheus 또는 Grafana 와 같은 타사 모니터링 도구를 사용하여 더 고급 Docker 메트릭을 수집하고 시각화할 수 있습니다. 이러한 도구는 Docker 환경의 전반적인 상태와 성능을 모니터링하는 데 도움이 될 수 있습니다.

Docker 컨테이너를 모니터링하기 위한 LabEx Platform 사용 예는 다음과 같습니다.

graph TD A[내부 호스트] --> B[Docker 컨테이너] B --> C[LabEx 에이전트] C --> D[LabEx 플랫폼] D --> E[모니터링 대시보드]

LabEx 플랫폼은 Docker 환경에 대한 포괄적인 모니터링 솔루션을 제공하여 컨테이너 수준의 메트릭을 추적하고 경고를 설정하며 사용자 지정 보고서를 생성할 수 있습니다.

이러한 관리 및 모니터링 도구를 활용하여 내부 호스트에서 실행 중인 Docker 컨테이너를 효과적으로 유지 관리하고 최적화할 수 있습니다.

Docker 컨테이너의 네트워킹 및 스토리지

Docker 컨테이너의 네트워킹

Docker 는 컨테이너를 연결하고 분리하기 위한 여러 네트워크 드라이버를 제공합니다.

  1. 브리지 네트워크: 호스트에서 컨테이너를 위한 개인 네트워크를 만드는 기본 네트워크 드라이버입니다.
  2. 호스트 네트워크: 컨테이너가 호스트의 네트워크 스택을 사용할 수 있도록 하며, 효과적으로 네트워크 분리를 제거합니다.
  3. 오버레이 네트워크: 여러 Docker 호스트 간의 컨테이너 간 통신을 가능하게 하며, 클러스터링 및 오케스트레이션에 유용합니다.
  4. Macvlan 네트워크: 컨테이너에 MAC 주소를 할당하여 네트워크에서 물리적 장치로 나타나도록 합니다.

다음 명령을 사용하여 Docker 네트워크를 생성하고 관리할 수 있습니다.

## 새 브리지 네트워크 생성
docker network create my-network

## 컨테이너를 네트워크에 연결
docker run -d --name my-container --network my-network my-node-app

## 네트워크 검사
docker network inspect my-network

Docker 컨테이너의 스토리지

Docker 컨테이너는 기본적으로 호스트 파일 시스템을 사용하여 데이터를 저장하지만, 이 데이터는 일시적이며 컨테이너가 제거되면 손실됩니다. 데이터를 영구적으로 저장하려면 컨테이너의 수명주기와 독립적인 Docker 볼륨을 사용할 수 있습니다.

여러 유형의 Docker 볼륨이 있습니다.

  1. 이름이 지정된 볼륨: Docker 에서 관리하는 고유한 이름을 가진 볼륨입니다.
  2. 바인드 마운트: 호스트의 디렉터리를 컨테이너의 디렉터리에 매핑합니다.
  3. tmpfs 마운트: 컨테이너의 메모리에 임시 파일 시스템을 만듭니다.

이름이 지정된 볼륨을 생성하고 컨테이너에 마운트하는 예는 다음과 같습니다.

## 이름이 지정된 볼륨 생성
docker volume create my-volume

## 이름이 지정된 볼륨을 사용하여 컨테이너 실행
docker run -d --name my-container -v my-volume:/app my-node-app

네트워크 연결 스토리지 (NAS) 또는 클라우드 스토리지 서비스를 사용하여 Docker 컨테이너에 대한 영구 스토리지를 제공할 수도 있습니다.

Docker 의 네트워킹 및 스토리지 옵션을 이해함으로써 컨테이너가 올바르게 연결되고 데이터가 안정적으로 저장되고 액세스될 수 있도록 할 수 있습니다.

Docker 컨테이너 배포를 위한 최적의 사례

내부 호스트에 Docker 컨테이너를 배포할 때는 애플리케이션의 안정성, 보안 및 확장성을 보장하기 위해 최적의 사례를 따르는 것이 중요합니다. 고려해야 할 몇 가지 주요 최적의 사례는 다음과 같습니다.

모든 것을 컨테이너화합니다.

모든 애플리케이션과 서비스를 Docker 컨테이너로 패키징하는 "모든 것을 컨테이너화" 접근 방식을 채택합니다. 이는 다양한 환경에서 일관성, 이식성 및 관리 용이성을 보장합니다.

불변 인프라 사용

Docker 컨테이너를 불변 인프라로 취급합니다. 즉, 실행 중인 컨테이너에 직접 변경 사항을 적용해서는 안 됩니다. 대신 Dockerfile 을 업데이트하고 이미지를 다시 빌드하여 변경 사항을 배포합니다.

Docker 이미지 최적화

다음과 같이 Docker 이미지를 최적화합니다.

  • 가능한 가장 작은 기본 이미지 사용
  • Dockerfile 의 레이어 수 최소화
  • 다단계 빌드 활용하여 이미지 크기 줄이기
  • 정기적으로 기본 이미지를 스캔하고 보안 취약점에 대해 업데이트

보안 관행 구현

다음과 같이 Docker 환경의 보안을 확보합니다.

  • Docker 이미지 서명 및 검증
  • 이미지 취약점 스캔
  • 컨테이너 권한 및 기능 제한
  • AppArmor 또는 SELinux 와 같은 보안 기능 사용

비밀 정보 안전하게 관리

API 키, 데이터베이스 자격 증명 또는 SSL/TLS 인증서와 같은 민감한 정보는 LabEx Vault 또는 HashiCorp Vault 와 같은 안전한 비밀 관리 솔루션을 사용하여 저장하고 관리합니다.

컨테이너 모니터링 및 로깅

Docker 컨테이너의 상태, 성능 및 발생할 수 있는 문제에 대한 가시성을 확보하기 위해 포괄적인 모니터링 및 로깅을 구현합니다. LabEx Platform 과 같은 도구가 이 작업에 큰 도움이 될 수 있습니다.

컨테이너 오케스트레이션 사용

프로덕션 환경 배포를 위해 LabEx Platform 또는 Kubernetes 와 같은 컨테이너 오케스트레이션 플랫폼을 활용하여 Docker 컨테이너의 확장, 고가용성 및 수명주기를 관리합니다.

배포 워크플로우 자동화

Docker Compose, Jenkins 또는 LabEx Platform 과 같은 도구를 사용하여 Docker 컨테이너 배포 워크플로우를 자동화하여 일관성, 반복성 및 효율성을 확보합니다.

이러한 최적의 사례를 따르면 내부 호스트에서 Docker 컨테이너 배포가 안정적이고 안전하며 확장 가능하도록 할 수 있습니다.

요약

이 튜토리얼에서는 내부 호스트에 Docker 컨테이너를 배포하는 방법을 배웠습니다. Docker 설치부터 컨테이너 생성, 구성 및 관리까지 필수적인 단계를 다루었습니다. 이러한 최적의 사례를 따르면 이제 Docker 의 이점을 효율적으로 활용하여 호스트 Docker 내에서 애플리케이션 배포 및 관리를 간소화할 수 있습니다. 습득한 지식을 바탕으로 Docker 기술을 더욱 탐구하고 확장하여 조직의 인프라와 워크플로우를 더욱 향상시킬 수 있습니다.