이동건-3
[따배도] 7-1. Docker 컨테이너 리소스를 관리해야지 - 이론편
🧠 도커 컨테이너 리소스 관리 이론 정리
1. ✅ 도커 컨테이너 리소스 제한의 필요성
도커 컨테이너는 기본적으로 호스트의 리소스를 공유하지만, 무제한으로 사용하는 경우 다른 컨테이너나 시스템 전체에 영향을 줄 수 있습니다. 이를 방지하기 위해 다음과 같은 리소스에 대해 제한 설정이 가능합니다:
리소스 | 제한 대상 |
---|---|
메모리 (RAM) | 사용량, 스왑, 최소 보장 |
CPU | 사용 비율, 코어 할당, 우선순위 |
디스크 I/O | 읽기/쓰기 속도 및 IOPS 제한 |
2. 📦 메모리 제한 옵션
도커 컨테이너에서 메모리를 제한하는 주요 옵션은 다음과 같습니다:
옵션 | 설명 |
---|---|
| 최대 메모리 사용량 제한 |
| 최소 보장 메모리 설정 |
| 스왑 포함 최대 메모리 용량 설정 |
| OOM Killer 비활성화 설정 |
💡 예시
docker run -m 512m --memory-reservation=256m nginx
설정된 용량을 초과하면 컨테이너는 종료(OOM Kill) 될 수 있음
단위는
b
,k
,m
,g
사용 가능
3. 🖥️ CPU 리소스 제한 옵션
CPU는 절대 할당 또는 상대적 우선순위 방식으로 제한할 수 있습니다:
옵션 | 설명 |
---|---|
| 사용 가능한 CPU 비율 (예: |
| 지정된 코어만 사용 (예: |
| CPU 우선순위 가중치 설정 (기본 1024) |
💡 예시
docker run --cpus=1 --cpuset-cpus="0,1" --cpu-shares=512 nginx
cpuset-cpus
: 특정 코어만 사용cpu-shares
: 여러 컨테이너 간 상대적 CPU 사용량 결정
4. 💾 디스크 I/O 제한 옵션
디스크 I/O는 블록 장치 수준에서 읽기/쓰기 속도를 제한합니다:
옵션 | 설명 |
---|---|
| I/O 상대 가중치 (10~1000, 기본 500) |
| 장치별 초당 읽기 바이트 제한 |
| 장치별 초당 쓰기 바이트 제한 |
| 초당 읽기 횟수 제한 (IOPS) |
| 초당 쓰기 횟수 제한 (IOPS) |
💡 예시
docker run --device-read-bps /dev/sda:1mb --device-write-iops /dev/sda:100 nginx
IOPS는 SSD 성능과 네트워크 병목 방지에 특히 유용함
5. 📊 리소스 모니터링 방법
컨테이너 리소스 사용 현황을 실시간으로 파악하기 위한 명령어 및 도구:
도구/명령어 | 기능 |
---|---|
| CPU, 메모리, I/O 사용량 실시간 모니터링 |
| 구글이 개발한 컨테이너 모니터링 전용 웹 도구 |
| 컨테이너 상세 설정 정보 확인 가능 |
모니터링은 안정적인 운영 환경과 성능 튜닝에 필수입니다.
6. 🧩 전체 흐름 요약
메모리 제한:
-m
,--memory-reservation
, OOM 방지CPU 제한:
--cpus
,--cpuset-cpus
,--cpu-shares
디스크 I/O 제한:
--blkio-weight
,--device-read-bps
등리소스 모니터링:
docker stats
,cAdvisor
컨테이너 리소스 제한은 성능 안정성 확보 및 멀티테넌시 환경 보호를 위한 필수 관리 기능입니다.
[따배도] 8-1. Docker Container Storage - 이론편
💾 도커 컨테이너 데이터 보존 및 볼륨 마운트 정리
1. ✅ 도커 컨테이너에서 데이터를 영구 보존하는 이유
도커 컨테이너는 일시적이고 가벼운 실행 환경입니다.
컨테이너 내부에 저장된 데이터는 컨테이너가 삭제되면 함께 사라지기 때문에, 중요한 데이터를 안전하게 보존하려면 별도의 **외부 저장 방식(볼륨)**이 필요합니다.
예: MySQL 컨테이너에서 생성된 DB 데이터, 웹서버의 정적 콘텐츠 등
2. 📦 볼륨(VOLUME) 마운트의 개념
도커는 호스트 디렉토리와 컨테이너 디렉토리를 연결(마운트)하는 방식으로 데이터를 외부에 저장합니다.
이 방식은 컨테이너를 삭제하거나 재시작해도 데이터가 보존되는 장점이 있습니다.
🧩 주요 마운트 방식 (-v
옵션)
형식 | 설명 |
---|---|
| 일반적인 마운트. 컨테이너의 데이터가 호스트에 저장됨 |
| 읽기 전용 마운트. 보안 강화 |
| Docker가 자동으로 익명 볼륨 생성 (임시 저장) |
💡 예시
docker run -v /host/db:/var/lib/mysql mysql
docker run -v /host/web:/usr/share/nginx/html:ro nginx
3. 🛠️ 도커 볼륨 마운트를 통한 영구 저장 전략
항목 | 설명 |
---|---|
저장 위치 | 도커 호스트 내부 또는 외부 디스크 |
적용 대상 | DB 데이터, 로그, 업로드 파일 등 중요 데이터 |
장점 | 컨테이너 삭제 시에도 데이터 유지 가능 |
보안 설정 |
|
관리 방식 | 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. 📊 실제 운영에서의 활용 및 주의사항
주제 | 설명 |
---|---|
데이터 유실 방지 | 컨테이너 삭제 시 데이터를 보존할 수 있는 유일한 방법 |
보안 | 중요한 호스트 디렉토리는 읽기 전용( |
관리 도구 |
|
실습 권장 | 실제 환경에서 웹 서버, DB에 적용하여 테스트 필요 |
🔚 전체 요약
컨테이너는 기본적으로 데이터 비영속성
-v
옵션으로 호스트 디렉토리와 연결하여 영구 저장 가능읽기 전용, 공유 마운트 등 다양한 형태 존재
여러 컨테이너 간 데이터 공유도 쉽게 구현 가능
실제 운영에 필수적인 기능 → 데이터 보호와 유지 관리 핵심
[따배도] 9-1. 컨테이너간 통신(네트워크) - 이론편
🌐 도커 컨테이너 통신 및 네트워크 구조 정리
1. ✅ 컨테이너 통신의 핵심 개념
도커에서 컨테이너 간의 통신 및 외부와의 연결은 가상 네트워크 인터페이스와 포트 포워딩, 그리고 사용자 정의 네트워크(User-defined Network) 기능을 통해 이루어집니다.
항목 | 설명 |
---|---|
도커 제로 인터페이스 | 기본 브릿지 네트워크 (docker0), 172.17.0.0/16 IP 대역 |
포트 포워딩 |
|
사용자 정의 네트워크 | 직접 네트워크를 생성해 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가 직접 접근
요약 흐름:
docker network create my-net
docker run --network my-net --name mysql ...
docker run --network my-net -e WORDPRESS_DB_HOST=mysql ...
이 방식으로 WordPress 컨테이너는 DB 컨테이너와 안전하게 통신할 수 있습니다.
6. 📌 정리 – 네 가지 핵심 질문과 답변
질문 | 설명 |
---|---|
컨테이너는 어떻게 통신하나요? | 기본 브릿지 네트워크를 통해 내부 IP로 통신합니다. |
컨테이너 포트를 외부로 노출할 수 있나요? |
|
컨테이너 네트워크를 추가할 수 있나요? |
|
컨테이너끼리 통신은 어떻게 하나요? | 동일 네트워크에 존재하면 컨테이너 이름 또는 IP로 직접 통신 가능합니다. |
[따배도] 10-1. 빌드에서 운영까지 (using Docker Compose) - 이론편
🐳 Docker Compose 개념 및 사용법 정리
1. ✅ Docker Compose란?
Docker Compose는 여러 개의 컨테이너를 일괄적으로 정의, 실행, 관리할 수 있도록 도와주는 도커의 오케스트레이션 도구입니다.
항목 | 설명 |
---|---|
목적 | 여러 컨테이너 환경을 한 번에 실행하고 관리 |
구성 방식 |
|
실행 명령 |
|
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. 🚀 주요 명령어 및 사용법
명령어 | 기능 |
---|---|
| 정의된 모든 컨테이너 실행 (빌드 포함 가능) |
| 모든 컨테이너 및 네트워크 정리 |
| 실행 중인 컨테이너 상태 확인 |
| 컨테이너 일시 중지 |
| 컨테이너 재시작 |
| 로그 출력 |
| 특정 서비스의 인스턴스를 3개로 확장 |
4. 🔗 컨테이너 연결 및 볼륨 관리
링크/통신
동일docker-compose.yml
내 서비스는 자동 연결되어 이름으로 접근 가능 (예:db
)볼륨 마운트
volumes: - ./data:/var/lib/mysql
→ 호스트의 디렉터리를 컨테이너 내부 경로에 연결하여 데이터 지속성 확보
5. 🌐 환경 변수, 포트 및 재시작 정책
항목 | 설명 |
---|---|
| 컨테이너에 환경 변수 지정 (예: DB 비밀번호) |
| 호스트 포트 ↔ 컨테이너 포트 매핑 |
| 재시작 정책 설정 ( |
| 서비스 간 실행 순서 설정 (예: DB → 웹) |
예를 들어 WordPress가 DB보다 먼저 실행되지 않도록
depends_on
을 사용하여 제어합니다.
6. 🧩 Docker Compose 버전별 기능 차이
버전 | 특징 |
---|---|
|
|
| 스웜 모드, 볼륨/네트워크 관리 강화 (일반적으로 추천) |
YAML 파일 내
version:
항목으로 명시하며, 기능 호환성에 따라 선택해야 함
7. 📦 서비스 구성 디렉터리 구조 예시
my-service/
├── docker-compose.yml
├── db/
│ └── Dockerfile
├── web/
│ └── Dockerfile
프로젝트 디렉터리 내에서
docker-compose up
실행 시 모든 정의가 적용됩니다.
🔚 요약
핵심 요소 | 요약 설명 |
---|---|
정의 방식 | YAML 파일 기반 설정 |
관리 도구 |
|
연결/연동 | 서비스 간 자동 통신, 실행 순서 제어 |
장점 | 컨테이너 구성의 일관성, 복잡한 환경의 간소화, 반복 실행 용이 |