인프런 커뮤니티 질문&답변

심준보님의 프로필 이미지
심준보

작성한 질문수

따라하며 배우는 MySQL on Docker

Swarm Mode에 service 만들기

e다른 ip로 db접근시 오류

작성

·

405

0

3대의 ec2 서버를 생성하고

1대를 master 나머지 2대를 worker로 설정을 하고(private ec2 ip로 설정)

master node인 ec2에서 db001서비스를 생성하였습니다. 서비스가 생성된 것도 확인하고 접속을 하였습니다. 컨테이너는 Master node ec2서버에 생성이 되었고 mysql -u root -p -h (ec2주소) 로 접속을 하였습니다. 그런데 해당 서버의 ip로는 접속이 되는데 Worker Node( ec2 private 주소) ip로는 접속이 되질 않습니다. 무엇이 문제일까요?

Error 2003 (HT000):can't connect to MYSQL server on (워커노드 ip) (111)

답변 4

0

심준보님의 프로필 이미지
심준보
질문자

결론이

Master Node에서

mysql -u root -p -h ${Worker_Node ip} 명령어로 접속한것이 결국 db001 서비스에 접속한 것이 되는건가요 ?
그리고 초기에 -e MYSQL_ROOT_PASSWORD 로 db001 서비스에 비번을 root로 주었는데 Worker Node에서 비번을 다시 root로 바꾸어야 접속이 되는 이유가 무엇인가요?
제 생각에는 마스터에서 워커 노드 ip로 접속을 할 때 클러스터 내부의 db001컨테이너에 접속이 되는 것이 아닌 그냥 워커 노드 서버의 mysql에 접속하고 있는것 같습니다.

김영헌님의 프로필 이미지
김영헌
지식공유자

지금 테스트하고 있는 환경이 강의 내용 처럼 마스터 노드 한대와 워커 노드 2대인 상황인가요?

그리고 swarm mode를 구성하기 전에 각 노드에서 실행 중인 모든 컨테이너가 중지 및 삭제된 상태인가요?

db001 서비스를 강의 내용에 있는 명령어로 실행했다면 현재 cluster에는 세개의 노드 중 특정 노드에 한개의 컨테이너만 실행 중이어야 할 거 같은데, 말씀하시는 상황을 보면 마스터 노드와 워커 노드에 각각 별도의 컨테이너가 떠 있는 상황처럼 이해가 됩니다.

심준보님의 프로필 이미지
심준보
질문자

네 db001(Master) 에서만 컨테이너가 실행중입니다.

Master Node에서 docker node ls 해봐도 마스터 맞고 2개의 워커가 추가로 클러스터로 구성되어있습니다.

Master에서 mysql -uroot -p -h (마스터ip)로 mysql 접속이 되고

mysql -uroot -p -h (워커ip) 로는 mysql 접속이 되지 않는 상황입니다.

 

그래서 워커노드에 mysql을 설치하고 방화벽 열고 워커노드에서 임시 비번을 root로 바꾸고 접근 권한을 10.% 대역으로 바꾸고 난 뒤에 master에서

mysql -uroot -p -h(워커 노드ip)로 접속이 되는 상태입니다.

ec2서브넷은 10.0.0.0/24입니다

김영헌님의 프로필 이미지
김영헌
지식공유자

워커 노드에 mysql을 설치하고 mysql을 start 하신건가요?

말씀하시는 내용으로 봐서는 워커노드IP로 접속을 시도하셨을때는 db001이 아닌 다른 db에 접속한 듯한데요.

제가 지금 당장 테스트 해 볼 수 있는 환경이 없어서 바로 확인이 좀 어려운데요.

테스트 환경 구성해서 해당 내용으로 검증해보고 말씀드리는 게 더 확실할 거 같습니다.

심준보님의 프로필 이미지
심준보
질문자

답변 감사합니다. 뭔가 오류가 있었던것 같습니다.

Docker swarm에 대해 제가 수업 내용을 이해한게 맞는지 봐주실 수 있을까요?

1, Master node 와 Worker node 3대의 서버가 스웜으로 묶여있습니다.

