클라우드정리(Docker4)

열공하는웅2·2025년 11월 6일

클라우드

목록 보기
6/13

🐳 Docker Alpine 정리

1. 개요
Docker Alpine은 이미지 크기를 최소화가볍고 빠른 컨테이너 실행을 가능하게 하는 Docker 이미지다.
Windows 환경에서의 Server CoreNano Server와 유사한 개념이다.


2. 특징

  • 이미지 크기가 매우 작아도 실행에는 문제가 없음
  • 클라우드 환경에서 다수의 컨테이너를 동시에 운영하기 적합
  • 예: Ubuntu 대비 외부 노드 저장 공간 절약 가능

3. 활용 예시

  • busybox처럼 약 8MB의 초소형 Linux 기반으로도 수백 개 서버 운영 가능

  • 웹 서버 예시:

    • busybox + Flask와 같은 초경량 Linux 조합
    • 외부 저장 공간에 컬러풀한 웹 페이지를 저장 후 연계 가능
    • 가볍고 효율적인 웹 서버 구현 가능

4. 요약

Docker Alpine = “작고 빠른 경량 Linux Docker 이미지”
→ 저장 공간 절약 + 다중 컨테이너 운영에 최적


docker ps한 결과
1/3 크기임.

컨테이너를 start했는데

ps에 뜨지않음.

그래서 log 해봄.

데이터베이스의 환경변수가 비어있는게 원인임을 알 수 있음.


🧾 Docker Logs & Fluentd 정리


🐋 Docker Logs

  • 역할:
    특정 컨테이너의 활동 이력(로그)을 보여줌.
    표준 출력(StdOut)과 에러(StdErr) 로그를 통해 컨테이너 내부 동작을 확인할 수 있다.

  • 명령어 형식:

    docker logs [OPTIONS] CONTAINER
  • 주요 옵션:

    • -f : 실시간 로그 출력 (follow log output)
    • -n : 마지막 n개의 로그만 출력 (tail string)
    • -t : 로그에 타임스탬프 표시 (timestamps)
  • 기타:
    로그 데이터는 외부 Ubuntu 노드 등에서 수집 및 관리 가능


🪶 Fluentd 로깅

  • 정의:
    다양한 로그를 수집 및 저장하는 오픈소스 로깅 툴.
    컨테이너 로그를 AWS S3, Hadoop HDFS, MongoDB 등으로 전송 가능.

  • 특징:

    • 플러그인을 통해 다양한 저장소에 로그 저장 가능
    • MongoDB와 연동 시 Schema(name, data_type, size 등)을 미리 정의하지 않아도 됨
    • NoSQL 데이터베이스 방식으로 유연한 데이터 저장 지원

요약:

docker logs → 컨테이너의 로그를 실시간 확인
fluentd → 로그를 중앙 집중식으로 수집·저장 (AWS, Hadoop, MongoDB 등)


docker run -d --name flunetd -p 24224:24224 -v $(pwd)/fluent.conf:/fluent/etc/fluent.conf -e FLUENTD_CONF=fluent.conf alicek106/fluentd:mongo

docker images

docker run -d -p 8000:80 --log-driver=fluentd --log-opt fluentd-address=192.168.100.180:24224 --log-opt tag=docker.nginx.webser nginx:latest

🧠 컨테이너에 리소스 할당하기


📌 개요

Docker 이미지로 실행되는 컨테이너들은 수평적 개념으로 관리된다.
즉, 각 컨테이너가 CPU, RAM, HDD(Block I/O) 등의 리소스를 개별적으로 분할하여 사용하도록 설정할 수 있다.


⚙️ 리소스 지정 필요성

  • 컨테이너를 생성할 때 리소스를 지정하지 않으면,
    외부 Ubuntu 노드의 자원을 무한정 사용할 수 있음.
  • 이 경우, 특정 컨테이너가 자원을 독점하여
    다른 컨테이너의 실행이 불안정해질 수 있다.

✅ 따라서 컨테이너 생성 시 리소스 한정 옵션을 설정하는 것이 중요하다.
예: --memory, --cpus, --blkio-weight


