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

DockerBeginner
지금 연습하기

소개

이 포괄적인 Docker 컨테이너 튜토리얼은 개발자 및 IT 전문가에게 컨테이너화된 애플리케이션을 이해하고, 설치하고, 관리하는 기본적인 가이드를 제공합니다. 핵심 컨테이너 개념, 설치 절차, 그리고 실용적인 명령어를 탐색함으로써 학습자는 현대 소프트웨어 배포 기술에 대한 실질적인 기술을 습득하게 될 것입니다.

Docker 컨테이너 기본

컨테이너 기술 소개

Docker 컨테이너는 소프트웨어 배포 및 애플리케이션 관리에 혁명적인 접근 방식을 제시합니다. 컨테이너화를 통해 개발자는 애플리케이션과 전체 런타임 환경을 함께 패키징하여 다양한 컴퓨팅 플랫폼에서 일관적인 성능을 보장할 수 있습니다.

Docker 컨테이너의 핵심 개념

Docker 컨테이너는 애플리케이션 실행에 필요한 모든 요소 (코드, 런타임, 시스템 도구, 라이브러리, 설정) 를 포함하는 경량의 독립 실행형 패키지입니다. 기존 가상 머신과 달리 컨테이너는 호스트 시스템의 커널을 공유하여 더욱 효율적이고 빠르게 시작할 수 있습니다.

graph TD A[애플리케이션 코드] --> B[Docker 컨테이너] B --> C[일관된 배포] B --> D[격리된 환경]

주요 컨테이너 특징

특징 설명
이식성 다양한 환경에서 일관되게 실행 가능
경량성 최소한의 리소스 소비
확장성 쉽게 복제 및 확장 가능
격리 애플리케이션 환경 분리

Ubuntu 22.04 에서 Docker 컨테이너 설치

## 패키지 인덱스 업데이트
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)] $(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 컨테이너 명령어

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

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

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

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

Docker 컨테이너 활용 사례

Docker 컨테이너는 마이크로서비스 아키텍처, 지속적 통합/지속적 배포 (CI/CD), 클라우드 네이티브 애플리케이션, 개발 환경 표준화에 이상적입니다.

컨테이너 연결성

Docker 네트워크 아키텍처

Docker 는 컨테이너가 서로 및 외부 네트워크와 통신할 수 있도록 다양한 네트워킹 모드를 제공합니다. 이러한 연결성 방법을 이해하는 것은 효과적인 컨테이너 관리 및 애플리케이션 배포에 필수적입니다.

graph LR A[Docker 호스트] --> B[브리지 네트워크] B --> C[컨테이너 1] B --> D[컨테이너 2] A --> E[호스트 네트워크] A --> F[오버레이 네트워크]

Docker 네트워크 유형

네트워크 유형 설명 사용 사례
브리지 기본 네트워크 모드 격리된 컨테이너 간 통신
호스트 직접 호스트 네트워크 접근 고성능 시나리오
오버레이 멀티 호스트 네트워크 통신 분산 시스템
Macvlan 직접 물리적 네트워크 연결 네트워크 특정 요구 사항

사용자 정의 Docker 네트워크 생성

## 브리지 네트워크 생성
docker network create --driver bridge my_custom_network

## 사용 가능한 네트워크 목록
docker network ls

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

컨테이너 네트워크 연결 방법

## 특정 네트워크로 컨테이너 실행
docker run -d --name web_server --network my_custom_network nginx

## 실행 중인 컨테이너를 네트워크에 연결
docker network connect my_custom_network existing_container

## 컨테이너를 네트워크에서 분리
docker network disconnect my_custom_network existing_container

포트 매핑 및 노출

## 컨테이너 포트를 호스트 포트에 매핑
docker run -p 8080:80 nginx

## 여러 포트 노출
docker run -p 8080:80 -p 443:443 web_application

컨테이너 쉘 접근

## 대화형 쉘 접근
docker exec -it container_name /bin/bash

## 실행 중인 컨테이너에서 명령 실행
docker exec container_name ls /app

컨테이너 통신 기법

컨테이너는 다음을 통해 통신할 수 있습니다.

  • 공유 네트워크
  • 환경 변수
  • 볼륨 마운트
  • Docker Compose 구성

컨테이너 관리

컨테이너 수명주기 관리

Docker 컨테이너는 체계적인 관리와 모니터링이 필요한 고유한 수명주기 단계를 가지고 있습니다. 이러한 단계를 이해하면 효율적인 컨테이너 배포 및 유지 관리가 가능합니다.

graph LR A[이미지 가져오기] --> B[컨테이너 생성] B --> C[컨테이너 시작] C --> D[컨테이너 실행 중] D --> E[컨테이너 중지] E --> F[컨테이너 제거]

컨테이너 수명주기 명령어

명령어 기능 예시
docker pull 이미지 다운로드 docker pull ubuntu
docker create 컨테이너 생성 docker create nginx
docker start 컨테이너 시작 docker start container_id
docker stop 컨테이너 중지 docker stop container_id
docker rm 컨테이너 제거 docker rm container_id

컨테이너 리소스 관리

## 리소스 사용량이 표시된 실행 중인 컨테이너 목록
docker stats

## 컨테이너 리소스 제한
docker run -d --cpus=1 --memory=512m nginx

## 컨테이너 리소스 업데이트
docker update --cpus=2 --memory=1g container_name

컨테이너 모니터링 기법

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

## 실시간 로그 모니터링
docker logs -f container_name

## 컨테이너 메타데이터 검사
docker inspect container_name

컨테이너 백업 및 복구

## 컨테이너 이미지 스냅샷 생성
docker commit container_name backup_image

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

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

고급 컨테이너 관리

## 사용되지 않는 컨테이너 정리
docker container prune

## 중지된 모든 컨테이너 제거
docker rm $(docker ps -a -q)

## 중복 이미지 정리
docker image prune

컨테이너 오케스트레이션 기본

Docker Swarm 과 Kubernetes 는 여러 호스트에서 확장, 로드 밸런싱 및 자동 배포를 위한 고급 컨테이너 관리 기능을 제공합니다.

요약

Docker 컨테이너는 뛰어난 이식성, 효율성 및 확장성을 제공하는 강력한 소프트웨어 배포 접근 방식입니다. 컨테이너 기술을 숙달함으로써 개발자는 일관되고 격리된 환경을 만들어 다양한 컴퓨팅 플랫폼에서 애플리케이션 개발, 테스트 및 프로덕션 워크플로우를 간소화할 수 있습니다.