서로 다른 네트워크에 있는 컨테이너 통신시키기

햄도·2021년 2월 18일
0

jenkins가 떠있는 컨테이너에서 다른 컨테이너에 ssh 명령을 보내야 하는데, 원래 하던 것처럼 컨테이너에 할당된 내부 IP로 통신이 되지 않았다. (Connection timeout)

알아보니 jenkins 컨테이너와 명령을 받는 컨테이너가 다른 브릿지를 사용하고 있었다.

컨테이너가 생성되면 도커는 컨테이너에 내부 IP를 순차적으로 할당하고, 이 IP가 외부와 연결되려면 호스트에 가상 네트워크 인터페이스를 생성해야 한다. veth...로 시작하는 이 가상 네트워크 인터페이스는 컨테이너 수만큼 생성되어 다시 docker0 브릿지와 바인딩되고 호스트의 eth0과 가상 네트워크 인터페이스를 이어준다.

즉 컨테이너들은 기본적으로 가상 네트워크 인터페이스를 통해 docker0 브릿지에 연결되고, 같은 브릿지에 연결된 컨테이너들은 내부 IP로 통신할 수 있지만, jenkins 컨테이너는 docker0 브릿지에 연결되어있는 반면 명령을 받는 컨테이너는 docker-compose로 띄웠기 때문에 별도의 네트워크에 연결되어 있었다.

이 문제를 해결하기 위해 새로운 네트워크를 생성해 두 컨테이너를 연결해주었다.

docker network create jenkins # jenkins라는 네트워크를 만든다.

docker network connect jenkins jm_jenkins # jm_jenkins 컨테이너를 jenkins에 연결한다.

docker network connect jenkins scheduler # scheduler 컨테이너를 jenkins에 연결한다.

docker network inspect jenkins # 두 컨테이너가 연결되어 있는것 확인

docker inspect jm_jenkins # 네트워크가 하나 더 생긴 것 확인

docker inspect scheduler # 네트워크가 하나 더 생긴 것 확인

위 예시처럼 docker network create 로 네트워크를 생성하면 기본적으로 브릿지가 생성된다.

하지만 도커에서 자체적으로 지원하는 네트워크 드라이버에는 브릿지 말고도 여러 종류가 있다.

브릿지

  • 사용자 정의 브릿지를 새로 생성해 각 컨테이너에 연결
  • 컨테이너는 연결된 브릿지를 통해 외부와 통신할 수 있다.
  • 특정 IP 대역을 가지기 때문에 connect, disconnect 등 명령어를 사용할 수 있다.

호스트

  • 네트워크를 호스트로 설정하면 호스트의 네트워크 환경을 그대로 사용할 수 있다.
  • 별도로 생성할 필요 없이 기존의 host라는 이름의 네트워크를 그대로 사용하면 된다.
  • 이것을 사용하면 컨테이너 호스트 이름도 무작위가 아닌 호스트 머신의 이름으로 설정된다.
  • 컨테이너 내부의 애플리케이션을 별도 포트 포워딩 없이 바로 서비스할 수 있다.

  • 아무 네트워크를 사용하지 않는다. 외부와 연결이 단절된다.

컨테이너

  • 다른 컨테이너의 네임스페이스 환경을 공유한다.
  • 내부 IP, 네트워크 인터페이스, MAC 주소 등의 속성이 공유된다.

참고

profile
developer hamdoe

0개의 댓글