查看docker網絡
[root@i zhizhu]# docker network ls
NETWORK ID NAME DRIVER SCOPE
94669184dd23 backend bridge local
57de7f32064e bridge bridge local
4b44a5340d6e host host local
1d49ba42e213 lijiacai bridge local
ac8e8ffe243f none null local
1.docker單主機容器通信
1.docker網絡有五種模式
none:docker容器內不使用任何網絡,相當於與宿主是隔絕的
host:這個網絡表示容器與宿主機共享網絡,也就是宿主機內的ip與容器內是一致的
bridge:docker默認的網絡模式,爲容器創建獨立的網絡,容器具有獨立的網卡等所有單獨的網絡棧,ip也將任意分配
容器模式:這種模式是將兩個容器的網絡進行共享,與host類似
用戶自定義:這種模式網絡會依附於bridge上,當然本身網絡是隔離開的,網段不一樣
2.整體圖
3.模式理解
host
優勢:
a) 直接使用宿主機ip進行通信,若宿主機具有公網ip,那麼該容器一樣具有公網ip
b) 性能上需要在bridge等方式轉發數據包
劣勢:
a) 不再擁有隔離網絡棧
b) 容器內的所有端口資源不在享有,而要與宿主機保持一致
這樣的劣勢就代表你無法同時啓動兩個mysql服務的3306端口
bridge
優勢:
a) 獨立網卡,獨立ip,通過docker0網橋仍然可以與宿主機通信
b) 容器內部可以使用所有端口號資源
劣勢:
a) 與外界通信時,由於轉發數據,影響性能
b) 容器內的ip任意分配的,不方便把握
none
不包含任何網絡配置,只具有lo這個loopback網卡用於進程通信
其他容器模式
在這個模式下的容器,會使用其他容器的網絡命名空間,其網絡隔離性會處於bridge橋接模式與host模式之間
2.容器訪問控制
1.容器的訪問控制,主要通過 Linux 上的 iptables 防火牆來進行管理和實現。
2.容器訪問外部網絡
a) 查看本地系統的轉發是否打開
[root@i ~]# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
b) 如果爲 0,說明沒有開啓轉發,則需要手動打開
[root@i ~]# sysctl -w net.ipv4.ip_forward=1
3.訪問所有端口
1.當啓動docker服務的時候,默認會添加一條轉發策略到本地主機 iptables 的 FORWARD 鏈上
2.策略爲通過(ACCEPT)還是禁止(DROP)取決於配置--icc=true(缺省值)還是 --icc=false
3.如果手動指定 --iptables=false 則不會添加 iptables 規則
總結:
可見,默認情況下,不同容器之間是允許網絡互通的。如果爲了安全考慮,可以在 /etc/docker/daemon.json 文件中配置 {"icc": false} 來禁止它(Ubuntu 14.04 等使用 upstart 的系統在文件 /etc/default/docker 中配置 DOCKER_OPTS=--icc=false)。
4.訪問指定端口
在通過 -icc=false 關閉網絡訪問後,還可以通過 --link=CONTAINER_NAME:ALIAS 選項來訪問容器的開放端口。