1. 程式人生 > 其它 >二、--link與自定義網路

二、--link與自定義網路

--link(不推薦使用) 思考一個場景,我們編寫了一個微服務,專案不重啟,資料庫ip換掉了,我們希望可以處理這個問題,可以用名字來訪問? 1.啟動兩個容器如下 [root@docker ~]# docker ps CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 79bec4d5841acentos"/bin/bash"28 minutes agoUp 28 minutescentos02 95937ebb5ce8centos"/bin/bash"29 minutes agoUp 29 minutescentos01 [root@docker ~]# docker exec -it centos01 ping centos02 ping: centos02: Name or service not known 我們發現不能ping通: 解決辦法--link即可解決連線問題,但是反向連線不能ping通 [root@docker ~]# docker run -d -it --name centos03 --link centos01 --link centos02 centos ed7e71239e34507cd1aa32590df51f0a0fdc335d7d9ef6503c170197fb1ab92e [root@docker ~]# docker exec -it centos03 ping centos01 PING centos01 (172.17.0.2) 56(84) bytes of data. 64 bytes from centos01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.055 ms 64 bytes from centos01 (172.17.0.2): icmp_seq=2 ttl=64 time=0.043 ms 可以檢視網絡卡資訊 [root@docker ~]# docker network inspect bridge [ { "Name": "bridge", "Id": "219769a742011931a0b08b03fc00f6135ad1bcabce1cfa93bc68902b532a2a3b", "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, "Containers": { "79bec4d5841a7f4bba483e0a0107383eea759d863ade5c6bf0d2c7cdf5693950": { "Name": "centos02", "EndpointID": "0e862a4d7bd09adaed475d9844af2d72a07a412b72534bfdac107af42b9991ef", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", "IPv6Address": "" }, "95937ebb5ce8d7571232306218f44d7da65dc6e9aa8b901e8c156315199ec759": { "Name": "centos01", "EndpointID": "4ed26158cd299b9d834e9b90142e1131e62f0c107124f7c4babd54fa3fa58962", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" }, "ed7e71239e34507cd1aa32590df51f0a0fdc335d7d9ef6503c170197fb1ab92e": { "Name": "centos03", "EndpointID": "a2eacc59f98083eccfa2ce4f8b00f7d311ab056cd0118b0bdbaad0c88cbbbcf5", "MacAddress": "02:42:ac:11:00:04", "IPv4Address": "172.17.0.4/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": {} } ] 探索 inspect 其實這個centos03就是配置了centos01-02的配置 #檢視hosts配置,在這裡原理髮現 [root@docker ~]# docker exec -it centos03 cat /etc/hosts 127.0.0.1localhost ::1localhost ip6-localhost ip6-loopback fe00::0ip6-localnet ff00::0ip6-mcastprefix ff02::1ip6-allnodes ff02::2ip6-allrouters 172.17.0.2centos01 95937ebb5ce8 172.17.0.3centos02 79bec4d5841a 172.17.0.4ed7e71239e34 本質探究:--link操作就是在hosts配置中增加了一個centos01-2的對映 在真實專案中已經不建議使用--link了 在實際中我們採用自定義網路,不使用docker0 docker的問題:它不支援容器名連線訪問 自定義網路 [root@docker ~]# docker network ls #檢視所有網絡卡 docker network rm 刪除網絡卡 [root@docker ~]# docker network ls NETWORK IDNAMEDRIVERSCOPE 219769a74201bridgebridge local f6b9d84b1f81 host host local 47132fb890ac none null local 網路模式 bridge :橋接(預設,自己建立網路也推薦使用bridge模式) none: 不配置網路 host: 和宿主機共享網路 container:容器網路連通!(使用較少!侷限性很大) 測試: #我們直接啟動的命令--network bridge ,而這個就是我們的docker0 [root@docker ~]#docker run -d -P --name centos1 --network bridge centos #docker0 :預設,域名不能訪問,使用--link可以打通連線 #我們可以自定義一個網路 [root@docker ~]# docker network create --help #幫助命令檢視 [root@docker ~]#docker network create --driver bridge --subnet 192.168.1.0/24 --gateway 192.168.1.1 mynet 2bb4bf4c05391ed5349957522374d4e0a1043b3767f3fa7fe15a6f8754437e0b [root@docker ~]# docker network ls NETWORK IDNAMEDRIVERSCOPE 219769a74201bridgebridgelocal f6b9d84b1f81hosthostlocal 2bb4bf4c0539mynetbridgelocal 47132fb890acnonenulllocal 引數講解: --driver bridge :指定模式為橋接 --subnet: 子網地址 --gateway: 閘道器 [root@docker ~]# docker network inspect mynet [ { "Name": "mynet", "Id": "2bb4bf4c05391ed5349957522374d4e0a1043b3767f3fa7fe15a6f8754437e0b", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.1.0/24", "Gateway": "192.168.1.1" } ] }, "Internal": false, "Containers": {}, "Options": {}, "Labels": {} } ] 至此我們自己的網路就建立好了 接下來啟動兩個容器測試: [root@docker ~]# docker run -d -it -P --name cenos01--network mynet centos 0f928c84f9f4615e432198d78a5e72062334041117b5b74ce66e327422dc6f78 [root@docker ~]# docker run -d -it -P --name cenos02--network mynet centos 6dcaf8d1698263309bb87d5f535981679e73958f7cb63d2fe69a9a3fa74d6808 [root@docker ~]# docker network inspect mynet [ { "Name": "mynet", "Id": "2bb4bf4c05391ed5349957522374d4e0a1043b3767f3fa7fe15a6f8754437e0b", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.1.0/24", "Gateway": "192.168.1.1" } ] }, "Internal": false, "Containers": { "0f928c84f9f4615e432198d78a5e72062334041117b5b74ce66e327422dc6f78": { "Name": "cenos01", "EndpointID": "c6a6451c319156074642e6c26d7305977c7619bd5fe3faeac1bab656dc7c81e5", "MacAddress": "02:42:c0:a8:01:02", "IPv4Address": "192.168.1.2/24", "IPv6Address": "" }, "6dcaf8d1698263309bb87d5f535981679e73958f7cb63d2fe69a9a3fa74d6808": { "Name": "cenos02", "EndpointID": "9346da6d8559ae555dd47a40e4f2c56e8d59f7b7d2fba674ec95f1eaac26d9ba", "MacAddress": "02:42:c0:a8:01:03", "IPv4Address": "192.168.1.3/24", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ] #再次測試ping連線不使用--link也可以ping名字ping通 [root@docker ~]# docker exec -it cenos01 ping cenos02 PING cenos02 (192.168.1.3) 56(84) bytes of data. 64 bytes from cenos02.mynet (192.168.1.3): icmp_seq=1 ttl=64 time=0.045 ms 64 bytes from cenos02.mynet (192.168.1.3): icmp_seq=2 ttl=64 time=0.047 ms 64 bytes from cenos02.mynet (192.168.1.3): icmp_seq=3 ttl=64 time=0.070 ms 我們自定義的網路docker都已經幫我們維護好了對應的關係推薦使用自定義網路 好處:保證不同的叢集使用不同的網路,保證叢集是安全和健康的