본문으로 건너뛰기

Docker 배포

빌드된 컨테이너 이미지를 Docker 또는 Podman 런타임에 배포하는 방법을 안내합니다. Docker 배포는 설정이 간단하고 빠르게 시작할 수 있어 개발 환경이나 소규모 서비스에 적합합니다.

Docker vs Kubernetes 배포

Docker 배포

  • 복잡도: 간단함
  • 확장성: 제한적
  • 고가용성: 수동 구성 필요
  • 추천 환경: 개발, 테스트, 소규모

Kubernetes 배포

  • 복잡도: 복잡함
  • 확장성: 자동 확장 지원
  • 고가용성: 기본 지원
  • 추천 환경: 스테이징, 프로덕션

Docker 배포 탭

사전 요구사항

배포를 시작하기 전에 다음을 확인하세요:

  • Docker/Podman 런타임 등록: [런타임 환경] 페이지에 Docker 또는 Podman 런타임이 등록되어 있어야 합니다.
  • 이미지 빌드 완료: 이미지가 레지스트리에 푸시되어 있어야 합니다.

Step 1: Deploy 단계로 이동

  1. [서비스 관리] 페이지로 이동합니다.
  2. 배포할 서비스를 선택합니다.
  3. 파이프라인에서 Deploy 단계를 클릭합니다.

Step 2: Docker 배포 선택

  1. 배포 유형에서 Docker를 선택합니다.
  2. 배포 대상 런타임을 선택합니다:
  • Docker: Docker Engine 기반입니다. 가장 일반적이며 넓은 호환성을 가집니다.
  • Podman: Rootless 컨테이너 런타임입니다. 보안이 강화되어 있고 데몬 없이 동작합니다.
Podman이란?

Podman은 Docker와 호환되는 컨테이너 런타임이지만 데몬 없이 동작하며 rootless 모드를 지원합니다. 보안이 중요한 환경에서 권장됩니다.


Step 3: 컨테이너 기본 설정

컨테이너의 기본 정보를 입력합니다:

  • 컨테이너 이름: 컨테이너 식별 이름 (예: my-web-app)
  • 이미지 태그: 배포할 이미지 (예: harbor.company.com/library/app:latest)
  • 재시작 정책: 컨테이너 재시작 규칙 (예: always)

재시작 정책 이해하기

  • no: 재시작하지 않습니다. 일회성 작업에 추천합니다.
  • on-failure: 오류로 종료 시에만 재시작합니다. 개발 환경에 추천합니다.
  • always: 항상 재시작합니다 (수동 중지 포함). 테스트 환경에 추천합니다.
  • unless-stopped: 수동 중지 전까지 재시작합니다. 프로덕션에 권장합니다.
재시작 정책 선택 가이드

프로덕션 환경에서는 unless-stopped를 권장합니다. 시스템 재부팅 시에도 컨테이너가 자동으로 시작되지만, 의도적으로 중지한 경우는 재시작되지 않습니다.


Step 4: 포트 매핑

외부에서 컨테이너에 접근할 수 있도록 포트를 매핑합니다.

  • 호스트 포트: 외부 접근 포트 (예: 8080)
  • 컨테이너 포트: 컨테이너 내부 포트 (예: 80)
  • 프로토콜: TCP 또는 UDP (기본: tcp)

다중 포트 매핑

여러 포트를 매핑해야 하는 경우:

8080:80    # HTTP 트래픽
8443:443 # HTTPS 트래픽
9090:9090 # 메트릭 엔드포인트
포트 충돌 주의

호스트의 동일한 포트에 여러 컨테이너를 바인딩할 수 없습니다. 포트가 이미 사용 중이면 다른 포트를 선택하세요.


Step 5: 볼륨 마운트 (선택사항)

데이터를 영속적으로 저장하거나 호스트와 파일을 공유하려면 볼륨을 마운트합니다.

5.1 바인드 마운트

호스트의 특정 디렉토리를 컨테이너에 마운트합니다:

  • 호스트 경로: 호스트의 디렉토리 (예: /data/app)
  • 컨테이너 경로: 컨테이너 내 마운트 위치 (예: /app/data)
  • 읽기 전용: 읽기만 허용할지 여부 (체크 시 :ro)

5.2 Docker 볼륨 사용

Docker가 관리하는 볼륨을 사용합니다:

  • 볼륨 이름: Docker 볼륨 이름 (예: app-data)
  • 컨테이너 경로: 마운트 위치 (예: /app/data)
바인드 마운트 vs Docker 볼륨
  • 바인드 마운트: 호스트의 특정 경로를 직접 마운트. 설정 파일이나 로그 확인 시 유용
  • Docker 볼륨: Docker가 관리하는 볼륨. 데이터베이스 등 영속 데이터에 권장

