이동건-3

이동건-3

 

[따배도] 7-1. Docker 컨테이너 리소스를 관리해야지 - 이론편

 

🧠 도커 컨테이너 리소스 관리 이론 정리

1. ✅ 도커 컨테이너 리소스 제한의 필요성

도커 컨테이너는 기본적으로 호스트의 리소스를 공유하지만, 무제한으로 사용하는 경우 다른 컨테이너나 시스템 전체에 영향을 줄 수 있습니다. 이를 방지하기 위해 다음과 같은 리소스에 대해 제한 설정이 가능합니다:

리소스

제한 대상

리소스

제한 대상

메모리 (RAM)

사용량, 스왑, 최소 보장

CPU

사용 비율, 코어 할당, 우선순위

디스크 I/O

읽기/쓰기 속도 및 IOPS 제한


2. 📦 메모리 제한 옵션

도커 컨테이너에서 메모리를 제한하는 주요 옵션은 다음과 같습니다:

옵션

설명

옵션

설명

-m, --memory

최대 메모리 사용량 제한

--memory-reservation

최소 보장 메모리 설정

--memory-swap

스왑 포함 최대 메모리 용량 설정

--oom-kill-disable

OOM Killer 비활성화 설정

💡 예시

docker run -m 512m --memory-reservation=256m nginx
  • 설정된 용량을 초과하면 컨테이너는 종료(OOM Kill) 될 수 있음

  • 단위는 b, k, m, g 사용 가능


3. 🖥️ CPU 리소스 제한 옵션

CPU는 절대 할당 또는 상대적 우선순위 방식으로 제한할 수 있습니다:

옵션

설명

옵션

설명

--cpus

사용 가능한 CPU 비율 (예: 0.5 = 50%)

--cpuset-cpus

지정된 코어만 사용 (예: 0,2)

--cpu-shares

CPU 우선순위 가중치 설정 (기본 1024)

💡 예시

docker run --cpus=1 --cpuset-cpus="0,1" --cpu-shares=512 nginx
  • cpuset-cpus: 특정 코어만 사용

  • cpu-shares: 여러 컨테이너 간 상대적 CPU 사용량 결정


4. 💾 디스크 I/O 제한 옵션

디스크 I/O는 블록 장치 수준에서 읽기/쓰기 속도를 제한합니다:

옵션

설명

옵션

설명

--blkio-weight

I/O 상대 가중치 (10~1000, 기본 500)

--device-read-bps

장치별 초당 읽기 바이트 제한

--device-write-bps

장치별 초당 쓰기 바이트 제한

--device-read-iops

초당 읽기 횟수 제한 (IOPS)

--device-write-iops

초당 쓰기 횟수 제한 (IOPS)

💡 예시

docker run --device-read-bps /dev/sda:1mb --device-write-iops /dev/sda:100 nginx
  • IOPS는 SSD 성능과 네트워크 병목 방지에 특히 유용함


5. 📊 리소스 모니터링 방법

컨테이너 리소스 사용 현황을 실시간으로 파악하기 위한 명령어 및 도구:

도구/명령어

기능

도구/명령어

기능

docker stats

CPU, 메모리, I/O 사용량 실시간 모니터링

cAdvisor

구글이 개발한 컨테이너 모니터링 전용 웹 도구

docker inspect

컨테이너 상세 설정 정보 확인 가능

모니터링은 안정적인 운영 환경과 성능 튜닝에 필수입니다.


6. 🧩 전체 흐름 요약

  1. 메모리 제한: -m, --memory-reservation, OOM 방지

  2. CPU 제한: --cpus, --cpuset-cpus, --cpu-shares

  3. 디스크 I/O 제한: --blkio-weight, --device-read-bps

  4. 리소스 모니터링: docker stats, cAdvisor

컨테이너 리소스 제한은 성능 안정성 확보멀티테넌시 환경 보호를 위한 필수 관리 기능입니다.

 


 

[따배도] 8-1. Docker Container Storage - 이론편

 

💾 도커 컨테이너 데이터 보존 및 볼륨 마운트 정리

1. ✅ 도커 컨테이너에서 데이터를 영구 보존하는 이유

도커 컨테이너는 일시적이고 가벼운 실행 환경입니다.
컨테이너 내부에 저장된 데이터는 컨테이너가 삭제되면 함께 사라지기 때문에, 중요한 데이터를 안전하게 보존하려면 별도의 **외부 저장 방식(볼륨)**이 필요합니다.

예: MySQL 컨테이너에서 생성된 DB 데이터, 웹서버의 정적 콘텐츠 등


2. 📦 볼륨(VOLUME) 마운트의 개념

도커는 호스트 디렉토리컨테이너 디렉토리를 연결(마운트)하는 방식으로 데이터를 외부에 저장합니다.
이 방식은 컨테이너를 삭제하거나 재시작해도 데이터가 보존되는 장점이 있습니다.

🧩 주요 마운트 방식 (-v 옵션)

형식

설명

형식

설명

호스트경로:컨테이너경로

일반적인 마운트. 컨테이너의 데이터가 호스트에 저장됨

