2021.02.05 - [프로그래밍 노트/도커] - 스웜(swarm)을 이용한 도커 컨테이너 배포_1
2021.03.27 - [프로그래밍 노트/도커] - 스웜(swarm)을 이용한 도커 컨테이너 배포_2
앞에서 포스팅한 스웜클러스터는 아직 상용화할수 없다. 왜냐하면 외부에서 서비스(echo_nginx)에 접근을 할 수 없기 때문인데 이 문제를 해결해보자.
마지막에 설정한 visualizer는 스웜 클러스터 외부에서 접근(localhost:9000)하다. 이것은 contraints설정에서 visualizer 컨테이너를 manager에 배치되도록했기 때문인데, 호스트로부터 manager까지 여러 단계에 걸친 포트 포워딩을 사용했기 때문에 문제가되지 않는다.
docker-compose.yml
version: "3"
services:
...
manager:
container_name: manager
image: docker:18.05.0-ce-dind
privileged: true
tty: true
ports:
- 8000:80
- 9000:9000 (외부에서 9000으로 접속하였을때, 9000포트로 전달한다.)
...
visualizer.yml
version: "3"
services:
app:
image: dockersamples/visualizer
ports:
- "9000:8080" (9000포트를, visualizer 컨테이너 8080으로 전달한다.)
...
그러나 echo_nginx 서비스는 여러 컨테이너가 여러 노드에 흩어져 있기 때문에 이런 방법을 사용할 수 없다. 호스트에서 이 서비스에 접근하려면 어떻게 해야할까?
우리는 서비스 클러스터 외부에서 오는 트래픽을 원하는 서비스로 보내주는 프록시 서버가 있어야 한다. HAProxy 를 사용하여 스웜 클러스터 외부에서 echo_nginx 서비스에 접근할 수 있게 설정해보자.
⇒ HAProxy가 컨테이너 외부에서 서비스에 접근할 수 있는 다리 역할(ingress)을 할 수있게 설정한다.
ingress.yml
version: "3"
services:
haproxy:
image: dockercloud/haproxy
networks:
- corn
volumes:
- /var/run/docker.sock:/var/run/docker.sock
deploy:
mode: global
placement:
constraints:
- node.role == manager
ports:
- 80:80
- 1936:1936 # for stats page (basic auth. stats:stats)
networks:
corn:
external: true
HAProxy가 서비스를 찾을 수 있도록 nginx의 환경 변수에 SERVICE_PORT를 추가한다. (이전 포스팅에 이미 추가되어 있음)
corn-webapi.yml
version: "3"
services:
nginx:
image: gihyodocker/nginx-proxy:latest
deploy:
replicas: 3
placement:
constraints: [node.role != manager]
environment:
SERVICE_PORTS: 80
...
- ingress.yml을 스택 Ingress로 배포한다.
$ docker container exec -it manager docker stack deploy -c /stack/ingress.yml ingress
- 서비스 배치현황 확인
$ docker container exec -it manager docker service ls ID NAME MODE REPLICAS IMAGE PORTS kn5jwbl5wrwy echo_api replicated 3/3 registry:5000/example/echo:latest lfs6oyhbu4hm echo_nginx replicated 3/3 gihyodocker/nginx-proxy:latest yllunu9wcryu ingress_haproxy global 1/1 dockercloud/haproxy:latest *:80->80/tcp, *:1936->1936/tcp rdglx86o9yp8 visualizer_app global 1/1 dockersamples/visualizer:latest *:9000->8080/tcp
- 서비스 확인
호스트의 포트 8000은 manager 컨테이너의 포트 80, ingress의 HAProxy로 포트 포워딩되므로 localhost:8000이 echo_nginx:80에 접속할 수 있게 된다.$ curl http://localhost:8000 Hello Docker!!
'프로그래밍 노트 > 도커' 카테고리의 다른 글
[Docker] 도커 자주쓰는 명령어 정리(배포/사용/운영) (0) | 2022.01.25 |
---|---|
[docker] docker-compose 특정 컨테이너만 실행 (0) | 2021.07.12 |
스웜(swarm)을 이용한 도커 컨테이너 배포_2 (0) | 2021.03.27 |
스웜(swarm)을 이용한 도커 컨테이너 배포_1 (0) | 2021.02.05 |
실용적인 (도커)컨테이너 구축 및 배포를 위한 지식_1 (0) | 2021.01.30 |