수 많은 컨테이너중에 network 테스트를 하기 위해서 가장 최적화된 image가 있다면 alpine
이 있습니다
다른 centos, ubuntu는 핑테스트나 ip a 명령어를 쳐도 정상적으로 작동이 안됩니다
하지만 alpine
은 ip a와 핑테스가 가능하여 이번 챕터에서는 alpine
위주로 사용을 할 것입니다
docker network ls
네트워크를 확인하는 명령어
조금 있다가 계속 다룰 것이지만 ip a를 확인하면 나오는 docker0 인터페이스는 브릿지로 구성이 된다 사진에서 보는 것과 같이 host도 있지만 host는 실제 가상머신의 네트워크와 동일한 네트워크를 사용하고 외부에서 내부로 직접 연결이 되며 단점으로는 포트가 하나밖에 없어 다른 포트 연결을 할 수 없다는 단점이 있습니다
이번 사진을 보면 docker0 이 있습니다 172.17.0.1
은 브릿지 (스위치)의 역할을 하고 또한 게이트웨이의 역할 또한 합니다 그리고 docker0은 enp0s8과 직접 연결이 되어있기도 하지요
(DHCP의 역할도 있어 새로운 컨테이너를 생성하면 자동으로 IP할당을 해주기도 합니다)
새로운 컨테이너를 생성하게 되면 veth~ 라고 적혀있는 새로운 인터페이스를 만들게 됩니다
로컬에서 ip a
그리고 alpine
을 실행 시켜 ip a
을 하여서 보앗을때 14
번을 보면 veth그리고 if13
을 중점적으로 봐야합니다 로컬에서 새로운 인터페이스가 생성이 되어 14번에 연결이 되어있다는 뜻인데 이것은 alpine
과 연결이 되어잇다는 것을 뜻하는 것입니다
그것을 증명하는 것이 alpine
에서 ip a
를 하였을때 13번에 연결된 인터페이스 체크해둔 부분을 보면 로컬에서 확인한 if13
이 alpine
에서 그대로 떠있는 모습과 if14
라고 되어있는 것이 서로 연결이 되어있다는 것을 증명하는 것입니다
bridge & host network 생성해보기
docker network inspect bridge
명령어를 치면 bridge에서 설정된 서브넷이나 게이트웨이, 자세한 정보를 확인 할 수 있습니다
bridge network 생성
docker network create --subnet 192.168.0.0/24 --gateway 192.168.0.254 test
docker network ls
생성된 네트워크에 새로운 컨테이너를 생성해 보겠습니다
docker run -itd --net test --name aa1 alpine
docker inspect aa1
생성된 bridge 네트워크 IP 대역대에 맞게 설정이 잘된 것을 확인 할 수 있습니다
Network rm
네트워크를 사용하고 있는 컨테이너를 먼저 삭제해야 네트워크를 삭제 할 수 있습니다
docker rm -f aa1 docker network rm test
Host network 생성
브릿지는 새로운 네트워크를 생성 할 수 있지만 host는 인터페이스가 하나 밖에 없기 때문에 또 새로운 host 네트워크를 생성 할 순 없습니다 그래서 -p 옵션으로 포트를 따로 지정하면 오류가 뜹니다
또 중요하게 알아둬야 할 점이 있습니다 bridge는 기본적으로 docker에서 지배를 하고 있기 때문에 방화벽을 따로 열어주지 않아도 외부로 통신이 가능하게 -p
옵션을 사용할 수 있습니다
하지만 Host는 가상머신과 직접 연결이 되어있기때문에 firewalld가 Host 네트워크 카드를 지배하고 있습니다
즉, 외부로 통신을 하기 위해선 로컬에서 따로 방화벽을 열어줘야 한다는 뜻이지요
docker run -itd --net host -p 60080:80 --name h1 httpd
Host 네트워크 카드를 사용한다고 --net
옵션을 사용하고 병행하여 -p
옵션을 사용하면 오류가 뜨는 모습을 확인 할 수 있습니다
정상적으로 실행이 되는 모습을 보이곤 있지만 접속을 해보면 연결이 되지 않습니다
docker run -itd --net host --name h1 httpd
을 사용하여 이번에는 -p
옵션을 주지 않고 실행을 시켰을때 오류 없이 잘 실행되었고 방화벽 80포트 또한 열어주었습니다
그랬더니 아까와 달리 It works! 가 잘뜨는 모습을 볼 수 있습니다
이렇게 확인을 하였을때 Host 네트워크는 firewall의 지배를 받고 있고 외부로 통신을 하기 위해선 방화벽 포트를 열어줘야 한다는 것을 확인 하게 되었습니다