▶︎ 개요
도커스웜에 익숙해지기 위해서 조금 복잡한 구성에 대해 실습을 해보려 한다.
실제 운영 환경에서는 웹 애플리케이션이 혼자 배포되는 경우가 거의 없다.
redis와 함께 웹 애플리케이션을 실행하고 서버에 접속할 때마다 카운트를 +1
하는 서비스를 만들어보자.
▶︎ 구성도
먼저 웹 애플리케이션과 redis가 통신할 수 있는 오버레이 네트워크를 만든다.
오버레이 네트워크를 사용하면 redis는 외부에 포트를 오픈하지 않아도 되고,
웹 애플리케이션과 다른 노드에 있어도 같은 서버에 있는 것처럼 통신이 가능하다.
▶︎ 실습 시작
‣ 오버레이 네트워크 생성
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
네트워크에 생성해봅시다.
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를 관리할 필요 없이 서비스명으로 접근이 가능합니다.
‣ 웹 서비스 생성
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을 가지고 있습니다.