Profile picture

[Docker Swarm] 방문자 수 체크 애플리케이션 구축하기

JaehyoJJAng2024년 04월 10일

▶︎ 개요

도커스웜에 익숙해지기 위해서 조금 복잡한 구성에 대해 실습을 해보려 한다.

실제 운영 환경에서는 웹 애플리케이션이 혼자 배포되는 경우가 거의 없다.

redis와 함께 웹 애플리케이션을 실행하고 서버에 접속할 때마다 카운트를 +1 하는 서비스를 만들어보자.


▶︎ 구성도

먼저 웹 애플리케이션과 redis가 통신할 수 있는 오버레이 네트워크를 만든다.

오버레이 네트워크를 사용하면 redis는 외부에 포트를 오픈하지 않아도 되고,

웹 애플리케이션과 다른 노드에 있어도 같은 서버에 있는 것처럼 통신이 가능하다.
image


▶︎ 실습 시작

‣ 오버레이 네트워크 생성

network create 명령어로 오버레이 네트워크 생성

docker network create --attachable \
--driver overlay \
backend

잘 생성되었는지 network ls 명령어로 확인

docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
d90fab0osvxh   backend           overlay   swarm
3b40c60c0106   bridge            bridge    local
96fa6d7c6ad6   docker_gwbridge   bridge    local
a6a71d5c3e1d   host              host      local
mstlvunbj3qo   ingress           overlay   swarm
26a9b0a1bb28   none              null      local

backend라는 이름의 오버레이 네트워크가 생성되었습니다. 그 외에 네트워크는 기본으로 생성되는 네트워크들입니다.


이제 redis를 backend 네트워크에 생성해봅시다.
image

docker service create --name redis \
--network=backend \
redis

--network 옵션으로 어느 네트워크에 속할지 정의했습니다.

backend 네트워크에 속한 redis 서비스는 외부 네트워크에서는 접근할 수 없고 backend 네트워크 상에서 원래 포트인 6379로 접속할 수 있습니다.

redis 서비스가 제대로 생성되었다면 telnet 명령어로 테스트해봅시다.

docker run --rm -it \
--network=backend \
alpine \
telnet redis 6379

# test
KEYS *
SET hello world
GET hello
DEL hello
QUIT

외부 네트워크에서는 redis 서버에 접근할 수 없으므로 접속 테스트용 컨테이너를 생성하였습니다.

--network 옵션으로 backend 네트워크에 접속하였고 redis 서비스의 이름이 곧 도메인명이므로 바로 접속할 수 있습니다.

스웜은 서비스가 실행되면 내부 DNS에 자동으로 도메인 정보를 등록합니다. 따로 IP를 관리할 필요 없이 서비스명으로 접근이 가능합니다.


‣ 웹 서비스 생성

image

docker service create --name counter \
--network=backend \
--replicas 3 \
-e REDIS_HOST=redis \
-p 4568:4567 \
subicura/counter

redis 서버와 통신해야 하므로 backend 네트워크를 지정하였고,

--replicas 옵션을 이용하여 3개의 컨테이너를 생성하도록 지정하였습니다.

외부의 4586 포트로 접근할 수 있도록 포트를 오픈하였고 redis 서버의 도메인명을 환경 변수로 전달했습니다.


이제 테스트 해봅시다.

curl k8s-master:4568

# output
97439a06649c > 1

curl k8s-master:4568

# output
31fb5f5fff7c > 1
97439a06649c > 1

curl k8s-master:4568

# output
d33f20b8589c > 1
31fb5f5fff7c > 1
97439a06649c > 1

curl k8s-master:4568

# output
d33f20b8589c > 1
31fb5f5fff7c > 1
97439a06649c > 2

웹 애플리케이션 서버와 redis가 backend 오버레이 네트워크를 통해 연결되었고

ingress 네트워크가 3개의 웹 컨테이너에 바쁘게 부하를 분산하였습니다.

스웜은 서로 통신이 필요한 서비스를 같은 이름의 오버레이 네트워크로 묶고, 내부 DNS 서버를 이용하여 접근할 수 있습니다.

여러 개의 네트워크를 쉽게 만들 수 있고, 하나의 서비스는 여러 개의 네트워크에 속할 수 있습니다.

이 모든 것은 스웜이 알아서 하고 관리자는 네트워크와 서비스만 잘 만들면 됩니다.

내부 DNS에서 counter의 IP는 10.0.0.4로 3개의 컨테이너 로드 밸런서용 IP를 가리키고 있습니다. 실제 각각의 IP는 tasks.counter의 A Record에 기록되어 있고, 10.0.0.5~7을 가지고 있습니다.


Loading script...