master, slave1, slave2)를 구성하고 After_Swarm이라는 이름으로 저장한다.master, worker01, worker02 등으로 구성하여 동일한 개념으로 사용할 수 있다.이 개념들은 Kubernetes(K8s)에서도 동일하게 사용된다.
역할:
스웜 모드에서는 컨테이너들을 Service(서비스) 단위로 관리한다.
같은 이미지로 생성된 여러 컨테이너들을 제어하며, 각 컨테이너를 Task라고 부른다.
Service는 매니저 노드에서 하나 이상 존재할 수 있다.
예시 명령어:
docker service create --name myweb --replicas 3 nginx:latest
→ nginx:latest 이미지 컨테이너 3개(Task)가 생성되며, myweb이라는 이름의 서비스로 묶인다.
이 컨테이너들은 Service를 통해 관리된다.
Kubernetes 대응 개념:
Service가 동일한 역할을 수행한다.
역할:
생성할 컨테이너 수를 지정하는 개념으로, --replicas 3 과 같이 지정한다.
지정된 수만큼 컨테이너(Task)가 항상 실행되며, 일부 컨테이너가 중단되면 자동으로 재생성된다.
일정한 수를 유지하기 위해 Rolling Update 방식으로 순차적으로 컨테이너를 업데이트하여 항상 동일한 개수를 유지한다.
Kubernetes 대응 개념:
Replicaset이 이 역할을 수행한다.
요약하자면,

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

Rolling Update란?
스웜 모드에서 제공하는 기능으로, 서비스를 중단하지 않고 점진적으로 컨테이너 이미지를 업데이트할 수 있다.
기존 컨테이너를 모두 종료하지 않고 순차적으로 새로운 이미지를 적용한다.
RollOut:
새로운 이미지로 업데이트하는 과정
→ 예: ubuntu:16.04 → ubuntu:18.04로 변경 시, 컨테이너를 하나씩 새 이미지로 교체하며 서비스 중단 없이 유지.
RollBack:
업데이트 이후 문제가 발생할 경우, 이전 이미지로 되돌리는 과정
→ 예: 다시 ubuntu:16.04 이미지로 복귀.
Kubernetes와의 공통점:
K8s에서도 동일하게 Rollout과 Rollback 기능을 제공한다.
✅ 정리 요약
| 구분 | 기능 설명 | 예시 |
|---|---|---|
| 장애 복구 | 고장난 노드/컨테이너 자동 복구 및 재배치 | 컨테이너 수 자동 유지 |
| RollOut | 새 이미지로 점진적 업데이트 | ubuntu:16.04 → ubuntu:18.04 |
| RollBack | 이전 이미지로 되돌리기 | ubuntu:18.04 → ubuntu:16.04 |
💡 즉, Docker Swarm은 컨테이너의 가용성 유지와 무중단 업데이트를 위한 복구 메커니즘을 내장하고 있으며, Kubernetes에서도 동일한 원리로 적용된다.
Config와 Secret은
도커 스웜(Docker Swarm)에서 실행 중인 컨테이너 내부로 외부 정보를 안전하게 전달하는 방식입니다.
즉, 컨테이너 이미지에 직접 값을 넣지 않고, 외부에서 필요한 설정이나 인증 정보를 주입하는 기능입니다.
환경변수(-e) 방식
docker run -e MYSQL_ROOT_PASSWORD=1234 mariadb
compose.yml 방식
docker-compose.yml 파일에 기록environment:
- MYSQL_ROOT_PASSWORD=1234
config & 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 파일 형태로 접근 가능
암호화가 필요 없는 일반 설정 파일(Nginx 설정, Registry 설정 등)을 전달할 때 사용
예시:
docker config create nginx_conf ./nginx.conf
docker service create --name web1 \
--config source=nginx_conf,target=/etc/nginx/nginx.conf \
nginx
| Docker Swarm | Kubernetes |
|---|---|
| Secret | Secret |
| Config | ConfigMap |
👉 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) 모드에서는 여러 노드에 분산된 컨테이너들을 하나의 서비스(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
위 명령을 실행하면,
80 포트로 요청을 받아 자동으로 서비스 내부의 컨테이너로 전달합니다.Swarm Network Pool
= 여러 노드에 흩어진 동일한 컨테이너(Task)들을
하나의 Service 이름으로 묶고,
이를 외부에서 단일 네트워크처럼 접근 가능하게 만들어주는
스웜 전용 네트워크 드라이버 기반 구조입니다.



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

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

서브넷 공유
노드 간 통신 지원
Ingress 네트워크와의 관계
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.x → Ingress / Overlay 네트워크 주소172.x.x.x → 노드 내부(bridge) 네트워크 주소즉,
각 노드(슬레이브/마스터)가 다른 네트워크(172대역)에 속해 있지만,
모두 Ingress(10.0.0.x) 네트워크를 통해 하나로 묶여 통신할 수 있습니다.
각 컨테이너는 보통 eth0, eth1 인터페이스를 가집니다.
| 인터페이스 | 용도 |
|---|---|
| eth0 | Overlay 또는 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의 핵심 네트워크 구조입니다.
Replicas 옵션을 사용하면 동일한 컨테이너 태스크(Task)를 여러 개 생성해 병렬로 실행할 수 있습니다.
이때 생성된 여러 컨테이너들은 하나의 Service 이름으로 통제되며,
서로의 존재를 알고 상호 통신할 수 있도록 자동으로 연결됩니다.
여러 개의 동일한 컨테이너(Task)가 하나의 서비스(Service)로 묶임
→ 예: docker service scale 명령으로 복제 수를 늘릴 수 있음
docker service scale web=5
→ 기존에 replicas=3이던 Nginx 컨테이너를 5개로 늘리면,
새로운 2개의 컨테이너가 생성되어 기존 서비스 그룹에 자동 등록됩니다.
이렇게 새로 생성된 컨테이너를 다른 컨테이너들이 자동으로 인식하고 연결하는 것을
Service Discovery (서비스 발견) 이라고 합니다.
A Service가 B Service를 호출한다고 가정하면,
A Service는 B Service의 IP 주소나 포트번호를 직접 몰라도 됩니다.
단지 B Service의 이름(Service명) 으로 접근하면 됩니다.
Docker Swarm의 Overlay 네트워크 드라이버가
자동으로 5개의 B Service 중 하나로 트래픽을 라우팅해줍니다.
즉, A Service → B Service 호출 시:
A 컨테이너 → Overlay 네트워크 → B 컨테이너들 중 1개 자동 선택
| 서비스명 | 복제 수(Replicas) | IP 예시 | 설명 |
|---|---|---|---|
| A Service | 3 | 10.0.0.10~12 | 요청을 보내는 서비스 |
| B Service | 5 | 10.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:
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.ymlversion: '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는 여러 컨테이너를 하나의 서비스 단위로 정의하고,
up과down명령으로 손쉽게 실행·삭제할 수 있는 YAML 기반 도커 자동화 도구이다.