클라우드 정리(Docker4,5)

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

클라우드

목록 보기
7/13

🐳 Docker Swarm 개요

  • 구성:
    Docker Swarm에서는 3개의 노드(master, slave1, slave2)를 구성하고 After_Swarm이라는 이름으로 저장한다.
    Kubernetes에서도 비슷하게 master, worker01, worker02 등으로 구성하여 동일한 개념으로 사용할 수 있다.
    또한 소프트웨어적으로 가상 노드를 생성해주는 Vagrant를 사용해 노드를 만들고 실습할 수 있다.

⚙️ 스웜의 핵심 개념: Service, Replica, Scale, Global

이 개념들은 Kubernetes(K8s)에서도 동일하게 사용된다.


✅ Service

  • 역할:
    스웜 모드에서는 컨테이너들을 Service(서비스) 단위로 관리한다.
    같은 이미지로 생성된 여러 컨테이너들을 제어하며, 각 컨테이너를 Task라고 부른다.
    Service는 매니저 노드에서 하나 이상 존재할 수 있다.

  • 예시 명령어:

    docker service create --name myweb --replicas 3 nginx:latest

    nginx:latest 이미지 컨테이너 3개(Task)가 생성되며, myweb이라는 이름의 서비스로 묶인다.
    이 컨테이너들은 Service를 통해 관리된다.

  • Kubernetes 대응 개념:
    Service가 동일한 역할을 수행한다.


✅ Replica

  • 역할:
    생성할 컨테이너 수를 지정하는 개념으로, --replicas 3 과 같이 지정한다.
    지정된 수만큼 컨테이너(Task)가 항상 실행되며, 일부 컨테이너가 중단되면 자동으로 재생성된다.
    일정한 수를 유지하기 위해 Rolling Update 방식으로 순차적으로 컨테이너를 업데이트하여 항상 동일한 개수를 유지한다.

  • Kubernetes 대응 개념:
    Replicaset이 이 역할을 수행한다.


요약하자면,

  • Service: 컨테이너들을 논리적으로 묶어 관리
  • Replica: 유지해야 할 컨테이너 개수 지정
  • 두 개념 모두 Kubernetes에서도 그대로 적용된다.

docker service create --name myweb1 ubuntu:16.04 /bin/sh -c "while true ; do echo "hello world" ; sleep 1 ; done"

docker service create --name myweb2 --replicas 5 -p 80:80 nginx:latest
=> 5개 생성

5개의 컨테이너가 하나의 서비스를 묶임.


마스터 노드에서는 당연히 실행.


slave2인 182 주소에서도 접속이 가능함.


docker service create --name myweb3 --mode global nginx:latest

🧩 장애 복구 (Fault Recovery)

  • 개념:
    스웜(Swarm) 모드에서는 특정 노드나 컨테이너가 고장나더라도 자동으로 복구가 이루어진다.
    즉, 고장난 노드에서 실행 중이던 컨테이너(Task)를 다른 노드로 이동시켜 전체적으로 컨테이너 수를 일정하게 유지한다.

⚙️ 장애 발생 시 동작 방식

  • 컨테이너 오류 시:
    해당 컨테이너만 자동 재생성되어 동일한 이미지로 다시 실행된다.
  • 노드 오류 시:
    고장난 노드에서 실행 중이던 컨테이너들이 다른 노드로 이동하여 실행된다.

🔁 Rolling Update: RollOut & RollBack

  • Rolling Update란?
    스웜 모드에서 제공하는 기능으로, 서비스를 중단하지 않고 점진적으로 컨테이너 이미지를 업데이트할 수 있다.
    기존 컨테이너를 모두 종료하지 않고 순차적으로 새로운 이미지를 적용한다.

  • RollOut:
    새로운 이미지로 업데이트하는 과정
    → 예: ubuntu:16.04ubuntu:18.04로 변경 시, 컨테이너를 하나씩 새 이미지로 교체하며 서비스 중단 없이 유지.

  • RollBack:
    업데이트 이후 문제가 발생할 경우, 이전 이미지로 되돌리는 과정
    → 예: 다시 ubuntu:16.04 이미지로 복귀.

  • Kubernetes와의 공통점:
    K8s에서도 동일하게 RolloutRollback 기능을 제공한다.


