Docker 컨테이너 효율적으로 구축 및 관리하는 방법

DockerBeginner
지금 연습하기

소개

이 포괄적인 Docker 튜토리얼은 개발자 및 IT 전문가에게 컨테이너화 기술에 대한 심층적인 이해를 제공합니다. Docker 의 핵심 개념, 아키텍처, 그리고 실제 구현 전략을 탐색함으로써 학습자는 다양한 컴퓨팅 환경에서 애플리케이션을 패키징, 배포 및 관리하는 실질적인 기술을 습득하게 됩니다.

Docker 기본

Docker 란 무엇인가?

Docker 는 애플리케이션 배포 및 개발을 혁신하는 강력한 컨테이너 플랫폼입니다. 오픈소스 기술로서 Docker 는 개발자가 다양한 컴퓨팅 환경에서 애플리케이션을 일관되게 패키징, 배포 및 실행할 수 있도록 지원합니다.

Docker 의 핵심 개념

컨테이너 대 가상 머신

graph TD
    A[물리적 하드웨어] --> B[Docker 컨테이너]
    A --> C[가상 머신]
    B --> D[경량]
    B --> E[공유 OS 커널]
    C --> F[중량]
    C --> G[전체 OS 오버헤드]
특징 Docker 컨테이너 가상 머신
리소스 사용량 경량 리소스 집약적
시작 시간 몇 초 몇 분
격리 수준 프로세스 수준 전체 시스템

Docker 아키텍처

Docker 는 클라이언트 - 서버 아키텍처를 사용하며 다음과 같은 주요 구성 요소를 포함합니다.

  • Docker 데몬
  • Docker 클라이언트
  • Docker 레지스트리
  • Docker 이미지
  • Docker 컨테이너

기본 Docker 명령어

Ubuntu 22.04 에 Docker 설치:

## 시스템 패키지 업데이트
sudo apt update

## Docker 종속성 설치
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

## Docker 리포지토리 설정
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 설치 확인
sudo docker --version

첫 번째 컨테이너 실행

## Ubuntu 이미지 가져오기
sudo docker pull ubuntu:latest

## 대화형 컨테이너 실행
sudo docker run -it ubuntu:latest /bin/bash

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

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

이미지 관리

## 이미지 검색
sudo docker search nginx

## 이미지 다운로드
sudo docker pull nginx

## 로컬 이미지 목록
sudo docker images

컨테이너 네트워킹

Docker 네트워크 유형

graph TD
    A[Docker 네트워크 유형] --> B[Bridge 네트워크]
    A --> C[Host 네트워크]
    A --> D[None 네트워크]
    A --> E[Overlay 네트워크]
네트워크 유형 설명 사용 사례
Bridge 기본 네트워크 격리된 컨테이너 간 통신
Host 직접 호스트 네트워크 성능이 중요한 애플리케이션
None 네트워크 접근 없음 완전히 격리된 컨테이너
Overlay 멀티 호스트 네트워킹 분산된 컨테이너 시스템

포트 매핑 기법

기본 포트 매핑

## 컨테이너 포트 80을 호스트 포트 8080으로 매핑
sudo docker run -p 8080:80 nginx

## 여러 포트 매핑
sudo docker run -p 8080:80 -p 3306:3306 myapp

네트워크 관리 명령어

## Docker 네트워크 목록
sudo docker network ls

## 사용자 정의 네트워크 생성
sudo docker network create mynetwork

## 컨테이너를 네트워크에 연결
sudo docker network connect mynetwork mycontainer

## 네트워크 세부 정보 확인
sudo docker network inspect bridge

고급 네트워킹 시나리오

## 사용자 정의 Bridge 네트워크 생성
sudo docker network create --driver bridge isolated_network

## 사용자 정의 네트워크에서 컨테이너 실행
sudo docker run -d --name web1 --network isolated_network nginx
sudo docker run -d --name web2 --network isolated_network httpd

네트워크 격리 전략

## 외부 네트워크 접근 차단
sudo docker run --network none mycontainer

## 호스트 네트워크 직접 사용
sudo docker run --network host mycontainer

컨테이너 DNS 해결

## 컨테이너 간 자동 DNS 활성화
sudo docker run --name db-container mysql
sudo docker run --name app-container --link db-container:database myapp

Docker 고급 기술

컨테이너 리소스 관리

graph TD
    A[리소스 관리] --> B[CPU 제한]
    A --> C[메모리 제약]
    A --> D[저장소 할당량]

리소스 할당 예제

## 컨테이너를 1개 CPU 코어와 512MB 메모리로 제한
sudo docker run -it --cpus=1 --memory=512m ubuntu /bin/bash

## 메모리 및 스왑 제한 설정
sudo docker run -it --memory=1g --memory-swap=2g ubuntu /bin/bash

Docker Compose 를 이용한 다중 컨테이너 배포

version: "3"
services:
  web:
    image: nginx
    ports:
      - "8080:80"
  database:
    image: postgres
    environment:
      POSTGRES_PASSWORD: mysecretpassword

보안 권장 사항

보안 기법 구현 방법
루트가 아닌 컨테이너 Dockerfile 에서 USER 지시문 사용
읽기 전용 파일 시스템 볼륨 마운트에 :ro 플래그 추가
컨테이너 기능 제한 --cap-drop 및 --cap-add 사용

Docker Swarm 을 이용한 컨테이너 오케스트레이션

## Swarm 클러스터 초기화
sudo docker swarm init

## 복제본이 있는 서비스 생성
sudo docker service create --replicas 3 --name web nginx

## 서비스 동적으로 확장
sudo docker service scale web=5

고급 네트워크 구성

## 서브넷이 있는 사용자 정의 네트워크 생성
sudo docker network create \
  --driver bridge \
  --subnet 192.168.0.0/24 \
  --gateway 192.168.0.1 \
  custom_network

컨테이너 모니터링 및 로깅

## 실시간 컨테이너 로그
sudo docker logs -f container_name

## 컨테이너 메트릭 검사
sudo docker stats container_name

## 로그 파일 크기 제한
sudo docker run --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx

Dockerfile 최적화 기법

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

FROM openjdk:11-jre-slim
COPY --from=build /home/app/target/app.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

요약

Docker 는 소프트웨어 배포 방식에 혁신을 가져오는 기술로, 가볍고 휴대 가능하며 효율적인 컨테이너화 솔루션을 제공합니다. Docker 의 기본 개념, 아키텍처, 그리고 명령줄 기술을 숙달함으로써 개발자들은 애플리케이션 개발을 간소화하고, 시스템 일관성을 개선하며, 전체 인프라의 확장성과 성능을 향상시킬 수 있습니다.