2, 미리 이미지를 생성하여 docker hub 에 push 합니다.( 개인 서버의 도커 이미지가 아닌 모든 서버가 같이 사용할 수 있는 이미지를 위해서입니다.)

3, 서비스 생성과 노드 관리는 Master 에서 가능합니다.

4,서비스를 생성합니다 .(replicas 옵션으로 컨테이너 갯수를 지정할 수 있습니다. 5개라고 가정) & docker-compose.yml로 스택 단위로 구성 가능합니다

5.5개의 컨테이너가 Master / Worker 에 나누어서 생성이 됩니다.

6.어떠한 이유로 컨테이너가 중지가 되면 임의로 다른 호스트에 컨테이너가 자동 생성됩니다.(자동 생성 없애는 명령어가 존재합니다.)

6.클러스터 내에 컨테이너가 몇 개가 존재하던 같은 이미지로 실행하기 때문에 서비스가 nginx 라고 가정하면 3개의 Docker Host 서버에서 포트 / 방화벽을 허용해주기만 하면 됩니다. 즉 3개의 어떤 Docker Host Ip로 80 요청을 해도 5개의 컨테이너중에 하나를 응답받습니다.

7.같은 이유로 mysql서비스 경우에도 같은 컨테이너를 논리적으로 공유하기 때문에 어떤 hostip로 접속을 해도 3306요청으로 컨테이너 3306에 매칭이되어 컨테이너 db에 접속을 하게 됩니다.

 

 

김영헌님의 프로필 이미지
김영헌
지식공유자

네, 잘 이해하고 계신거 같습니다.

심준보님의 프로필 이미지
심준보
질문자

답변 감사드립니다

0

심준보님의 프로필 이미지
심준보
질문자

각 서버에 3306 열려있습니다

0

김영헌님의 프로필 이미지
김영헌
지식공유자

안녕하세요.

Docker Swarm 모드에서 서비스를 생성한 후에 Worker node ip를 이용해서 DB 접속을 시도하다가

에러가 난 상황인 거 같은데요.

혹시 접속하는 서버에서 해당 Worker node로 3306(또는 3307,3308) 포트가 오픈되어 있을까요?

심준보님의 프로필 이미지
심준보
질문자


제가 이해한 부분은 swarm을 구성하고 있는 동일한 클러스터 내에 있는 Master Node OR Worker Node가
db001에 -h옵션으로 어느 ip로도 접근 가능하다는 것이였습니다.
예를 들어 MasterNode에서 db001서비스를 생성하였고 컨테이너가 db001에 존재한다면.
mysql -u root -p -h ${Worker_Node ip} 'root' 패스워드로 db001 컨테이너에 접속을 한다. 라고 이해를 했습니다.
Worker Node ip로 db001 서비스를 접근하는게 맞는건가요?
제가 알고있는 해당 명령어는 해당 ip서버의 MYSQL에 접속하는 것으로 알고 있습니다.

3분 33초에 어떤 Node Ip를 통해서도 MYSQL 접속이 가능하다는 것이 db001에 접속한다는 의미가 맞을까요? 아니면 클러스터 내부끼리는 mysql 통신이 가능하다는 것을 의미하는 건가요?

ps접속은 해결하였습니다.

firewall 데몬 설치 -> 3306 영구 허용 -> 초기 비번을 root로 변경 -> 권한부여

이렇게 해야 Master Node에서

mysql -u root -p -h ${Worker_Node ip} 명령어로 접속이 가능했습니다,

김영헌님의 프로필 이미지
김영헌
지식공유자

Swarm Mode 구성을 하게 되면 3대의 서버가 하나의 cluster로 묶이는 셈이어서 어떤 서버를 통해서도 cluster내의 docker container에 접속이 가능해야 합니다.

Swarm mode에서는 docker가 아닌 service 단위로 컨트롤을 하게 되는데 -p 3306:3306은 db001이라는 서비스를 cluster의 3306 포트를 통해 서비스한다는 의미로 cluster내의 어떤 호스트 ip를 이용하더라도 3306포트를 통해 서비스 제공이 가능함을 의미합니다.

0

심준보님의 프로필 이미지
심준보
질문자

111오류가 아닌 110 오류입니다.

심준보님의 프로필 이미지
심준보

작성한 질문수

질문하기