Step 6: 환경 변수 설정

애플리케이션에 필요한 환경 변수를 설정합니다.

직접 입력

키-값 쌍으로 환경 변수를 입력합니다:

  • NODE_ENV: 실행 환경을 지정합니다 (예: production)
  • DATABASE_URL: DB 연결 문자열을 지정합니다 (예: postgresql://...)
  • API_KEY: 외부 API 키를 지정합니다 (예: xxx-xxx-xxx)

환경 파일 (.env)

.env 파일을 참조하여 환경 변수를 일괄 로드할 수 있습니다.

민감 정보 주의

비밀번호나 API 키 같은 민감한 정보는 환경 변수로 전달하되, 소스 코드에 하드코딩하지 마세요. .env 파일은 .gitignore에 추가하여 버전 관리에서 제외하세요.


Step 7: 네트워크 설정 (선택사항)

컨테이너 간 통신이나 네트워크 격리가 필요한 경우 설정합니다.

  • 네트워크 이름: Docker 네트워크 (예: app-network)
  • 네트워크 모드: 네트워크 유형 (기본: bridge)
  • 호스트명: 컨테이너 호스트명 (예: api-server)
네트워크 모드
  • bridge: 기본 모드. 컨테이너가 격리된 네트워크에서 실행
  • host: 호스트 네트워크를 직접 사용. 포트 매핑 불필요
  • none: 네트워크 비활성화

Step 8: 배포 실행

  1. 모든 설정을 검토합니다.
  2. 배포 버튼을 클릭합니다.
  3. 배포 상태를 확인합니다.

배포 과정

[1/4] Pulling image...
[2/4] Stopping existing container...
[3/4] Creating new container...
[4/4] Starting container...
Container started successfully!
기존 컨테이너가 있으면?

동일한 이름의 컨테이너가 이미 실행 중이면 자동으로 중지하고 새 컨테이너로 교체합니다.


Step 9: 컨테이너 상태 확인

Operate 단계에서 컨테이너 상태를 확인합니다.

Docker Containers 탭

다음 정보를 확인할 수 있습니다:

  • 상태: Running / Stopped / Error
  • 포트: 매핑된 포트 정보
  • 생성 시간: 컨테이너 생성 시점
  • 리소스: CPU / Memory 사용량

컨테이너 제어

  • Start: 중지된 컨테이너를 시작합니다.
  • Stop: 실행 중인 컨테이너를 중지합니다.
  • Restart: 컨테이너를 재시작합니다.
  • Remove: 컨테이너를 삭제합니다.

Docker Compose 배포

여러 컨테이너를 함께 배포해야 하는 경우 Docker Compose를 사용할 수 있습니다.

Compose 파일 설정

서비스 설정에서 Docker Compose 파일 경로를 등록합니다:

  • Compose 파일: docker-compose.yml 경로 (예: ./docker-compose.yml)
  • 환경 파일: .env 파일 경로 (예: ./.env.production)

Compose 배포

  1. Compose 파일이 설정된 서비스의 Deploy 단계 클릭
  2. 자동으로 Compose 모드로 전환됩니다.
  3. docker-compose up -d 명령이 실행되어 전체 스택이 배포됩니다.
Docker Compose 장점
  • 여러 컨테이너를 하나의 명령으로 관리
  • 컨테이너 간 의존성 정의 가능 (depends_on)
  • 네트워크 자동 생성

문제 해결

컨테이너 시작 실패

  • 포트 충돌: 다른 포트를 사용하거나 기존 컨테이너를 중지합니다.
  • 이미지 없음: 이미지 태그를 확인하고 docker pull을 실행합니다.
  • 권한 문제: 볼륨 마운트 경로의 권한을 확인합니다.

컨테이너 크래시 (재시작 반복)

  • 환경 변수 누락: 필수 환경 변수가 설정되었는지 확인합니다.
  • 의존성 문제: docker logs 명령으로 오류 메시지를 확인합니다.
  • 메모리 부족: 리소스 제한을 증가시키거나 애플리케이션을 최적화합니다.

외부에서 접근 불가

  • 포트 미매핑: 포트 매핑 설정을 확인합니다.
  • 방화벽 차단: 호스트 방화벽에서 포트를 허용합니다.
  • 컨테이너 내부 오류: 로그를 확인하고 애플리케이션 상태를 점검합니다.
로그 확인 방법

Operate 단계의 Logs 탭에서 실시간 로그를 확인하거나, 터미널에서 docker logs <container-name> 명령을 사용하세요.


관련 가이드