본문 바로가기

백엔드 개발/Docker

[docker swarm] worker node를 새로 생성했을 열어줘야하는 포트

반응형

1. 기존의 컨테이너간 통신 방법(db와 redis와 연결)


docker swarm으로 container를 띄우는 공부를 하고 있다.

swarm mode에서는 컨테이너를 replicas 옵션을 줘야 다중으로 띄우는 것이 가능하다.

spring boot application을 여러개 띄우고자 할 때 가장 궁금했던 것은 컨테이너간 통신이다.

기존에는 properties.yml의 database url이나 redis url에는 container name을 적어주고 bridge network를 생성해서

rdb, redis와 spring application을 연결해줬었다.



2. swarm mode에서의 컨테이너간 통신 방법(db와 redis와 연결)


그런데 swarm mode에서는 container 이름을 사용자가 임의로 지정해줄 수 없고 service 명은 사용자가 명시해줄 수 있다.

그래서 혹시나 하는 마음으로 properties.yml에서 기존에 컨테이너 이름을 적어 주었던 것을 서비스 이름으로 변경해서 실행해봤다.

그랬더니 바로 된다.


네트워크의 경우도 docker stack deploy -c docker-compose.yml [stack 이름] 명령어로 실행할 때 docker-compose.yml 파일에 네트워크를 명시해준다면 overlay drive에 swarm scope의 네트워크를 생성해서 연결해주고 stack을 지울때는 네트워크도 같이 삭제해준다.

넘나 간단하고 좋았다.


3. worker node를 Join할 때 컨테이너간 통신시 유의사항


Woker node를 만들어서 application을 여러개 생성해주었는데.

worker node에서 생성된 spring boot application이 db와 redis와 연결이 되지 않았다.

manager node의 컨테이너들은 잘 연결되는 데도 말이다.

로그를 보면 host 명이 잘못되었다. datasource url이 잘못됐다고 에러 메시지가 뜬 걸 보면 서비스명으로 연결이 안되고 있는 것 같았다.


사실 알면서도 안되는 걸 확인하고자 worker node에 port를 열지 않았던 것인데.


Firewall considerations

Docker daemons participating in a swarm need the ability to communicate with each other over the following ports:

  • Port 7946 TCP/UDP for container network discovery.
  • Port 4789 UDP for the container overlay network.


swarm에 참여하는 node들은 위의 노드들을 열어줘야한 단다.

그래서 ec2의 보안그룹에서 인바운드규칙에서 위의 포트들을 열어줬다.

그리고 재실행해보니 worker node에서도 정상적으로 작동한다.



반응형