호스트경로:컨테이너경로:ro

읽기 전용 마운트. 보안 강화

컨테이너경로

Docker가 자동으로 익명 볼륨 생성 (임시 저장)

💡 예시

docker run -v /host/db:/var/lib/mysql mysql docker run -v /host/web:/usr/share/nginx/html:ro nginx

3. 🛠️ 도커 볼륨 마운트를 통한 영구 저장 전략

항목

설명

항목

설명

저장 위치

도커 호스트 내부 또는 외부 디스크

적용 대상

DB 데이터, 로그, 업로드 파일 등 중요 데이터

장점

컨테이너 삭제 시에도 데이터 유지 가능

보안 설정

ro 옵션으로 읽기 전용 마운트 가능

관리 방식

Docker CLI 명령 또는 Compose 파일로 설정


4. 🔄 컨테이너 간 데이터 공유

도커 볼륨을 사용하면 여러 컨테이너가 동일한 데이터를 참조하거나 공유할 수 있습니다.

💡 예시: 웹 서버 + 콘텐츠 생성기

docker run -v /data/html:/usr/share/nginx/html nginx docker run -v /data/html:/app/output content-generator
  • 첫 번째 컨테이너는 웹서버 (읽기)

  • 두 번째 컨테이너는 HTML 생성기 (쓰기)

이를 통해 생성-제공 구조를 손쉽게 구현할 수 있음


5. 🧠 컨테이너 스토리지 구조 이해

도커는 Union File System 구조를 사용합니다:

  • 이미지 레이어: 읽기 전용

  • 컨테이너 레이어: 읽기/쓰기 가능

  • 볼륨: 외부 영구 저장 공간

이 구조 덕분에 이미지는 재사용되며, 데이터는 영속적으로 분리 저장됩니다.


6. 📊 실제 운영에서의 활용 및 주의사항

주제

설명

주제

설명

데이터 유실 방지

컨테이너 삭제 시 데이터를 보존할 수 있는 유일한 방법

보안

중요한 호스트 디렉토리는 읽기 전용(:ro) 마운트 권장

관리 도구

docker volume 명령 또는 Docker Compose 사용 가능

실습 권장

실제 환경에서 웹 서버, DB에 적용하여 테스트 필요


🔚 전체 요약

  1. 컨테이너는 기본적으로 데이터 비영속성

  2. -v 옵션으로 호스트 디렉토리와 연결하여 영구 저장 가능

  3. 읽기 전용, 공유 마운트 등 다양한 형태 존재

  4. 여러 컨테이너 간 데이터 공유도 쉽게 구현 가능

  5. 실제 운영에 필수적인 기능 → 데이터 보호와 유지 관리 핵심

 


 

[따배도] 9-1. 컨테이너간 통신(네트워크) - 이론편

 

🌐 도커 컨테이너 통신 및 네트워크 구조 정리

1. ✅ 컨테이너 통신의 핵심 개념

도커에서 컨테이너 간의 통신 및 외부와의 연결은 가상 네트워크 인터페이스포트 포워딩, 그리고 사용자 정의 네트워크(User-defined Network) 기능을 통해 이루어집니다.

항목

설명

항목

설명

도커 제로 인터페이스

기본 브릿지 네트워크 (docker0), 172.17.0.0/16 IP 대역

포트 포워딩

-p 호스트포트:컨테이너포트 옵션을 통해 외부 노출

사용자 정의 네트워크

직접 네트워크를 생성해 IP 관리 및 컨테이너 간 링크 지원


2. 🔌 도커 브릿지 네트워크(docker0)의 구조

  • 도커 데몬이 실행되면 자동 생성되는 브릿지 네트워크

  • 모든 기본 컨테이너는 이 네트워크에 자동 연결됨

  • 게이트웨이 IP: 172.17.0.1

  • 각 컨테이너는 172.17.x.x 대역의 IP를 할당받아 내부 통신 가능

NAT(Network Address Translation) 기능을 사용해 외부와 통신하며, 호스트 포트를 통해 접근 가능


3. 🚪 포트 포워딩 설정 방식

컨테이너의 내부 서비스(예: 웹 서버)를 외부에 노출하려면 포트 포워딩을 설정해야 합니다.

예시 명령어:

docker run -d -p 8080:80 nginx
  • 외부(호스트) 8080 포트 → 컨테이너의 80 포트로 연결됨

  • -P(대문자) 옵션 사용 시, 호스트의 랜덤 포트에 매핑

주요 특징:

  • 동일한 포트를 여러 컨테이너에 사용할 수 없음 (IP 충돌 방지)

  • 포트 변경 가능: -p 80:8080 → 호스트 80, 컨테이너 8080


4. 🛠 사용자 정의 네트워크와 고급 설정

도커에서는 bridge, host, none 외에 사용자 정의 네트워크를 생성해 사용할 수 있습니다.

예시:

docker network create \ --subnet=192.168.100.0/24 \ --gateway=192.168.100.1 \ custom-net
  • 고정 IP 할당 가능 (--ip 옵션)

  • 네트워크 이름으로 컨테이너 간 통신 가능

  • DNS 역할 수행 → ping mysql-container

