원인: 방화벽 설정
내 맥에서 Container를 만들어서 server로 요청을 날렸을 때 아주 정상적을 잘 동작했다.
그런데 server 컴퓨터에서 Container를 만들어서 server로 요청을 날려보니 다음과 같이 에러가 발생했다.
java.net.NoRouteToHostException: Host is unreachable
at java.base/sun.nio.ch.Net.connect0(Native Method)
at java.base/sun.nio.ch.Net.connect(Net.java:503)
at java.base/sun.nio.ch.Net.connect(Net.java:492)
//...생략
열심히 검색하다보니 iptables를 사용하는 경우 Docker bridge network에서 host로 들어오는 요청을 허용해주면 된다는 글을 찾을 수 있었다. `iptables`를 사용하지 않는데, 이런 에러가 발생하면 방화벽에 문제가 있지 않은지 확인해보자!
해결과정
1. Container의 gateway 확인
먼저 docker network ls나 docker container inspect containerId를 통해 내가 쓰는 docker container의 network id를 알아내야 한다. inspect를 이용하는 경우 Networks 정보를 참고하면 된다.
"Networks": {
"container_name": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"7838f38a3da9",
"container_name"
],
"NetworkID": "netowrkId",
//생략
}
}
그리고 docker network inspect networkId를 통해 network의 gateway를 확인한다.
2. network interface 확인
ip addr | grep gatewayIP를 통해 network interface를 확인한다.
필자의 경우 gateway가 172.19.0.1이었고, ip addr | grep 172.19.0.1 명령어로 조회해보니
inet 172.19.0.1/16 brd 172.19.255.255 scope global network-interface-name과 같이 나왔다.
3. network interface를 iptables rule에 추가
필자는 INPUT chain에 포함된 DOCKER-NETWORK chain에 rule을 추가했다.
(만약 잘 모르겠거나 잘 안 되면 그냥 INPUT chain에 rule을 추가하자!)
명령어는 다음과 같다.
#주석없는 버전
sudo iptables -I DOCKER-NETWORK -i network-interface-name -j ACCEPT
#주석넣고싶은 경우
sudo iptables -I DOCKER-NETWORK -i network-interface-name -j ACCEPT -m comment --comment "it is description"
그리고 마지막으로 service iptables save까지 실행해서 iptables를 저장하고 파일로 백업까지 해주면 끝난다.
(백업은 자유지만, 권장한다)
필자의 경우 이렇게 방화벽을 설정해서 Docker bridge network에서 host로 들어오는 요청을 허용해주니 모든 것이 정상적으로 동작했다. 이 글이 도움이 됐길 바란다!
(Docker network 관련하여 좋은 글이 있어 남겨놓는다! 필요하면 참고하자!)
'Docker' 카테고리의 다른 글
Dockerfile: CMD로 여러 명령어 수행하기 (0) | 2022.08.08 |
---|