Docker 컨테이너 빌드 및 배포 방법

DockerBeginner
지금 연습하기

소개

이 튜토리얼에서는 Dockerfile 을 사용하여 효율적인 Docker 이미지를 구축하는 과정을 안내합니다. Docker 이미지와 Dockerfile 을 이해하고, 성능을 위해 Dockerfile 레이어를 최적화하고, 더 빠른 빌드를 위해 Docker 이미지 캐시를 관리하며, 최적화된 이미지를 생성하기 위해 다단계 빌드를 활용하는 방법을 배울 것입니다. 이 튜토리얼을 마치면 가볍고 효율적이며 관리하기 쉬운 Docker 이미지를 만드는 지식을 갖추게 될 것입니다.

Docker 기본 개념

Docker 란 무엇인가?

Docker 는 소프트웨어 배포 및 개발을 혁신하는 강력한 컨테이너화 기술입니다. 개발자는 모든 종속성을 포함한 애플리케이션을 컨테이너라는 표준화된 단위로 패키징하여 다양한 컴퓨팅 환경에서 일관된 성능을 보장할 수 있습니다.

컨테이너화의 핵심 개념

컨테이너화는 애플리케이션이 격리된 환경에서 실행되도록 하여 다음과 같은 주요 이점을 제공합니다.

개념 설명
격리 컨테이너는 서로 간섭하지 않고 독립적으로 실행됩니다.
이식성 애플리케이션은 다양한 시스템에서 일관되게 배포될 수 있습니다.
효율성 기존 가상 머신에 비해 경량입니다.

Docker 아키텍처

graph TD A[Docker 클라이언트] --> B[Docker 데몬] B --> C[컨테이너 런타임] B --> D[이미지 리포지토리] C --> E[컨테이너]

Ubuntu 22.04 에서 설치

## 패키지 인덱스 업데이트
sudo apt update

## 종속성 설치
sudo apt install apt-transport-https ca-certificates curl software-properties-common

## Docker 공식 GPG 키 추가
curl -fsSL | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

## 안정적인 리포지토리 설정
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

## Docker 엔진 설치
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

Docker 설치 확인

## Docker 버전 확인
docker --version

## Docker 설치 테스트
sudo docker run hello-world

주요 Docker 구성 요소

  1. Docker 클라이언트: Docker 와 상호 작용하기 위한 명령줄 인터페이스
  2. Docker 데몬: 컨테이너와 이미지를 관리하는 백그라운드 서비스
  3. Docker 이미지: 컨테이너를 생성하는 데 사용되는 읽기 전용 템플릿
  4. Docker 컨테이너: Docker 이미지의 실행 가능한 인스턴스

기본 Docker 명령어

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

## 모든 컨테이너 목록
docker ps -a

## 이미지 가져오기
docker pull ubuntu

## 컨테이너 실행
docker run -it ubuntu /bin/bash

Docker 이미지 제작

Docker 이미지 이해

Docker 이미지는 컨테이너 생성의 기반이 되는 읽기 전용 템플릿입니다. 코드, 런타임, 라이브러리, 시스템 도구 등 애플리케이션 실행에 필요한 모든 것을 포함합니다.

Dockerfile 기본 개념

Dockerfile 은 Docker 이미지를 생성하기 위한 지침이 담긴 텍스트 문서입니다. 각 지침은 이미지에 새로운 레이어를 생성합니다.

graph TD A[Dockerfile] --> B[베이스 이미지] A --> C[애플리케이션 파일 복사] A --> D[종속성 설치] A --> E[환경 설정] A --> F[시작 명령 정의]

Python 애플리케이션을 위한 샘플 Dockerfile

## 공식 Python 런타임을 베이스 이미지로 사용
FROM python:3.9-slim

## 컨테이너 내 작업 디렉토리 설정
WORKDIR /app

## requirements 파일 복사
COPY requirements.txt .

## 필요한 패키지 설치
RUN pip install --no-cache-dir -r requirements.txt

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

## 포트 번호 지정
EXPOSE 5000

## 애플리케이션 실행 명령 정의
CMD ["python", "app.py"]

이미지 구축 전략