정리 요약

구분기능 설명예시
장애 복구고장난 노드/컨테이너 자동 복구 및 재배치컨테이너 수 자동 유지
RollOut새 이미지로 점진적 업데이트ubuntu:16.04 → ubuntu:18.04
RollBack이전 이미지로 되돌리기ubuntu:18.04 → ubuntu:16.04

💡 즉, Docker Swarm은 컨테이너의 가용성 유지무중단 업데이트를 위한 복구 메커니즘을 내장하고 있으며, Kubernetes에서도 동일한 원리로 적용된다.

🔐 Config와 Secret 개념 정리

ConfigSecret
도커 스웜(Docker Swarm)에서 실행 중인 컨테이너 내부로 외부 정보를 안전하게 전달하는 방식입니다.
즉, 컨테이너 이미지에 직접 값을 넣지 않고, 외부에서 필요한 설정이나 인증 정보를 주입하는 기능입니다.


⚙️ 컨테이너 내부로 정보 전달하는 기본 방식

  1. 환경변수(-e) 방식

    • 가장 기본적인 전달법
    • 실행 시 직접 값을 입력함
    docker run -e MYSQL_ROOT_PASSWORD=1234 mariadb
  2. compose.yml 방식

    • 미리 정보를 docker-compose.yml 파일에 기록
    • 실행 시 자동으로 컨테이너 내부에 값이 주입됨
    environment:
      - MYSQL_ROOT_PASSWORD=1234
  3. config & secret 방식

    • Swarm 모드에서만 사용 가능
    • 실행 중인 컨테이너에 안전하게 정보를 전달하기 위한 방법

🔒 Secret (보안 정보)

  • 비밀번호, SSH 키, 인증서, API 키 등 민감한 정보를 암호화된 형태로 컨테이너 내부에 전달

  • 예시:

    echo "mysecretpw" | docker secret create db_password -
    docker service create --name mariadb1 \
      --secret db_password \
      mariadb:10.11
  • 컨테이너 내부에서는 /run/secrets/db_password 파일 형태로 접근 가능


⚙️ Config (일반 설정 정보)

  • 암호화가 필요 없는 일반 설정 파일(Nginx 설정, Registry 설정 등)을 전달할 때 사용

  • 예시:

    docker config create nginx_conf ./nginx.conf
    docker service create --name web1 \
      --config source=nginx_conf,target=/etc/nginx/nginx.conf \
      nginx

🧩 Kubernetes(K8s)와의 대응 관계

Docker SwarmKubernetes
SecretSecret
ConfigConfigMap

👉 K8s에서도 개념은 동일하며,
Secret은 암호화된 데이터 전송, ConfigMap은 일반 설정 정보 전달에 사용됩니다.


요약

구분목적보안 여부전달 위치
환경변수간단한 값 전달컨테이너 실행 시 직접
Config일반 설정파일 전달내부 설정 파일로 전달
Secret비밀번호/키 등 민감 정보/run/secrets 경로로 전달

💡즉, Config는 일반 설정용, Secret은 보안 정보용이며,
둘 다 도커 스웜과 쿠버네티스에서 공통적으로 사용되는 정보 전달 메커니즘입니다.

docker run -d --name mysql-1
-e MYSQL_ROOT_PASSWORD=rootoor -e MYSQL_DATABASE=wd_db -v /home/wd_db:/var/lib/mysql mysql:5.7

docker exec -it mysql2 /bin/sh
cat /etc/docker/registry/


-e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" \
-e
MYSQL_PASSWORD_FILE="/run/secrets/mysql_password" \
-e MYSQL_DATABASES="wordpress"



🕸️ Swarm Network Pool 개념 정리

스웜(Swarm) 모드에서는 여러 노드에 분산된 컨테이너들을 하나의 서비스(Service) 단위로 묶어 관리합니다.
이때 동일한 이미지로 생성된 컨테이너들을 ‘태스크(Task)’ 라고 하며,
여러 태스크를 묶어 하나의 이름으로 접근할 수 있게 해주는 것이 Service입니다.


