Docker Networking, 내가 써보니까 이런 느낌이더라
Docker 처음 접했을 때, 솔직히 '이게 뭔데 이렇게 어렵게 설명하지?' 싶었어요. 근데 막상 써보니까, 이거 좀 재밌더라고요. 컨테이너 하나하나가 마치 작은 방처럼 따로따로 돌아가는데, 그 방들끼리 대화도 하고, 밖에 있는 본가(?)랑도 연락해야 하잖아요? 바로 그걸 가능하게 해주는 게 Docker Networking이에요. 약간 복잡해 보이지만, 알고 보면 꽤 직관적이에요.

호스트랑 연결하고 싶을 땐? 그냥 host.docker.internal 쓰면 돼요
- host.docker.internal을 사용하면 컨테이너에서 로컬 호스트로 쉽게 연결할 수 있음
- 복잡한 IP 찾기 없이 로컬 서비스와 깔끔하게 통신 가능
- 개발 및 테스트 환경에서 특히 유용함
제가 예전에 개발 중이던 프로젝트에서, 컨테이너 안에서 뭔가 돌리고 있는데, 로컬에 있는 데이터베이스랑 연결해야 하는 일이 있었어요. 근데 IP 주소 찾아서 넣는 게 너무 귀찮고... 그때 알게 된 게 host.docker.internal! 이거 쓰면 그냥 로컬 서비스랑 깔끔하게 연결돼요. 뭐랄까, '컨테이너한테 우리 집 주소 알려주는 느낌'이라고 해야 하나?
테스트할 때 특히 좋아요. 도구들 따로따로 실행 중일 때 연결이 아주 자연스럽습니다.

컨테이너끼리는 이름 부르면 다 돼요, 진짜로
frontend, backend, DB 따로 컨테이너 돌릴 때 있잖아요. 옛날에는 이걸 서로 연결하려고 IP 알아내느라 진땀 뺐는데, 이제는 그냥 네트워크 하나 만들고 컨테이너들을 거기다 붙이면 돼요. 이름으로 부르기만 하면 연결되거든요. 완전 친구 찾기처럼!
예시 하나 드릴게요:
docker network create my-network
docker run -d --name backend --network my-network my-backend-image
docker run -d --name frontend --network my-network my-frontend-image
이제 frontend에서 그냥 http://backend:3000으로 호출하면 됩니다. IP 찾을 필요도 없어요. Docker가 알아서 해줘요. 처음에 이거 보고 좀 감동받았던 기억이 있네요.
근데, Docker가 뭔가 해주는 건 맞지만, 내 코드를 바꾸진 않아요
- Docker는 소스코드를 직접 수정하지 않음
- 컨테이너에서 외부로 나가는 요청이 있을 때만 주소를 해석해 연결함
- 브라우저 같은 컨테이너 외부 요청에는 작동하지 않음
중요한 포인트 하나! Docker가 너무 똑똑해서 소스코드까지 알아서 바꾸는 거 아니냐고 묻는 분들 계시는데, 그런 일 절대 없어요. Docker는 코드를 직접 고치거나, IP를 소스에 꽂아넣거나 하지 않습니다. 그건 그냥 무서운 상상이에요.
대신, 내 앱이 외부로 요청을 보낼 때—예를 들어 HTTP 요청이든 MongoDB든—그 순간 Docker가 '아하!' 하고 동작해서, 주소를 알아서 해결해주는 거예요. 그러니까 컨테이너 내부에서 뭐가 일어나고 있을 땐 Docker가 별로 신경 안 써요. 근데 밖으로 나가는 순간엔 아주 부지런히 움직이죠.
참고로, 웹 브라우저에서 요청이 일어나면 Docker는 아무 역할도 안 합니다. 그건 Docker 관할 밖이니까요. 이걸 아는 것만으로도 Docker 사용하면서 훨씬 덜 헤맬 수 있어요.

