PS:關於網絡的官方文檔:https://docs.docker.com/network/
一. 網絡模式
docker提供五種網絡模式
- bridge
- host
- none
- container
- 自定義網絡
1. bridge
–net=bridge
默認網絡,Docker啓動後創建一個docker0網橋,默認創建的容器也是添加到這個網橋中。
2. host
–net=host
容器不會獲得一個獨立的network namespace,而是與宿主機共用一個。這就意味着容器不會有自己的網卡信息,而是使用宿主機的。容器除了網絡,其他都是隔離的。
$ docker image pull busybox //拉取一個busybox測試
$ docker container run -it --name=test_bus --network=host busybox //新建容器
3. none
–net=none
獲取獨立的network namespace,但不爲容器進行任何網絡配置,需要我們手動配置。
$ docker container run -it --network=none busybox
4. container
–net=container:Name/ID
與指定的容器使用同一個network namespace,具有同樣的網絡配置信息,兩個容器除了網絡,其他都還是隔離的。
$ docker container run -itd -p 8080:80 busybox //創建一個box映射80端口
$ docker container run -itd --name nginx_01 --network=container:3f623edc41e5 nginx //創建一個nginx並把網絡指定到box的空間中
$ docker container inspect 3f623edc41e5 //查看box的網絡
最後能夠訪問box中的nginx
自定義網絡
與默認的bridge原理一樣,但自定義網絡具備內部DNS發現,可以通過容器名容器之間網絡通信。
$ docker network create net_test //創建一個自定義網絡
$ docker network ls //ls命令可以查看當前網絡
$ docker network inspect 090e7585eee3 //查看詳情等 跟 vol數據卷操作幾乎相同
創建好一個網絡後在創建兩個容器 test
$ docker container run -itd --network=net_test busybox
$ docker container run -itd --network=net_test busybox
二. 容器網絡訪問原理
一臺宿主機,網卡eth0 192段,宿主機內的容器默認172段,其它主機訪問容器是通過宿主機轉發完成,
下圖的veth類似一個管道,提供宿主機與容器的通信(宿主機一個容器一個),創建容器時就會自動創建veth虛擬設備
上圖的網關最終到了宿主機的一個模擬網卡上,然後通過ens33出去
所以veth有極大的作用