本博客為JDGan自修D(zhuǎn)ocker的筆記盖呼,如有粗鄙之處,還請(qǐng)見(jiàn)諒~
閱讀本博客前化撕,請(qǐng)確定了解了以前的blog:
Docker 自修筆記(一)
Docker 自修筆記 附 —— 分享docker鏡像
Docker 自修筆記(二)
Docker 自修筆記(三)
Docker 自修筆記(四)
容器的網(wǎng)絡(luò)部署
通過(guò)默認(rèn)網(wǎng)絡(luò)驅(qū)動(dòng)器部署容器
Docker 可以通過(guò)使用網(wǎng)絡(luò)驅(qū)動(dòng)器(network drivers)來(lái)進(jìn)行網(wǎng)絡(luò)部署几晤,Docker引擎自動(dòng)啟動(dòng)了幾個(gè)網(wǎng)絡(luò),可以通過(guò)ls打印出來(lái):
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
a2d429ecaf49 bridge bridge local
ce0f138b6685 docker_gwbridge bridge local
699a0339616b host host local
20791422dd99 none null local
Docker 默認(rèn)是使用bridge
來(lái)啟動(dòng)網(wǎng)絡(luò)容器植阴,通過(guò)inspect
來(lái)檢查該網(wǎng)絡(luò)的信息蟹瘾。
$ docker run -itd --name=networktest ubuntu
......
......
$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "f7ab26d71dbd6f557852c7156ae0574bbf62c42f539b50c8ebde0f728a253b6f",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.1/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Containers": {
"3386a527aa08b37ea9232cbcace2d2458d49f44bb05a6b775fba7ddd40d8f92c": {
"Name": "networktest",
"EndpointID": "647c12443e91faf0fd508b6edfe59c30b642abb60dfab890b4bdccee38750bc1",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"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": "9001"
},
"Labels": {}
}
]
如果需要斷開容器的網(wǎng)絡(luò),可以通過(guò)disconnect
命令來(lái)執(zhí)行:
$ docker network disconnect bridge networktest
創(chuàng)建自定義bridge
網(wǎng)絡(luò)
Docker官方支持的網(wǎng)絡(luò)驅(qū)動(dòng)器為:bridge
和overlay
兩種:bridge
是僅支持單個(gè)主機(jī)的網(wǎng)絡(luò)掠手,而overlay
支持多個(gè)主機(jī)憾朴。
舉個(gè)栗子,首先創(chuàng)建一個(gè)bridge
網(wǎng)絡(luò):
$ docker network create -d bridge my_bridge
$ docker inspect my_bridge
[
{
"Name": "my_bridge",
"Id": "b76785001c95aa6a59a68362afa31c6980f23fcbbf6e99c31e32299f815dd188",
"Created": "2017-07-19T08:04:48.72271711Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
將容器添加到網(wǎng)絡(luò)
通過(guò)使用--net=my_bridge
運(yùn)行容器喷鸽,來(lái)使用上面創(chuàng)建的網(wǎng)絡(luò)里众雷。
首先獲取一個(gè)PostgreSQL數(shù)據(jù)庫(kù),并連接到網(wǎng)絡(luò)做祝。
$ docker run -d --net=my_bridge --name db training/postgres
完成后可以檢查docker網(wǎng)絡(luò):
$ docker inspect --format='{{json .NetworkSettings.Networks}}' db
{"my_bridge":{"IPAMConfig":null,"Links":null,"Aliases":["2ba194069046"],"NetworkID":"b76785001c95aa6a59a68362afa31c6980f23fcbbf6e99c31e32299f815dd188","EndpointID":"65c9a19a51451eec25bd81a78c156d26aa466df037043f8a2e552f8236c713bd","Gateway":"172.18.0.1","IPAddress":"172.18.0.2","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:12:00:02","DriverOpts":null}}
數(shù)據(jù)庫(kù)啟動(dòng)并連接成功啦砾省, 接下來(lái)我們啟動(dòng)一個(gè)web服務(wù):
$ docker run -d --name web training/webapp python app.py
啟動(dòng)成功的結(jié)構(gòu)圖。
檢查啟動(dòng)結(jié)果:
$ docker inspect --format='{{json .NetworkSettings.Networks}}' web
{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"NetworkID":"cdd6f0ecda824d95469b6105085b96574e1fa96bdccaa726f42a2ba89e30c863","EndpointID":"5aef9b86a310d42b9ee22a52098f000793b9f0b90b934a47dfe8257c42920e7c","Gateway":"172.17.0.1","IPAddress":"172.17.0.2","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:02","DriverOpts":null}}
$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web
172.17.0.2
然后混槐,在db容器上啟動(dòng)shell:
$ docker exec -it db bash
root@2ba194069046:/# 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 ---
12 packets transmitted, 0 received, 100% packet loss, time 11416ms
兩個(gè)容器在不同的網(wǎng)絡(luò)上運(yùn)行编兄,所以無(wú)法連接。Docker 允許容器連接多個(gè)網(wǎng)絡(luò)声登,并且也可以在容器運(yùn)行時(shí)修改連接的網(wǎng)絡(luò)狠鸳。那么:
$ docker network connect my_bridge web
修改后啟動(dòng)成功的結(jié)構(gòu)圖。
再次打開db的shell悯嗓,嘗試ping
:
$ docker exec -it db bash
root@2ba194069046:/# ping web
PING web (172.18.0.3) 56(84) bytes of data.
64 bytes from web.my_bridge (172.18.0.3): icmp_seq=1 ttl=64 time=0.094 ms
64 bytes from web.my_bridge (172.18.0.3): icmp_seq=2 ttl=64 time=0.070 ms
64 bytes from web.my_bridge (172.18.0.3): icmp_seq=3 ttl=64 time=0.076 ms
64 bytes from web.my_bridge (172.18.0.3): icmp_seq=4 ttl=64 time=0.070 ms
64 bytes from web.my_bridge (172.18.0.3): icmp_seq=5 ttl=64 time=0.076 ms
^C
--- web ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4130ms
rtt min/avg/max/mdev = 0.070/0.077/0.094/0.010 ms
這樣件舵,我們就完成了我們的web和db的網(wǎng)絡(luò)部署。