容器的訪問控制,主要通過 linux 上的iptables
防火牆來進行管理和實現。iptables
是 linux 上預設的防火牆軟體,在大部分發行版中都自帶。
容器要想訪問外部網路,需要本地系統的**支援。在linux 系統中,檢查**是否開啟。
$sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
如果為 0,說明沒有開啟**,則需要手動開啟。
$sysctl -w net.ipv4.ip_forward=1
如果在啟動 docker 服務的時候設定--ip-forward=true
, docker 就會自動設定系統的ip_forward
引數為 1。
容器之間相互訪問,需要兩方面的支援。
訪問所有埠
當啟動 docker 服務(即 dockerd)的時候,缺省會新增一條**策略到本地主機 iptables 的 forward 鏈上。策略為通過(accept
)還是禁止(drop
)取決於配置--icc=true
(預設值)還是--icc=false
。當然,如果手動指定--iptables=false
則不會新增iptables
規則。
可見,預設情況下,不同容器之間是允許網路互通的。如果為了安全考慮,可以在/etc/docker/daemon.json
檔案中配置來禁止它。
訪問指定埠
在通過-icc=false
關閉網路訪問後,還可以通過--link=container_name:alias
選項來訪問容器的開放埠。
例如,在啟動 docker 服務時,可以同時使用icc=false --iptables=true
引數來關閉允許相互的網路訪問,並讓 docker 可以修改系統中的iptables
規則。
此時,系統中的iptables
規則可能是類似
$ sudo iptables -nl
...chain forward (policy accept)
target prot opt source destination
drop all -- 0.0.0.0/0 0.0.0.0/0
...
之後,啟動容器(docker run
)時使用--link=container_name:alias
選項。docker 會在iptable
中為 兩個容器分別新增一條accept
規則,允許相互訪問開放的埠(取決於dockerfile
中的expose
指令)。
當新增了--link=container_name:alias
選項後,新增了iptables
規則。
$ sudo iptables -nl
...chain forward (policy accept)
target prot opt source destination
accept tcp -- 172.17.0.2 172.17.0.3 tcp spt:80
accept tcp -- 172.17.0.3 172.17.0.2 tcp dpt:80
drop all -- 0.0.0.0/0 0.0.0.0/0
注意:--link=container_name:alias
中的container_name
目前必須是 docker 分配的名字,或使用--name
引數指定的名字。主機名則不會被識別。 Docker從入門到實踐
mark docker從入門到實踐 1.docker整體介紹 1.1 docker的基本概念 講開發程式自動部署到容器的 引擎 伺服器為貨船,容器為貨櫃,應用程式為貨櫃的貨物,碼頭工人為docker 1.2 docker總體架構 三要素 映象image 容器container 倉庫reglstry ...
筆記 Docker 從入門到實踐 2
docker容器中產生的資料在容器關閉後會被清除,下次容器啟動時會恢復到映象初始狀態。如何儲存容器中建立的資料?docker 提供了兩種方法可以把在容器執行中產生的資料儲存到宿主機的檔案系統中。當啟動乙個容器時可以mount 資料卷 乙個宿主機的目錄或者檔案 到容器中,容器中產生的資料可以儲存在資料...
Linux從入門到放棄 docker 容器常用命令
建立 docker container create name wy nginx latest建立並啟動容器 docker run 例子 docker run d it p 80 80 restart always nginx latest restart always 開機自啟建立容器 docke...