述
要構(gòu)建具有安全的一致行為的web應(yīng)用程序,可以使用Docker網(wǎng)絡(luò)特性.根據(jù)定義,網(wǎng)絡(luò)為容器實現(xiàn)了完全隔離.因此,控制應(yīng)用程序所在的網(wǎng)絡(luò)很重要,Docker容器網(wǎng)絡(luò)為您提供了這種控制能力.
默認(rèn)網(wǎng)絡(luò)
docker提供了三種網(wǎng)絡(luò),可以通過docker network ls
命令去查看,結(jié)果如下:
前面三個就是docker默認(rèn)提供的,運行容器的時候可以通過--net
來指定網(wǎng)絡(luò),先來看下這三個默認(rèn)的網(wǎng)絡(luò)分別是怎樣的
- bridge: 表示所有Docker安裝中都存在的docker0網(wǎng)絡(luò). 除非使用
docker run --net=<network>
選項另行指定,否則Docker守護(hù)進(jìn)程默認(rèn)情況下會將容器連接到此網(wǎng)絡(luò),在主機上使用ifconfig
命令,可以看到此網(wǎng)橋是主機的網(wǎng)絡(luò)堆棧的一部分 - none: 意味著不指定網(wǎng)絡(luò),使用這個網(wǎng)絡(luò)的容器中沒有網(wǎng)卡.
- host: 會將容器加入宿主機所在的網(wǎng)絡(luò)中,在使用這個網(wǎng)絡(luò)的容器中其網(wǎng)絡(luò)配置和宿主機一樣
bridge網(wǎng)絡(luò)詳解
查看bridge網(wǎng)絡(luò)的詳細(xì)信息,命令如下:
docker network inspect bridge
返回值:
[
{
"Name": "bridge",
"Id": "e73fffb9d7ea78c02f9fdcabd33377054ae1f391ed883d8b4c6141f2ee99b101",
"Created": "2019-04-23T09:36:04.07923852+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": {
"dc37d28c293f8568e396f2c788b43f1fc1e293b88f85232a6c5ae550a099493e": {
"Name": "registry",
"EndpointID": "8d31b605406c7aa857366af422eca1e859cbb6610bb4a166c61c893866f006df",
"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": "1500"
},
"Labels": {}
}
]
看一下返回值中的Containers
,就是所有使用這個網(wǎng)絡(luò)的容器的信息,上面這個返回值里面的容器就是我們上文中搭建docker倉庫的那個容器
在這個網(wǎng)絡(luò)中的容器,互相之間可以通過ip進(jìn)行通信,Docker不支持默認(rèn)的bridge網(wǎng)絡(luò)上的服務(wù)發(fā)現(xiàn)(automatic service discovery),如果你希望默認(rèn)的bridge網(wǎng)絡(luò)上的容器之間能夠通過名字互相通信,需要在docker run
命令中指定--link
標(biāo)識
默認(rèn)的docker0網(wǎng)絡(luò)上支持通過端口映射或是使用--link來進(jìn)行通信,但這種方法很笨重且容易出錯,不建議在以后的應(yīng)用中使用.
自定義網(wǎng)絡(luò)
為了很好的實現(xiàn)容器之間的網(wǎng)絡(luò)隔離,可以使用自定義網(wǎng)絡(luò),Docker提供了一些網(wǎng)絡(luò)驅(qū)動器(network driver)來方便用戶自定義網(wǎng)絡(luò),你可以創(chuàng)建bridge network
或overlay network
,也可以通過創(chuàng)建自己的網(wǎng)絡(luò)插件.
你可以創(chuàng)建許多網(wǎng)絡(luò),Docker支持將一個容器加入多個網(wǎng)絡(luò),只有在同一個網(wǎng)絡(luò)中的容器之間才可以相互通信,而不能跨網(wǎng)絡(luò)通信.
創(chuàng)建bridge網(wǎng)絡(luò)
創(chuàng)建自定義網(wǎng)絡(luò)最簡單的方式就是創(chuàng)建一個bridge網(wǎng)絡(luò).這樣創(chuàng)建的網(wǎng)絡(luò)和之間介紹的docker0網(wǎng)絡(luò)很像. 命令如下:
docker network create --driver bridge isolated_nw
創(chuàng)建完成之后,容器就可以使用了.在docker run
命令中加入?yún)?shù),--net=isolated_nw
就ok了
同時在容器運行過程中,也可以指定網(wǎng)絡(luò),命令如下:
docker network connect 網(wǎng)絡(luò)名/id 容器名/id
我們上面創(chuàng)建的這個網(wǎng)絡(luò)中,加入這個bridge網(wǎng)絡(luò)的容器必須在同一個宿主機上,同一個網(wǎng)絡(luò)中的容器之間可以直接通信,但不能和不同網(wǎng)絡(luò)的容器通信.其示意圖如下:
在用戶自定義的bridge網(wǎng)絡(luò)中,--link
是不支持的,如果你希望外部網(wǎng)絡(luò)可以訪問容器中的應(yīng)用,可以通過對外暴露端口(expose port)的方式完成.
如果你希望在單個宿主機上創(chuàng)建一個小型網(wǎng)絡(luò),bridge網(wǎng)絡(luò)是很有用的.但如果想創(chuàng)建更大的網(wǎng)絡(luò),尤其是跨越多個宿主機的網(wǎng)絡(luò),那就需要創(chuàng)建overlay網(wǎng)絡(luò)
overlay網(wǎng)絡(luò)這里先不做介紹,想了解的同學(xué)可以看這里:原文地址