전략 설명 사용 사례
단일 단계 빌드 간단하고 직관적인 빌드 작고 복잡하지 않은 애플리케이션
다단계 빌드 이미지 크기 및 보안 최적화 복잡한 애플리케이션 및 빌드 종속성 포함

다단계 빌드 예제

## 단계 1: 빌드 단계
FROM maven:3.8.1-openjdk-11 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn package

## 단계 2: 런타임 단계
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=build /app/target/myapp.jar .
EXPOSE 8080
CMD ["java", "-jar", "myapp.jar"]

Docker 이미지 빌드 및 관리

## 이미지 빌드
docker build -t myapp:v1 .

## 로컬 이미지 목록
docker images

## 이미지 삭제
docker rmi myapp:v1

## 이미지 태그
docker tag myapp:v1 myregistry/myapp:latest

이미지 최적화 기법

  1. 최소한의 베이스 이미지 사용
  2. 레이어 수 최소화
  3. 빌드 캐시 활용
  4. 불필요한 파일 제거
  5. .dockerignore 파일 사용

Docker 이미지 레이어

graph TD A[베이스 이미지 레이어] --> B[종속성 설치 레이어] B --> C[애플리케이션 코드 레이어] C --> D[설정 레이어] D --> E[엔트리포인트 레이어]

컨테이너 관리

컨테이너 수명주기 관리

Docker 컨테이너는 여러 상태와 관리 전략을 가진 복잡한 수명주기를 갖습니다. 효과적인 컨테이너 오케스트레이션을 위해 이러한 상태를 이해하는 것이 중요합니다.

graph LR A[생성됨] --> B[실행 중] B --> C[일시 중지됨] B --> D[중지됨] D --> E[제거됨]

기본 컨테이너 작업

작업 명령어 설명
시작 docker start <컨테이너> 중지된 컨테이너를 다시 시작합니다.
중지 docker stop <컨테이너> 실행 중인 컨테이너를 정상적으로 중지합니다.
재시작 docker restart <컨테이너> 컨테이너를 중지하고 다시 시작합니다.
제거 docker rm <컨테이너> 컨테이너를 삭제합니다.

고급 컨테이너 관리

## 분리된 모드로 컨테이너 실행
docker run -d --name webserver nginx

## 컨테이너 세부 정보 확인
docker inspect webserver

## 컨테이너 로그 보기
docker logs webserver

## 실행 중인 컨테이너 내에서 명령 실행
docker exec -it webserver /bin/bash

리소스 관리 및 제약 조건

## CPU 및 메모리 제한
docker run -d \
  --cpus="1.5" \
  --memory="512m" \
  --name limited-container \
  nginx

컨테이너 네트워킹

graph TD A[호스트 네트워크] --> B[브리지 네트워크] B --> C[사용자 지정 네트워크] C --> D[오버레이 네트워크]

네트워크 구성 예제

## 사용자 지정 네트워크 생성
docker network create myapp-network

## 사용자 지정 네트워크에서 컨테이너 실행
docker run -d --network=myapp-network --name db postgres
docker run -d --network=myapp-network --name webapp nginx

컨테이너 확장

## Docker Compose를 사용하여 확장
version: '3'
services:
webapp:
image: nginx
deploy:
replicas: 5

성능 모니터링

## 실시간 컨테이너 통계
docker stats

## 리소스 사용량이 있는 실행 중인 컨테이너 목록
docker ps -q | xargs docker stats --no-stream

컨테이너 백업 및 마이그레이션

## 컨테이너를 tar 아카이브로 내보내기
docker export container_name > container.tar

## 아카이브에서 컨테이너 가져오기
docker import container.tar new_image_name

요약

이 자세한 튜토리얼에서는 Dockerfile 을 사용하여 효율적인 Docker 이미지를 구축하는 방법을 배웠습니다. Docker 이미지와 Dockerfile 의 기본 사항을 탐색하고, Dockerfile 레이어 최적화, Docker 이미지 캐시 관리 및 다단계 빌드 활용 기술을 발견했습니다. 이러한 최선의 방법을 따르면 더 작고, 빌드 속도가 빠르며, 유지 관리가 쉬운 Docker 이미지를 만들 수 있습니다. 궁극적으로 Docker 기반 애플리케이션 개발 및 배포 워크플로우를 개선할 수 있습니다.