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에서도 정상적으로 작동한다.
'백엔드 개발 > Docker' 카테고리의 다른 글
[ssl] aws에 docker와 letsencrypt(certbot) 이용해서 ssl 인증 적용하기 (1) | 2019.03.05 |
---|---|
[docker machine] docker machine으로 lightsail instance 제어하기( aka 삽질기) (0) | 2018.12.14 |
[aws lightsail] AWS 라이트세일에 도커 이용해서 운영 서버 구성 (0) | 2018.12.05 |
[docker] 도커 컨테이너 사이의 네트워킹 (0) | 2018.12.02 |
[docker & spring boot] jar file을 docker container를 이용해서 배포 (0) | 2018.11.27 |