12-容器之间link
12-容器之間link
這篇主要講 容器之間如何 link。
需要準(zhǔn)備的是,創(chuàng)建兩個(gè)容器 test1 和 test2 通過(guò) busybox。
在之前的課程中已經(jīng)創(chuàng)建的只需要重新啟動(dòng)即可。
什么情況下需要link
例如有一個(gè)容器是 web 服務(wù)器,并且跑在一個(gè)docker容器內(nèi),這個(gè)web程序需要訪問(wèn)后臺(tái)數(shù)據(jù)庫(kù),一般來(lái)說(shuō)我們會(huì)把數(shù)據(jù)庫(kù)也運(yùn)行在一個(gè)docker的容器內(nèi),那么此時(shí)就需要兩個(gè)容器進(jìn)行 link。
訪問(wèn)數(shù)據(jù)庫(kù)需要知道數(shù)據(jù)庫(kù)的ip地址和端口,那么我們?cè)陂_(kāi)發(fā)的時(shí)候是不能確定數(shù)據(jù)庫(kù)的ip地址的,而且也有可能數(shù)據(jù)庫(kù)地址會(huì)發(fā)生變化,那么我們將很難修改配置。
查看容器的ip地址命令docker inspect test1
但是我們可以通過(guò)一種方式,給容器起一個(gè)名字,然后可以通過(guò)這個(gè)名字就可以代替ip地址訪問(wèn)數(shù)據(jù)庫(kù)。這時(shí)只需要在開(kāi)發(fā)的時(shí)候先想好這個(gè)數(shù)據(jù)庫(kù)容器的名字即可。
link容器
刪除 test2 容器
docker stop test2 && docker rm test2查看當(dāng)前容器情況
docker ps [vagrant@10 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES da991beadf34 busybox "/bin/sh -c 'while t…" 5 hours ago Up 5 hours test1重新創(chuàng)建 test2
通過(guò) link 連接到 test1 容器
docker run -d --name test2 --link test1 busybox /bin/sh -c "while true; do sleep 3600; done"進(jìn)入 test2 容器
docker exec -it test2 /bin/sh查看ip情況
/ # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever 27: eth0@if28: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ffinet 172.17.0.3/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft foreverping test1 容器的地址
/ # ping 172.17.0.2 PING 172.17.0.2 (172.17.0.2): 56 data bytes 64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.225 ms 64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.156 ms是可以ping通的,那么我們ping test1 這個(gè)名字呢?
/ # ping test1 PING test1 (172.17.0.2): 56 data bytes 64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.167 ms 64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.190 msping 這個(gè) test1 名字也是可以的。這是為什么呢?原因就是--link 參數(shù)會(huì)增加一個(gè) DNS 記錄。
這樣我們?cè)?test2 中是不需要知道 test1 的具體地址的,我們就可以訪問(wèn)。但是在test1中去ping test2 名字是不可以的,ip是可以的。說(shuō)明 --link是具有方向性的。
通過(guò)自定義bridge連接容器
重新創(chuàng)建一個(gè) test2
docker stop test2 && docker rm test2docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3600; done"查看docker network
[vagrant@10 ~]$ docker network ls NETWORK ID NAME DRIVER SCOPE 056d0ece100f bridge bridge local a78b081f0bda host host local 51a236124cac none null local其實(shí)我們?cè)趧?chuàng)建容器的時(shí)候,默認(rèn)會(huì)去連 bridge,但是我們也可以設(shè)定連接 host 或者 none。
手動(dòng)創(chuàng)建一個(gè)bridge
docker network create -d bridge my-bridge-d 為選擇驅(qū)動(dòng)driver
查看創(chuàng)建情況
[vagrant@10 ~]$ docker network ls NETWORK ID NAME DRIVER SCOPE 056d0ece100f bridge bridge local a78b081f0bda host host local 283184c10e65 my-bridge bridge local 51a236124cac none null local通過(guò)brctl查看
[vagrant@10 ~]$ brctl show bridge name bridge id STP enabled interfaces br-283184c10e65 8000.02421fd39394 no docker0 8000.024257ac11fe no veth01f8da0veth06618ed這里的br-283184c10e65 就是我們剛剛創(chuàng)建的bridge。
創(chuàng)建 test3 指定連接新的bridge
docker run -d --name test3 --network my-bridge busybox /bin/sh -c "while true; do sleep 3600; done"如果不指定則默認(rèn)連接bridge
查看容器
[vagrant@10 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cadffadd2dcf busybox "/bin/sh -c 'while t…" 28 seconds ago Up 27 seconds test3 f984609b03ee busybox "/bin/sh -c 'while t…" 14 minutes ago Up 14 minutes test2 da991beadf34 busybox "/bin/sh -c 'while t…" 5 hours ago Up 5 hours test1通過(guò)brctl查看
[vagrant@10 ~]$ brctl show bridge name bridge id STP enabled interfaces br-283184c10e65 8000.02421fd39394 no veth7092b9a docker0 8000.024257ac11fe no veth01f8da0veth06618ed從上面可以看到 test3 連接到了 我們自己創(chuàng)建的bridge。
查看我們創(chuàng)建的 my-bridge 網(wǎng)絡(luò)情況。
$:docker inspect network 283184c10e65 "Containers": { "cadffadd2dcf756d982c219c819b66ba1b6dea9224bbededa9a5069654427bd0": {"Name": "test3","EndpointID": "f0a6e3343b0deeb420d63faf378affbacbec6714b674b1a5fbe472545f1ed674","MacAddress": "02:42:ac:12:00:02","IPv4Address": "172.18.0.2/16","IPv6Address": "" }這里可以看到 test3 確實(shí)是連接到了我們自己創(chuàng)建的bridge上。
更改 test2 連接到 my-bridge 上
$: docker network connect my-bridge test2 "Containers": { "cadffadd2dcf756d982c219c819b66ba1b6dea9224bbededa9a5069654427bd0": {"Name": "test3","EndpointID": "f0a6e3343b0deeb420d63faf378affbacbec6714b674b1a5fbe472545f1ed674","MacAddress": "02:42:ac:12:00:02","IPv4Address": "172.18.0.2/16","IPv6Address": "" }, "f984609b03ee96dc20a90053699cc46cc41969c20d07625826100535b4369a57": {"Name": "test2","EndpointID": "0bf52944835e82a689f863764ac8b4309ff157d566857913fca4da76278aa9d8","MacAddress": "02:42:ac:12:00:03","IPv4Address": "172.18.0.3/16","IPv6Address": "" }可以看到 test2 已經(jīng)連接到了 my-bridge上。也可以通過(guò)brctl查看
[vagrant@10 ~]$ brctl show bridge name bridge id STP enabled interfaces br-283184c10e65 8000.02421fd39394 no veth7092b9avethd05370d docker0 8000.024257ac11fe no veth01f8da0veth06618ed再查看默認(rèn)的bridge
$: docker network inspect bridge "Containers": { "da991beadf34ef53be9cf3de8f0c5ba1599b76f4433f6627f96c46c09751ecf5": {"Name": "test1","EndpointID": "4764dcc3a29b9ee7efb6ea5dc5c905840362c8ddc0d944356a4c0e7b07a99d98","MacAddress": "02:42:ac:11:00:02","IPv4Address": "172.17.0.2/16","IPv6Address": "" }, "f984609b03ee96dc20a90053699cc46cc41969c20d07625826100535b4369a57": {"Name": "test2","EndpointID": "024a2dfeb6b74aac46c3d61a6b2d834fa20c63f47e3a0f0db5aaad78c84442af","MacAddress": "02:42:ac:11:00:03","IPv4Address": "172.17.0.3/16","IPv6Address": "" }那么 test2 既連接到 bridge 也連接到了我們創(chuàng)建的my-bridge上。
測(cè)試連通情況
進(jìn)入 test3
docker exec -it test3 /bin/sh查看ip
/ # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever 32: eth0@if33: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ffinet 172.18.0.2/16 brd 172.18.255.255 scope global eth0valid_lft forever preferred_lft forever剛剛查看 test2 在 my-bridge 上的ip地址為 172.18.0.3,那我們ping測(cè)試
/ # ping 172.18.0.3 PING 172.18.0.3 (172.18.0.3): 56 data bytes 64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.171 ms 64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.179 ms是可以ping通的?,F(xiàn)在我們?nèi)ing test2 這個(gè)名字。
/ # ping test2 PING test2 (172.18.0.3): 56 data bytes 64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.151 ms 64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.178 ms是可以ping通的。這是為什么呢?我們并沒(méi)有設(shè)定link參數(shù),這是因?yàn)?test2 和 test3 都連接到了我們創(chuàng)建的 my-bridge 上。到這里也許會(huì)有疑問(wèn),之前 test1 和 test2 也是連接到同一個(gè)bridge上的,不加link參數(shù)為什么就不能ping通呢?這是因?yàn)樵趧?chuàng)建自定義my-bridge的時(shí)候是和默認(rèn)bridge不一樣的,如果兩個(gè)容器都連接到了自定義的 bridge 上,那么這兩個(gè)容器默認(rèn)是項(xiàng)目link的。
這時(shí)可以測(cè)試一下在 test2 中是否可以 ping 通 test3,答案是可以的。
[vagrant@10 ~]$ docker exec -it test2 /bin/sh / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever 29: eth0@if30: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ffinet 172.17.0.3/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever 34: eth1@if35: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ffinet 172.18.0.3/16 brd 172.18.255.255 scope global eth1valid_lft forever preferred_lft forever我們可以看到這里有兩個(gè)ip地址,一個(gè)是 172.17.0.3,另一個(gè)是 172.18.0.3,這是因?yàn)?test2 連接到了兩個(gè)bridge上,從而分配了兩個(gè)ip地址。
測(cè)測(cè)ping test3
/ # ping test3 PING test3 (172.18.0.2): 56 data bytes 64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.248 ms 64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.173 ms結(jié)果是連通的。那么ping test1 呢,其實(shí)很明顯,是不通的。
/ # ping test1 ping: bad address 'test1'那么如果我們把 test1 也連接到自定義的my-bridge上,也是可以ping通的,那我們實(shí)驗(yàn)一下。
將 test1 連接到 my-bridge 上。
[vagrant@10 ~]$ docker network connect my-bridge test1進(jìn)入 test2 并 ping test1
[vagrant@10 ~]$ docker exec -it test2 /bin/sh / # ping test1 PING test1 (172.18.0.4): 56 data bytes 64 bytes from 172.18.0.4: seq=0 ttl=64 time=0.217 ms其實(shí)一般來(lái)說(shuō),在實(shí)際項(xiàng)目中很少使用 --link參數(shù),而是使用 創(chuàng)建自定義bridge的方式進(jìn)行連接。
總結(jié)
以上是生活随笔為你收集整理的12-容器之间link的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: P1040 加分二叉树【dp+深搜】
- 下一篇: Angular自动取消订阅RxJs