啟用IPv6支持
在Docker容器或swarm服務中使用IPv6之前,需要在Docker守護程序中啟用IPv6支持。之后,您可以選擇將IPv4或IPv6(或兩者)與任何容器,服務或網絡一起使用。
注意:僅在Linux主機上運行的Docker守護程序上支持IPv6網絡。
-
編輯
/etc/docker/daemon.json並將ipv6設置為true。{ "ipv6": true }
保存文件。
-
重新加載Docker配置文件。
$ systemctl reload docker
您現在可以使用該--ipv6標志創建網絡,並使用該--ip6標志分配容器IPv6地址。
Docker和iptables
在Linux上,Docker操縱iptables規則以提供網絡隔離。這是一個實現細節,您不應該修改Docker插入iptables策略的規則。
在Docker規則之前添加iptables策略
Docker的所有iptables規則都被添加到DOCKER鏈中。不要手動操作此表。如果您需要添加在Docker規則之前加載的規則,請將它們添加到DOCKER-USER鏈中。在Docker自動創建任何規則之前加載這些規則。
限制與Docker守護程序的連接
默認情況下,允許所有外部源IP連接到Docker守護程序。要僅允許特定IP或網絡訪問容器,請在DOCKER過濾器鏈的頂部插入否定規則。例如,以下規則限制對除192.168.1.1之外的所有IP地址的外部訪問:
$ iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.1 -j DROP
您可以改為允許來自源子網的連接。以下規則僅允許從子網192.168.1.0/24進行訪問:
$ iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.0/24 -j DROP
最后,您可以指定要接受的IP地址范圍--src-range (記住還要-m iprange在使用時添加--src-range或--dst-range):
$ iptables -I DOCKER-USER -m iprange -i ext_if ! --src-range 192.168.1.1-192.168.1.3 -j DROP
iptables復雜,更復雜的規則超出了本主題的范圍。有關 更多信息,請參見Netfilter.org HOWTO。
要防止Docker完全操作iptables策略,請將iptables設置 為false 在/etc/docker/daemon.json。這對大多數用戶來說是不合適的,因為這些iptables策略需要手動管理。
集裝箱網絡
容器使用的網絡類型(無論是網橋, 覆蓋,macvlan網絡還是自定義網絡插件)在容器內是透明的。從容器的角度來看,它具有網絡接口,包括IP地址,網關,路由表,DNS服務和其他網絡詳細信息(假設容器未使用none網絡驅動程序)。本主題是從容器的角度來看網絡問題。
發布的端口
默認情況下,當您創建容器時,它不會將其任何端口發布到外部世界。要使端口可用於Docker之外的服務,或者未連接到容器網絡的Docker容器,請使用 --publish或-p標記。這將創建一個防火牆規則,將容器端口映射到Docker主機上的端口。這里有些例子。
| 標志值 | 描述 |
|---|---|
-p 8080:80 |
將容器中的TCP端口80映射到Docker主機上的端口8080。 |
-p 192.168.1.100:8080:80 |
將容器中的TCP端口80映射到Docker主機上的端口8080,以連接到主機IP 192.168.1.100。 |
-p 8080:80/udp |
將容器中的UDP端口80映射到Docker主機上的端口8080。 |
-p 8080:80/tcp -p 8080:80/udp |
將容器中的TCP端口80映射到Docker主機上的TCP端口8080,並將容器中的UDP端口80映射到Docker主機上的UDP端口8080。 |
IP地址和主機名
默認情況下,為容器分配連接到的每個Docker網絡的IP地址。IP地址是從分配網絡的池中分配的,因此Docker守護進程實際上充當每個容器的DHCP服務器。每個網絡還具有默認子網掩碼和網關。
當容器啟動時,它只能使用連接到單個網絡 --network。但是,您可以使用運行容器連接到多個網絡docker network connect。
使用時將現有容器連接到其他網絡時 docker network connect,可以使用該命令上的--ip或--ip6標志來指定其他網絡上容器的IP地址。
同樣,容器的主機名默認為Docker中容器的名稱。您可以使用覆蓋主機名--hostname。使用時連接到現有網絡時docker network connect,可以使用該--alias 標志為該網絡上的容器指定其他網絡別名。
DNS服務
默認情況下,容器繼承Docker守護程序的DNS設置,包括/etc/hosts和/etc/resolv.conf。您可以基於每個容器覆蓋這些設置。
| 旗 | 描述 |
|---|---|
--dns |
DNS服務器的IP地址。要指定多個DNS服務器,請使用多個--dns標志。如果容器無法訪問您指定的任何IP地址,8.8.8.8則會添加Google的公共DNS服務器,以便您的容器可以解析Internet域。 |
--dns-search |
用於搜索非完全限定主機名的DNS搜索域。要指定多個DNS搜索前綴,請使用多個--dns-search標志。 |
--dns-opt |
表示DNS選項及其值的鍵值對。有關resolv.conf有效選項,請參閱操作系統的文檔。 |
--hostname |
容器用於自身的主機名。如果未指定,則默認為容器的名稱。 |
配置Docker以使用代理服務器
如果您的容器需要使用HTTP,HTTPS或FTP代理服務器,則可以通過不同方式對其進行配置:
-
在Docker 17.07及更高版本中,您可以 將Docker客戶端配置為自動將代理信息傳遞給容器。
-
在Docker 17.06及更低版本中,您必須 在容器中設置適當的環境變量。您可以在構建映像時(這使圖像不那么便攜)或創建或運行容器時執行此操作。
配置Docker客戶端
-
在Docker客戶端上,
~/.docker/config.json在啟動容器的用戶的主目錄中創建或編輯該文件。添加如下所示的JSON,用httpsProxy或ftpProxy在必要時替換代理類型,並替換代理服務器的地址和端口。您可以同時配置多個代理服務器。您可以選擇通過將
noProxy設置為一個或多個以逗號分隔的IP地址或主機來排除主機或范圍通過代理服務器。*支持將該字符用作通配符,如此示例所示。{ "proxies": { "default": { "httpProxy": "http://127.0.0.1:3001", "noProxy": "*.test.example.com,.example2.com" } } }
保存文件。
-
創建或啟動新容器時,會在容器中自動設置環境變量。
使用環境變量
手動設置環境變量
在構建映像時,或在創建或運行容器時使用標志--env 時,可以將以下一個或多個變量設置為適當的值。此方法使鏡像的可移植性降低,因此如果您使用Docker 17.07或更高版本,則應該配置Docker客戶端。
| 變量 | Dockerfile示例 | docker run 例 |
|---|---|---|
HTTP_PROXY |
ENV HTTP_PROXY "http://127.0.0.1:3001" |
--env HTTP_PROXY="http://127.0.0.1:3001" |
HTTPS_PROXY |
ENV HTTPS_PROXY "https://127.0.0.1:3001" |
--env HTTPS_PROXY="https://127.0.0.1:3001" |
FTP_PROXY |
ENV FTP_PROXY "ftp://127.0.0.1:3001" |
--env FTP_PROXY="ftp://127.0.0.1:3001" |
NO_PROXY |
ENV NO_PROXY "*.test.example.com,.example2.com" |
--env NO_PROXY="*.test.example.com,.example2.com" |