⚙️ 핵심 내용 요약

  • 스웜 모드에서는 동일한 컨테이너 태스크들을 하나의 Service로 통제합니다.
    → 예: 동일한 Nginx 컨테이너를 replicas=5 로 실행하면
    마스터(Master) 노드가 여러 워커(Worker) 노드에 5개의 태스크를 분산 배치합니다.

  • 이렇게 분산된 태스크들은 네트워크 풀(Pool) 에 의해 하나의 가상 네트워크로 묶입니다.
    → 즉, 각 노드에 컨테이너가 흩어져 있어도 하나의 네트워크처럼 동작함.

  • 외부에서 이 Service에 접근할 때,
    스웜은 어느 노드로 접근하든 자동으로 해당 컨테이너 중 하나로 라우팅(경로 찾기) 해줍니다.
    → 내부적으로는 “Ingress Routing Mesh”라는 기능이 작동합니다.


📡 구성 예시

구성 요소역할
Service동일한 컨테이너 태스크들을 하나의 논리적 단위로 묶음
Task실제로 실행되는 컨테이너 인스턴스
Network Pool여러 노드의 컨테이너를 하나의 네트워크로 연결
Routing Mesh외부 요청을 자동으로 서비스 내 컨테이너로 라우팅

🧱 예시 명령

# 동일한 Nginx 컨테이너 5개를 서비스로 실행
docker service create --name web --replicas 5 -p 80:80 nginx
  • 위 명령을 실행하면,

    • Nginx 컨테이너 5개(Task)가 여러 노드에 분산되어 실행됩니다.
    • 모든 노드는 80 포트로 요청을 받아 자동으로 서비스 내부의 컨테이너로 전달합니다.

🧩 정리

Swarm Network Pool
= 여러 노드에 흩어진 동일한 컨테이너(Task)들을
하나의 Service 이름으로 묶고,
이를 외부에서 단일 네트워크처럼 접근 가능하게 만들어주는
스웜 전용 네트워크 드라이버 기반 구조입니다.

docker service create --name hostname -p 8000:80 --relicas=3 alicek106/book:hostname

round-robin 식으로 3개가 번갈아 보인다.


overlay


🧩 Overlay 네트워크란?

  • 여러 노드 간의 컨테이너 통신을 가능하게 해주는 가상 네트워크입니다.
  • 도커 스웜(Swarm) 환경에서는 서로 다른 물리 노드의 컨테이너들이 하나의 네트워크처럼 통신할 수 있도록 해줍니다.

⚙️ 주요 특징

  1. 서브넷 공유

    • Overlay 네트워크는 자신만의 IP 대역을 가집니다.
    • 같은 서비스의 컨테이너들은 이 네트워크의 IP를 할당받아 서로 통신합니다.
  2. 노드 간 통신 지원

    • 서로 다른 노드(예: manager, slave1, slave2)에 있는 컨테이너라도
      Overlay 네트워크에 속하면 마치 같은 네트워크에 있는 것처럼 통신 가능합니다.
  3. Ingress 네트워크와의 관계

    • Ingress 네트워크는 외부 트래픽이 들어올 때 사용하는 네트워크이고,
      Overlay 네트워크는 서비스 내부(컨테이너 간) 통신용입니다.
    • 하지만 Overlay 네트워크에 연결된 컨테이너들은 모두 Ingress 네트워크(10.0.0.x 대역) 도 함께 사용합니다.

🧱 예시 (실제 IP 구조)

ur_web.1  →  10.0.0.58 / 172.18.0.6  ← slave2  
ur_web.2  →  10.0.0.56 / 172.21.0.9  ← master  
ur_web.3  →  10.0.0.57 / 172.18.0.4  ← slave1

해석:

  • 10.0.0.xIngress / Overlay 네트워크 주소
  • 172.x.x.x노드 내부(bridge) 네트워크 주소

즉,
각 노드(슬레이브/마스터)가 다른 네트워크(172대역)에 속해 있지만,
모두 Ingress(10.0.0.x) 네트워크를 통해 하나로 묶여 통신할 수 있습니다.


