Docker와 Podman의 네트워크 동작 방식은 크게 다르며, Docker가 시스템의 네트워크 정책을 덮어쓴다는 문제는 주로 Docker Daemon과 브리지 네트워크 방식 때문이야.
Podman은 기본적으로 rootless 컨테이너를 지원하고, 네트워크 설정이 호스트의 네트워크 정책을 따르지만, Docker는 rootful로 동작하면서 자체 네트워크 구성을 사용하기 때문에 정책이 덮어씌워질 수 있어.
Docker는 dockerd라는 데몬 프로세스가 시스템의 네트워크를 직접 설정해.
docker0라는 브리지 네트워크를 생성하고, 컨테이너는 이 네트워크를 통해 통신해. 👉 Docker를 실행하면 iptables -t nat 테이블이 덮어쓰기될 수 있음!
iptables -t nat -L -n
이걸 실행해보면 Docker 관련 체인 (DOCKER 같은)이 추가된 걸 볼 수 있어.
bridge)Docker는 기본적으로 bridge 네트워크를 사용함.
docker0 브리지 네트워크를 통해 통신 iptables에 DNAT (Destination NAT) 규칙을 추가하여 외부에서 컨테이너에 접근 가능하도록 설정 🚨 예제: iptables NAT 테이블 확인
iptables -t nat -L -n -v
Docker가 추가한 규칙 예시:
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.2:80
이런 식으로 Docker가 자체적으로 NAT 규칙을 추가함.
host 네트워크 모드 사용 시 문제Docker에서 --network host 옵션을 사용하면,
컨테이너가 호스트 네트워크를 직접 사용하기 때문에 호스트의 기존 방화벽 규칙을 우회할 수 있음.
docker run --network host nginx
이렇게 하면 컨테이너가 호스트의 네트워크를 그대로 사용하면서 기존 네트워크 정책을 무시할 수 있어.
iptables을 직접 변경하지 않음Podman은 rootless 모드로 실행될 때, 호스트의 네트워크 설정을 건드리지 않고 사용자 공간에서 동작해.
slirp4netns(rootless 네트워크)나 cni-plugins를 사용 iptables -t nat 규칙을 수정하지 않음 👉 Podman은 네트워크를 분리된 네임스페이스에서 실행하므로, 호스트의 네트워크 정책을 덮어쓰지 않음!
| 기능 | Docker | Podman |
|---|---|---|
| 기본 네트워크 | docker0 브리지 사용 | CNI (rootful) / slirp4netns (rootless) |
| iptables 수정 | iptables -t nat 변경 (DNAT, 포트포워딩) | iptables 건드리지 않음 (rootless 기준) |
| 방화벽 규칙 영향 | 호스트 방화벽 규칙 덮어씌울 가능성 높음 | 방화벽 설정을 유지 |
--network host 사용 시 | 호스트 네트워크 정책 우회 가능 | 호스트 방화벽 정책 유지 |
| rootless 지원 | 기본적으로 root 권한 필요 | 기본적으로 rootless 동작 가능 |
1️⃣ Docker는 docker0 브리지 네트워크를 만들고 iptables -t nat 규칙을 수정함
2️⃣ 호스트 네트워크 정책이 덮어쓰기될 가능성이 있음 (특히 방화벽 규칙)
3️⃣ Podman은 rootless 모드에서는 iptables를 변경하지 않음 → 네트워크 정책이 유지됨
👉 해결 방법:
iptables=false 설정을 고려할 수 있음. 🚀 즉, Podman은 네트워크를 보호하는데 더 적합하고, Docker는 네트워크를 변경할 가능성이 크다!