網絡容器
如果您按照用戶指南的方式工作,則只需構建並運行一個簡單的應用程序即可。你也建立了自己的圖像。本節將教您如何聯網您的容器。
1,在默認網絡上啓動容器
Docker通過使用網絡驅動程序支持網絡容器。默認情況下,Docker爲您bridge和overlay驅動程序提供兩種網絡驅動 程序。您也可以編寫網絡驅動程序插件,以便您可以創建自己的驅動程序,但這是一項高級任務。
Docker Engine的每次安裝都會自動包含三個默認網絡。你可以列出它們:
$ docker network ls
NETWORK ID NAME DRIVER
18a2866682b8 none null
c288470c46f6 host host
7b369448dccb bridge bridge
被命名的網絡bridge是一個特殊的網絡。除非另有說明,否則Docker會始終在此網絡中啓動您的容器。現在試試這個:
$ docker run -itd --name=networktest ubuntu
74695c9cea6d9810718fddadc01a727a5dd3ce6a69d09752239736c030599741
基本的bridge架構圖
[root@node84 ~]# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "9bcc935524d450f6aee0496a365d89e73925909b7ad143dcc4552cbc97fe9aa1",
"Created": "2018-03-26T09:50:06.053401367+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
您可以通過斷開容器從網絡中移除容器。爲此,您提供網絡名稱和容器名稱。您也可以使用容器ID。但在這個例子中,名字更好一些。
#斷開容器
$ docker network disconnect bridge networktest
雖然可以從網絡斷開容器,但不能刪除已bridge命名的內置網絡bridge。網絡是將容器與其他容器或其他網絡隔離的自然方式。所以,當你更熟悉Docker時,你會想創建自己的網絡。
2,創建您自己的bridge網絡
Docker引擎本身支持橋網絡和覆蓋網絡。bridge網絡僅限於運行Docker Engine的單個主機。覆蓋網絡可以包括多個主機,並且是更高級的主題。對於這個例子,你將創建一個橋樑網絡:
$ docker network create -d bridge my_bridge
該-d標誌告訴Docker bridge爲新網絡使用驅動程序。這個標誌bridge的默認值是可以離開這個標誌的。繼續並在您的機器上列出網絡:
$ docker network ls
NETWORK ID NAME DRIVER
7b369448dccb bridge bridge
615d565d498c my_bridge bridge
18a2866682b8 none null
c288470c46f6 host host
如果你檢查網絡,你會發現它沒有任何內容。
$ docker network inspect my_bridge
[
{
"Name": "my_bridge",
"Id": "5a8afc6364bccb199540e133e63adb76a557906dd9ff82b94183fc48c40857ac",
"Scope": "local",
"Driver": "bridge",
"IPAM": {
"Driver": "default",
"Config": [
{
"Subnet": "10.0.0.0/24",
"Gateway": "10.0.0.1"
}
]
},
"Containers": {},
"Options": {},
"Labels": {}
}
]
3,將容器添加到網絡
要構建一致行動但可以安全執行的Web應用程序,請創建一個網絡。根據定義,網絡爲容器提供完全的隔離。首次運行容器時,您可以將容器添加到網絡。
啓動一個運行PostgreSQL數據庫的容器,並將其傳遞給它–net=my_bridge以將其連接到新網絡的標誌:
$ docker run -d --net=my_bridge --name db centos
如果你檢查my_bridge你會看到它有一個容器。您還可以檢查您的容器以查看它連接的位置:
$ docker inspect --format='{{json .NetworkSettings.Networks}}' db
{"my_bridge":{"IPAMConfig":null,"Links":null,"Aliases":["bc1c7ab15316"],"NetworkID":"2c72f1112c00eb3674462e18608a97df62713282223b01445da94dd866b9b98f","EndpointID":"","Gateway":"","IPAddress":"","IPPrefixLen":0,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":""}}
現在,繼續,開始你現在熟悉的Web應用程序。這次不指定網絡。
$ docker run -d --name web training/webapp python app.py
然後,獲取你的IP地址 web
$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web
172.17.0.2
現在,打開一個shell到你正在運行的db容器中:
$ docker exec -it db bash
root@a205f0dd33b2:/# ping 172.17.0.2
ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
^C
--- 172.17.0.2 ping statistics ---
44 packets transmitted, 0 received, 100% packet loss, time 43185ms
稍等片刻,CTRL-C用來結束ping,你會發現ping失敗。這是因爲兩個容器在不同的網絡上運行。你可以解決這個問題。然後,使用該exit命令關閉容器。
Docker網絡允許您將容器附加到儘可能多的網絡上。您也可以附加一個已經運行的容器。繼續並將您正在運行的web應用程序附加到my_bridge。
$ docker network connect my_bridge web
db再次打開一個shell到應用程序中,然後嘗試ping命令。這次只需使用容器名稱web而不是IP地址。
$ docker exec -it db bash
root@a205f0dd33b2:/# ping web
PING web (10.0.0.2) 56(84) bytes of data.
64 bytes from web (10.0.0.2): icmp_seq=1 ttl=64 time=0.095 ms
64 bytes from web (10.0.0.2): icmp_seq=2 ttl=64 time=0.060 ms
64 bytes from web (10.0.0.2): icmp_seq=3 ttl=64 time=0.066 ms
^C
--- web ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.060/0.073/0.095/0.018 ms
的ping表明它是接觸不同的IP地址,在地址my_bridge是從其上地址不同bridge的網絡。