🧩 네트워크 연결 구조

각 컨테이너는 보통 eth0, eth1 인터페이스를 가집니다.

인터페이스용도
eth0Overlay 또는 Ingress 네트워크 연결
eth1로컬 브리지 네트워크 연결 (172.x.x.x)

그래서 컨테이너가 실행될 때 다음과 같은 구조로 연결됩니다 👇

컨테이너 eth0  ──> Ingress/Overlay (10.0.0.x)
컨테이너 eth1  ──> 로컬 브리지 (172.x.x.x)

🌐 정리

구분설명
Overlay 네트워크여러 노드의 컨테이너들이 같은 네트워크처럼 통신할 수 있게 하는 가상 네트워크
Ingress 네트워크외부 트래픽을 내부 서비스로 전달하는 네트워크 (Routing Mesh 동작)
IP 구조각 컨테이너는 로컬 IP(172.x.x.x) + Overlay IP(10.0.0.x)를 동시에 가짐
기능서로 다른 노드 간 컨테이너 통신, 서비스 간 라우팅 조정, 트래픽 분산

한 줄 정리

Overlay 네트워크는 여러 노드의 컨테이너를 하나의 논리적 네트워크(10.0.0.x)로 묶어서,
서로 다른 물리 노드에 있어도 내부 통신이 가능하게 만들어주는 Docker Swarm의 핵심 네트워크 구조입니다.


🧩 Service 발견 (Service Discovery)

Replicas 옵션을 사용하면 동일한 컨테이너 태스크(Task)를 여러 개 생성해 병렬로 실행할 수 있습니다.
이때 생성된 여러 컨테이너들은 하나의 Service 이름으로 통제되며,
서로의 존재를 알고 상호 통신할 수 있도록 자동으로 연결됩니다.


🧱 개념 설명

  • 여러 개의 동일한 컨테이너(Task)가 하나의 서비스(Service)로 묶임
    → 예: docker service scale 명령으로 복제 수를 늘릴 수 있음

    docker service scale web=5

    → 기존에 replicas=3이던 Nginx 컨테이너를 5개로 늘리면,
    새로운 2개의 컨테이너가 생성되어 기존 서비스 그룹에 자동 등록됩니다.

  • 이렇게 새로 생성된 컨테이너를 다른 컨테이너들이 자동으로 인식하고 연결하는 것
    Service Discovery (서비스 발견) 이라고 합니다.


⚙️ 작동 방식 예시

  • A ServiceB Service를 호출한다고 가정하면,
    A ServiceB ServiceIP 주소나 포트번호를 직접 몰라도 됩니다.
    단지 B Service의 이름(Service명) 으로 접근하면 됩니다.

  • Docker Swarm의 Overlay 네트워크 드라이버
    자동으로 5개의 B Service 중 하나로 트래픽을 라우팅해줍니다.

즉, A Service → B Service 호출 시:

A 컨테이너  →  Overlay 네트워크  →  B 컨테이너들 중 1개 자동 선택

📡 예시로 표현하면

서비스명복제 수(Replicas)IP 예시설명
A Service310.0.0.10~12요청을 보내는 서비스
B Service510.0.0.20~24요청을 받는 서비스 (Replicas 확장)

A의 컨테이너가 ping B 또는 curl http://b:80 을 하면,
Overlay 네트워크가 자동으로 B의 5개 중 한 컨테이너로 연결해줍니다.


🧭 핵심 포인트

구분설명
Service Discovery스웜 내부에서 서비스 이름만으로 컨테이너 간 자동 연결을 가능하게 하는 기능
Overlay 네트워크여러 노드의 컨테이너를 하나의 네트워크처럼 묶는 가상 네트워크
DNS 기반 라우팅서비스 이름을 자동으로 IP로 변환하고 로드밸런싱 수행
효과IP나 포트를 몰라도 서비스 이름으로 접근 가능, 수평 확장(Scaling) 용이

한 줄 정리

Docker Swarm의 Service Discovery
Service명을 기반으로 여러 컨테이너를 자동으로 탐색·연결하여,
Overlay 네트워크를 통해 부하 분산과 확장성을 제공하는 기능이다.