🧩 예시 상황

  • Database, Mail, Web Server 등은 항상 동작하며 리소스를 많이 소모하는 서비스.
    → 이 경우 리소스를 넉넉히 할당하거나 별도 컨테이너로 분리하는 것이 좋다.
  • 반면 DNS, DHCP, Proxy 등은 상대적으로 가벼운 서비스.
    → 여러 개를 하나의 서버에서 동시에 실행해도 무방하다.

🖥️ 서버 구성 시 고려

  • Standalone Server: 리소스를 많이 사용하는 독립형 서버
  • Super Daemon (xinetd):
    리소스를 적게 사용하는 여러 서비스를 child daemon 형태로 묶어 실행

📘 요약

컨테이너는 리소스를 명시적으로 제한하지 않으면 자원 경쟁이 발생할 수 있음.
따라서 CPU, RAM, I/O 등을 적절히 분배하여 효율적으로 운영하는 것이 핵심이다.


⚙️ Docker 리소스 설정 정리


🧩 주요 설정 명령어

구분명령어설명
RAM 제한docker run --memory="1g" ubuntu:16.04컨테이너가 사용할 메모리(RAM)를 1GB로 제한
CPU 제한docker run -it --cpu-shares 1024 ubuntu:16.04CPU의 가중치(비율)를 설정. 기본값은 1024 (1MB 기준)
디스크 I/O 제한docker run -it --device-write-bps /dev/sda:1mb ubuntu:16.04HDD의 입출력 속도(초당 1MB) 제한

💡 추가 설명

  • HDD 입출력 속도 설정은 외부 Ubuntu의 CPU에서 동작하는 프로세스 기반이므로,
    저장공간 자체를 분리하는 것이 아니라 속도를 제한하는 방식이다.
    (즉, 컨테이너가 HDD 용량을 직접 점유하지 않는다.)

🔍 리소스 확인 및 수정

  • 리소스 확인

    docker inspect [컨테이너명 또는 ID]

    → 현재 컨테이너의 메모리, CPU, I/O 제한 설정을 확인 가능

  • 리소스 변경

    docker update [옵션] [컨테이너명]

    → 실행 중인 컨테이너의 리소스 제한 값을 동적으로 수정 가능


📘 요약

  • --memory : RAM 제한
  • --cpu-shares : CPU 사용 비율 제한
  • --device-write-bps : HDD I/O 속도 제한
  • inspect : 설정 확인
  • update : 설정 변경

docker run --name cpu-share --cpu-shares 1024 ubuntu:14.04
root@ubuntu18-1:/home/ubuntu# docker run --name cpu_1024 --cpu-shares 1024 alicek106/stress stress -cpu 1


htop


🖥️ Docker로 서비스 구축하기


📌 개요

기존에는 Linux 서버에 직접 여러 서비스를 설치하여 운영했지만,
이제는 Docker 컨테이너를 이용해 동일한 서비스를 손쉽게 구축할 수 있다.

예시:
Nginx 웹 서버, FTP 서버, MySQL DB 서버 등을 각각 컨테이너로 분리 실행


⚙️ 주요 서비스별 Docker 활용 예시

구분Linux 기본 서비스Docker에서 사용 예시
웹 서버Apache2Nginx
FTP 서버vsFTP (기본) / pureFTP / wuFTPpureFTP, wuFTP
DB 서버PostgreSQL, MariaDBMySQL