유저 정의 네트워크는 컨테이너 간 링크 기능격리에 유리


5. 💡 실제 예시: WordPress – MySQL 간 통신

WordPress와 MySQL 컨테이너 간 통신 구조를 통해 네트워크 이해도를 높일 수 있습니다.

구성 방식:

  • 동일한 사용자 정의 네트워크에 배치

  • WordPress는 MySQL 컨테이너 이름 또는 IP로 연결 설정

  • MySQL 포트(3306)는 내부에서만 사용, WordPress가 직접 접근

요약 흐름:

  1. docker network create my-net

  2. docker run --network my-net --name mysql ...

  3. docker run --network my-net -e WORDPRESS_DB_HOST=mysql ...

이 방식으로 WordPress 컨테이너는 DB 컨테이너와 안전하게 통신할 수 있습니다.


6. 📌 정리 – 네 가지 핵심 질문과 답변

질문

설명

질문

설명

컨테이너는 어떻게 통신하나요?

기본 브릿지 네트워크를 통해 내부 IP로 통신합니다.

컨테이너 포트를 외부로 노출할 수 있나요?

-p 또는 -P 옵션을 통해 포트 포워딩이 가능합니다.

컨테이너 네트워크를 추가할 수 있나요?

docker network create로 사용자 정의 네트워크를 생성할 수 있습니다.

컨테이너끼리 통신은 어떻게 하나요?

동일 네트워크에 존재하면 컨테이너 이름 또는 IP로 직접 통신 가능합니다.

 


 

[따배도] 10-1. 빌드에서 운영까지 (using Docker Compose) - 이론편

 

🐳 Docker Compose 개념 및 사용법 정리

1. ✅ Docker Compose란?

Docker Compose는 여러 개의 컨테이너를 일괄적으로 정의, 실행, 관리할 수 있도록 도와주는 도커의 오케스트레이션 도구입니다.

항목

설명

항목

설명

목적

여러 컨테이너 환경을 한 번에 실행하고 관리

구성 방식

YAML 파일을 사용해 서비스 정의

실행 명령

docker-compose up, docker-compose down, docker-compose ps

YAML 파일을 통해 서비스, 이미지, 포트, 환경 변수, 볼륨, 링크 등 다양한 설정을 구성할 수 있습니다.


2. 🧱 기본 구조: docker-compose.yml 예시

version: '3' services: db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example volumes: - db-data:/var/lib/mysql web: image: wordpress ports: - "8080:80" depends_on: - db volumes: db-data:

services 아래에 실행할 컨테이너를 정의하며, 각 서비스는 독립적인 컨테이너입니다.


3. 🚀 주요 명령어 및 사용법

명령어

기능

명령어

기능

docker-compose up

정의된 모든 컨테이너 실행 (빌드 포함 가능)

docker-compose down

모든 컨테이너 및 네트워크 정리

docker-compose ps

실행 중인 컨테이너 상태 확인

docker-compose stop

컨테이너 일시 중지

docker-compose restart

컨테이너 재시작

docker-compose logs

로그 출력

docker-compose scale web=3

특정 서비스의 인스턴스를 3개로 확장


4. 🔗 컨테이너 연결 및 볼륨 관리

  • 링크/통신
    동일 docker-compose.yml 내 서비스는 자동 연결되어 이름으로 접근 가능 (예: db)

  • 볼륨 마운트

    volumes: - ./data:/var/lib/mysql

    → 호스트의 디렉터리를 컨테이너 내부 경로에 연결하여 데이터 지속성 확보


5. 🌐 환경 변수, 포트 및 재시작 정책

항목

설명

항목

설명

environment:

컨테이너에 환경 변수 지정 (예: DB 비밀번호)

ports:

호스트 포트 ↔ 컨테이너 포트 매핑

restart:

재시작 정책 설정 (always, on-failure, no)

depends_on:

서비스 간 실행 순서 설정 (예: DB → 웹)

예를 들어 WordPress가 DB보다 먼저 실행되지 않도록 depends_on을 사용하여 제어합니다.


6. 🧩 Docker Compose 버전별 기능 차이

버전

특징

버전

특징

2.x

build, depends_on, volumes_from 등 기본 기능 제공

3.x

스웜 모드, 볼륨/네트워크 관리 강화 (일반적으로 추천)

YAML 파일 내 version: 항목으로 명시하며, 기능 호환성에 따라 선택해야 함


7. 📦 서비스 구성 디렉터리 구조 예시

my-service/ ├── docker-compose.yml ├── db/ │ └── Dockerfile ├── web/ │ └── Dockerfile
  • 프로젝트 디렉터리 내에서 docker-compose up 실행 시 모든 정의가 적용됩니다.


🔚 요약

핵심 요소

요약 설명

핵심 요소

요약 설명

정의 방식

YAML 파일 기반 설정

관리 도구

docker-compose CLI 명령어 활용

연결/연동

서비스 간 자동 통신, 실행 순서 제어

장점

컨테이너 구성의 일관성, 복잡한 환경의 간소화, 반복 실행 용이