docker service create --name client -with-registry-auth --network discovery alicek106/book:curl ping docker.com

docker service ls |grep server
docker service ls |grep client
docker service ps server
docker service ps client

docker ps
docker ps --format "table {{.ID}}\t{{.Command}}" |grep ping

curl -s server |grep Hello

--

docker service create --name ubun-vol --with-registry-auth --mount type=volume,source=ubuntu-vol,target=/root ubuntu:14.04 ping docker.com

docker service create --name ubun-vol1 --mount type=volume,source=test,target=/etc/vim ubuntu:14.04 ping docker.com

mkdir /root/host
touch /root/host/test.lst
docker service create --name ubuntu-bind --mount type=bind,source=/root/host,target=/root/cotainer ubuntu:14.04 ping docker.com

chmod +x /usr/local/bin/docker-compose
docker run -d --name mysql alicek106/composetest:mysql mysql

docker run -d -p 80:80 --link mysql:db --name web alicek106/composetest:web apachectl -D FOREGROUND

nano docker-compose.yaml

version: "3.0"
sevices:
web:
image: alicek106/composetest:web
ports:

  • "8888:80"
    links:
  • mysql:db
    command: apachectl -D FOREGROUND
    mysql:
    image: alicek106/composetest:mysql
    command: mysqld

docker-compose scale mysql=3

좋아요 👍 이 이미지는 Docker Compose 설치 및 실행 개념을 설명하고 있습니다.
아래는 이미지의 텍스트 변환 + 구조적 요약입니다 👇


📄 텍스트 변환본

■ 도커 컴포즈 설치와 실행

도커 컴포즈는 여러 개의 컨테이너의 옵션과 환경을 정의한 YAML 파일을 읽어서
컨테이너를 순차적으로 생성해준다.

여기에 각 컨테이너의 의존성, 네트워크, 볼륨 등을 정의할 수 있고,
스웜(Swarm) 모드의 Service와 유사하게
설정 파일에 정의된 Service의 컨테이너 수를 유동적으로 조절할 수 있으며,
컨테이너 서비스 발견도 자동으로 이뤄진다.


➡️ 하나의 Service 안에 web과 mysql을 각각 정의하면
이 둘이 하나의 Service로 묶여서(연계되어) 실행된다.

프로젝트명(Project name)은 docker-compose.yml 파일이 위치한 디렉터리
예: /home/ubuntu 의 이름을 사용해서 ubuntu가 된다.

하나의 프로젝트명에 여러 개의 Service명이 있을 수 있고,
각 Service는 여러 개의 컨테이너 객체로 구성될 수 있다.


📎 참고:
https://onlineyamltools.com/validate-yaml
→ YAML 구문 오류를 확인하는 사이트


⚙️ docker-compose.yml 작성 후 주의사항

  • docker-compose.yml 파일로 여러 컨테이너 객체를 생성했다면

    docker-compose up

    명령으로 각 컨테이너를 동시에 실행하거나,

  • docker-compose down

    명령으로 생성한 컨테이너들을 한꺼번에 삭제할 수 있다.


🧩 핵심 요약

구분설명
역할여러 컨테이너의 실행 설정을 YAML 파일로 정의
파일명docker-compose.yml
핵심 기능서비스 의존성, 네트워크, 볼륨, 환경 변수 설정, 자동 실행
실행 명령어docker-compose up -d (백그라운드 실행), docker-compose down (전체 종료)
프로젝트 이름YAML 파일이 위치한 디렉터리명으로 자동 설정
참고 사이트onlineyamltools.com/validate-yaml (YAML 문법 검사기)

✅ 예시 docker-compose.yml

version: '3'
services:
  web:
    image: nginx
    ports:
      - "80:80"
    depends_on:
      - db

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: rootpw
      MYSQL_DATABASE: testdb

💡 요약 한줄

Docker Compose는 여러 컨테이너를 하나의 서비스 단위로 정의하고,
updown 명령으로 손쉽게 실행·삭제할 수 있는 YAML 기반 도커 자동화 도구이다.

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

0개의 댓글