Docker 네트워크 드라이버, 종류 많다고 겁먹지 마세요
- Docker에는 다양한 네트워크 드라이버가 존재함
- 각각의 드라이버는 컨테이너 연결 방식에 따라 다르게 동작함
- 대부분의 경우 기본값인 bridge 드라이버만으로 충분함
처음엔 드라이버 종류가 너무 많아서 헷갈렸는데, 알고 보면 그냥 '컨테이너들끼리 어떻게 연결할지 정하는 방식'이에요. 자, 하나씩 아주 쉽게 볼게요.
1. Bridge (기본값이에요!)
가장 흔하게 쓰는 방식이에요. 아무 설정 안 하면 이거 씁니다. 컨테이너끼리 이름으로 찾을 수 있게 도와줘요.
docker network create my-net
여기서 굳이 --driver 안 써도 됩니다. 알아서 bridge로 만들어줘요.
2. Host
이건 좀 급진적이에요. 컨테이너랑 호스트가 네트워크를 공유해요. 즉, 둘이 localhost를 같이 써요. 편하긴 한데, 보안 신경 써야 해요. 너무 가깝거든요.
3. Overlay
컨테이너가 다른 서버에 있어도 서로 연결되게 해줘요. 근데 이건 Swarm 모드에서만 되고, 지금은 거의 안 써요. 약간 잊혀진 기능 느낌?
4. Macvlan
이건 약간 고급 설정이에요. 컨테이너한테 MAC 주소를 줘서, 네트워크에서 진짜 장비처럼 보이게 만들 수 있어요. 구식 시스템이랑 연결할 때 가끔 쓰여요.
5. None
이건 아예 네트워크를 끊어버리는 옵션이에요. 연결도 없고, 외부랑 완전 단절됩니다. 진짜 보안 철통같이 하고 싶을 때만 써요.
6. Third-party Plugins
이건 말 그대로 확장 기능이에요. 기본 드라이버로 부족하면, 누가 만든 특별한 플러그인을 설치해서 쓸 수도 있어요. 커스텀 네트워크가 필요한 경우에 유용하죠.
정리하자면... 경험자 입장에서 이건 꼭 알아두세요
- Docker Networking은 개발자에게 매우 중요한 기능임
- 컨테이너 간 통신, 테스트, 호스트 연결 등을 간편하게 처리 가능
- 처음엔 어렵지만 익숙해지면 작업 효율이 크게 향상됨
Docker 네트워크 기능, 진짜 쓰다 보면 없으면 안 될 존재가 됩니다. 처음엔 '이게 뭔 소리야' 싶지만, 한 번 이해하고 나면 '와 이거 없었으면 나 진짜 일 못 했겠다'는 생각 들어요.
컨테이너끼리 연결되고, 호스트랑도 쉽게 오가고, 테스트도 편해지고... 진짜 개발자에게 꼭 필요한 도구 중 하나라고 봐요.
혹시라도 Docker 쓰면서 네트워크 관련해서 헤매고 있다면, 제가 오늘 공유한 얘기들이 꼭 도움이 되셨으면 좋겠어요. 다 겪어본 이야기들이거든요. 누구나 처음엔 어렵지만, 금방 익숙해집니다. 파이팅!
'SW > Kubernetes, Docker' 카테고리의 다른 글
| Docker로 Node.js 개발환경 구축하기: 실시간 반영, 로그 보존, 환경변수까지 완벽정리 (0) | 2025.09.14 |
|---|---|
| MongoDB 데이터를 Docker에서 안전하게 유지하는 방법 (볼륨 설정 가이드 포함) (0) | 2025.09.13 |
| Docker 컨테이너 간 네트워크 연결 실습 가이드 (초보자도 가능) (0) | 2025.09.11 |
| Docker로 Node.js와 MongoDB 연결하는 법 (초보자도 가능한 실습 가이드) (0) | 2025.09.10 |
| Docker Networking 개념 쉽게 배우기: 실습 기반 설명과 팁 (0) | 2025.09.09 |