🧩 추가 정보

  • Linux에서의 기본 FTP 서버는 vsFTP이며,
    pureFTP, wuFTP 역시 널리 사용된다.
  • MySQL은 Docker 환경에서도 가장 자주 사용되는 데이터베이스 중 하나이다.
  • 공식 Docker Hub(https://hub.docker.com)에서
    각 서버의 이미지(Nginx, MySQL, vsFTP 등)를 직접 확인 및 다운로드 가능하다.

📘 요약

Docker를 사용하면 웹 서버(Nginx), FTP 서버(vsFTP, pureFTP),
DB 서버(MySQL) 등을 컨테이너 단위로 손쉽게 구성하고
서비스 환경을 빠르게 배포·관리할 수 있다.

docker run -d 21:21 -p 30000-30002:30000-30002 --name=ftpd gimoh/pureftpd -c 3 -j -l puredb:/etc/pureftp.pdb -p 30000:30002
docker images

docker exec -it ftpd /bin/sh -l
adduer-ftp paul -m
paul
paul
ftp -p localhost 21


그러면 설치가 된다.


여기서도 볼 수 있음.


docker yml

version: '3.1'
services:
db:
image: mysql(:5.7)
restart: always
command: --lower_case_table_names=1 ## 대소문자 구분한다는 의미
container_name: mysql-db
environment:

  • MYSQLDATABASE=mysql-condb ## 생성할 DB
  • MYSQL_ROOT_PASSWORD=rootoor ## root의 패스워드
  • TZ=Asia/Seoul ## TimeZone 지정인데 생략 가능
    command:
  • --character-set-server=utf8mb4 ## 문자열 지정, 옵션은 --로 지정
  • --collation-server=utf8mb4_unicode_ci
    volumes:
  • ./db:/var/lib/mysql ## db 볼륨 지정
    ports:
  • 3456:3306 ## 외부 연결 포트 매핑

yaml 파일 실행.

외부에서 생성 확인.


🐳 docker-compose.yml 파일 정리


📌 개요

  • docker-compose.yml 파일은 여러 개의 Docker 컨테이너를
    한 번에 정의하고 실행할 수 있게 해주는 YAML(야믈) 형식의 스크립트 파일이다.
  • 예를 들어 MySQL 데이터베이스 서버를 포함한 환경을 자동으로 구성할 수 있다.

⚙️ Dockerfile과의 차이

구분Dockerfiledocker-compose.yml
목적하나의 이미지를 만드는 스크립트여러 컨테이너를 조합하여 실행 관리
실행 명령docker build, docker rundocker-compose up, docker-compose down
초점이미지 생성컨테이너 orchestration (조합, 연결, 네트워크 설정 등)

💡 주요 특징

  • 여러 컨테이너의 실행 및 관계를 정의할 수 있음
    (예: 웹 서버 + DB 서버 + 캐시 서버를 동시에 구성)
  • docker-compose up 명령어 하나로 전체 환경을 실행 가능
  • YAML 문법은 들여쓰기가 매우 중요하므로 띄어쓰기 주의 필요
  • Kubernetes에서도 유사한 개념의 YAML 파일로 여러 컨테이너(Pod)를 정의하고 관리함

🧱 예시

version: '3'
services:
  db:
    image: mysql:8.0
    container_name: mysql_db
    environment:
      MYSQL_ROOT_PASSWORD: mypw
      MYSQL_DATABASE: mydb
    ports:
      - "3306:3306"
  web:
    image: nginx:latest
    container_name: nginx_web
    ports:
      - "8080:80"
    depends_on:
      - db

📘 요약

docker-compose.yml여러 컨테이너를 한 번에 정의하고 관리하기 위한
YAML 기반 설정 파일로, 복잡한 환경을 자동화할 때 필수적이다.


edit connection(우클릭해서)


🐝 Docker Swarm 정리


📌 개요

지금까지의 Docker 실습은 하나의 Ubuntu 노드(서버) 에서 컨테이너를 실행하는 방식이었다.
하지만 단일 노드에서 여러 컨테이너를 운영하면,
CPU·RAM·HDD 등의 자원이 부족해지거나 노드 자체에 문제가 생길 경우
모든 컨테이너가 동시에 장애를 겪을 위험이 있다.

이 문제를 해결하기 위해 여러 노드를 묶어 하나의 클러스터처럼 운영하는 방식이 바로
👉 Docker Swarm 이다.


⚙️ Docker Swarm의 핵심 개념

구분설명
Swarm Cluster여러 Docker 노드를 묶은 집합 (Manager + Worker 구조)
Manager Node클러스터를 관리하고 작업(Task)을 스케줄링
Worker Node실제 컨테이너(Task)를 실행하는 노드
Service여러 개의 컨테이너를 묶어 하나의 애플리케이션 단위로 정의
Task각 노드에서 실행되는 실제 컨테이너 인스턴스
Load Balancing여러 노드에 컨테이너를 분산 배치하여 자원 효율성을 높임

💡 특징

  • 노드 간 자원 공유 및 부하 분산 (병렬 확장 가능)
  • 노드 장애 시 다른 노드로 자동 재할당 (복원력 향상)
  • 작업 스케줄링, 로드 밸런싱, 고가용성(HA) 지원
  • Kubernetes와 유사한 구조를 가지며, 비교적 간단한 설정으로 구성 가능

🧩 실습 환경 구성 예시

  1. Ubuntu 1세션을 Manager로 두고, Worker 1/2 노드 추가

    • Manager: master
    • Worker: worker1, worker2
  2. 필요한 설정 파일

    • /etc/hostname
    • /etc/network/interfaces (노드 간 통신 IP 설정)
  3. Hadoop 실습 구조처럼

    • master, slave1, slave2 형태로 동일한 구조를 사용 가능
  4. Multi-Kube나 Vagrant 활용 가능

    • vagrant up 으로 여러 VM을 동시에 띄워
      master(관리 노드) + worker1, worker2(작업 노드) 구성

⚙️ 명령어 요약

명령어설명
docker swarm init현재 노드를 Swarm Manager로 초기화
docker swarm join다른 노드를 Worker로 클러스터에 참여
docker node ls클러스터에 등록된 노드 목록 확인
docker service createSwarm 서비스(컨테이너 그룹) 생성
docker service ls실행 중인 서비스 목록 확인
docker service ps [서비스명]각 서비스의 Task(컨테이너) 상태 확인

📘 요약

Docker Swarm은 여러 노드를 하나의 클러스터로 묶어
자원 활용을 최적화하고, 장애 시 자동 복구 및 부하 분산을 수행하는 오케스트레이션 도구이다.
Kubernetes보다 간단하지만, 개념적으로 동일한 구조(Manager/Worker, Task, Service)를 가진다.


🐝 Swarm Mode 정리


📌 개요

Docker Swarm Mode는 Hadoop의
master(NameNode)slave(DataNode) 구조와 비슷한 개념이다.
즉, 매니저(Manager) 노드워커(Worker) 노드로 구성된다.


⚙️ 노드 구성 및 역할

구분설명
Manager Node (매니저 노드)워커 노드들을 관리하는 마스터 역할. 클러스터 제어, 스케줄링, 서비스 배포 관리
Worker Node (워커 노드)실제 컨테이너(Task)를 실행하는 노드. 매니저의 명령에 따라 컨테이너를 생성/삭제
Slave 역할Hadoop의 DataNode처럼, 실질적인 실행 담당 노드

💡 매니저 노드에서도 컨테이너를 실행할 수 있지만,
주로 워커 노드가 실제 서비스 수행을 담당한다.


⚙️ Quorum(정족수)의 개념

  • 매니저 노드는 클러스터 안정성을 위해 정족수(quorum) 개념을 사용한다.
  • 정족수란 “정상 운영을 위해 필요한 최소한의 매니저 노드 수”를 의미한다.
  • 클러스터는 항상 과반수의 매니저 노드가 살아있어야 정상 동작한다.
    → 예: 매니저 노드 3개 중 2개 이상이 동작해야 유지 가능.

🧩 예시로 보는 Swarm 동작 원리

예를 들어,

웹 서버 컨테이너 4개가 항상 실행되어야 한다면

  • Swarm은 매니저가 컨테이너 개수를 자동으로 유지(Replicas 관리)

    • 어떤 컨테이너가 죽으면 다른 노드에서 자동으로 새 컨테이너를 재생성함
  • 또한, 컨테이너 업데이트나 업그레이드 시
    순차적으로 하나씩 교체(rolling update)하여 서비스 중단 없이 업데이트 수행


💡 특징 요약

  • 클러스터 내에서 컨테이너를 자동 분산 배치
  • 매니저가 노드 상태를 감시하고, 장애 시 자동 복구
  • 최소 컨테이너 개수(Replica 수)를 보장
  • 업데이트 시 Rolling Update 방식 지원 (순차 업그레이드)
  • 부하가 한 노드에 집중되지 않고, 자동으로 분산 실행

📘 요약

Swarm Mode
여러 노드(Manager + Worker)로 구성된 클러스터 환경에서
컨테이너를 자동 배치·복구·업데이트 하며
Hadoop의 master/slave 구조와 유사한 분산형 오케스트레이션 시스템이다.


Swarm 실습

docker swarm init --advertise-addr 192.168.100.180

profile
훌륭한 it 엔지니어 꿈나무

0개의 댓글