[Docker] 컨테이너 외부와 통신하는 도커 네트워킹 방법
인터넷과 www
컴퓨터 네트워크는 통신 및 데이터 교환을 허용하는 연결된 장치의 시스템이다.
이러한 네트워크와 또 다른 네트워크 간의 연결을 🌐 인터넷(Internet)이라 부른다.
그리고 인터넷에서 데이터를 주고받을 수 있는 프로토콜(통신규약)을 HTTP라 한다.
HTTP를 기반으로 인터넷 통신망에서 동작하는 서비스 중 하나가 www
이며, 짧게 웹이라 불린다.
www
는 초기에는 웹 브라우저의 이름에 국한되었지만,
인터넷을 사용하는 컴퓨터들 간의 정보공간의 의미로 발전했다.
도커 네트워킹
컨테이너 외부로의 통신에는 여러 형태가 있을 수 있다.
(1) 웹으로의 요청이나, (2) 호스트 머신의 데이터베이스와의 통신,
그리고 (3) 컨테이너 간의 통신이 있다.
(1)
기본적으로 컨테이너는 별다른 설정없이 웹에 요청을 보낼 수 있다.
즉, 컨테이너 외부로 HTTP 요청이 전송될 수 있다.
(2)
로컬 호스트 머신의 데이터베이스와 통신할 때는 🚫 localhost
라는 도메인을 사용하면 오류난다.
도커가 이해할 수 있는 특별한 도메인으로 대체해야 한다. 🐋 host.docker.internal
ex. mongodb://localhost:27017/test (x)
ex. mongodb://host.docker.internal:27017/test (ㅇ)
해당 도메인host.docker.internal
은 도커에 의해 인식되어 호스트 머신의 ip 주소를 참조한다.
도메인이 필요한 곳 어디에든 사용할 수 있다. ⚠️ HTTP 요청에도 사용할 수 있다.
ex. http://host.docker.internal:80/test
(3)
컨테이너는 한가지 주요 작업만 수행하는 것이 강력히 권장되고,
때문에 다중 컨테이너로 애플리케이션을 구축하는 것은 매우 일반적이고,
컨테이너 간 통신은 매우 빈번하게 일어난다.
다른 컨테이너와 통신하려면 결국 그 컨테이너의 ip주소를 알면된다.
🐋 docker container inspect CONTAINER_NAME
NetworkSettings.IPAddress
를 찾을 수 있다.
이렇게 ip주소를 알아내어 소스코드에 하드코딩하면 다른 컨테이너와 통신할 수 있지만,
해당 컨테이너의 ip 주소가 변경될 때마다 매번 새 이미지를 빌드해야 하며, 번거롭다.
도커는 여러 컨테이너를 하나의 동일한 네트워크에 밀어넣고, 컨테이너 이름을 통해 컨테이너간 통신을 할 수 있다.
같은 네트워크 안에 있는 컨테이너 이름은 ip조회 및 해결작업을 자동으로 수행한다.
컨테이너 이름(컨테이너 ip주소 참조)을 도메인 즉, 주소로 사용할 수 있다.
🐋 docker network create NETWORK_NAME
- 도커 네트워크 생성
🐋 docker network ls
- 도커 네트워크 리스팅
🐋 docker run --name mongodb --network NETWORK_NAME IMAGE_NAME
- 이미지를 기반으로 컨테이너를 실행할 때
--network
옵션을 써 해당 컨테이너를 특정 네트워크에 밀어넣는다.
ex. mongodb://mongodb:27017/test
해당 도메인을 소스코드에 넣으면 데이터베이스가 존재하는 컨테이너와 통신할 수 있다.
- ☄️ 같은 네트워크 안에 속한 컨테이너 간의 통신만할 때는 포트를 publish할 필요가 없다.
-p
옵션은 컨테이너 네트워크 외부에서 컨테이너의 무언가에 연결할 계획일 경우에만 필요하다.
⚠️ 컨테이너 네트워크 내부에서는 모든 컨테이너가 서로 자유롭게 통신할 수 있다.
docker run --name app --network NETWORK_NAME IMAGE_NAME (ㅇ)
Docker Networks는 네트워크 동작에 영향을 미치는 다양한 종류의 드라이버를 지원한다.
디폴트 드라이버는 bridge 드라이버이다.
해당 드라이버는 컨테이너가 동일한 네트워크에 있는 경우 이름으로 서로를 찾을 수 있다.
드라이버는 네트워크 생성 시 --driver 옵션을 추가하여 간단히 설정할 수 있다.
ex. docker network create --driver host ..
stand alone 컨테이너의 경우, 컨테이너와 호스트 시스템 간의 격리가 제거된다.
즉, localhost를 네트워크로 공유한다.