docker為容器創(chuàng)建獨(dú)立的網(wǎng)絡(luò)環(huán)境,實(shí)現(xiàn)宿主和容器、容器之間的網(wǎng)絡(luò)隔離施绎,默認(rèn)使用bridge模式的網(wǎng)絡(luò)呢撞,實(shí)現(xiàn)容器之間、容器與宿主機(jī)之間、乃至與外界之間 的網(wǎng)絡(luò)通信。
但是我們?cè)趯?shí)際部署應(yīng)用的時(shí)候,發(fā)現(xiàn)并不能直接通過(guò)容器內(nèi)部端口訪問(wèn)另外一個(gè)容器的應(yīng)用(比如:mysql容器端口是3306屋摔,web應(yīng)用不能直接通過(guò)3306訪問(wèn)mysql),而是通過(guò)端口映射到宿主機(jī)器來(lái)實(shí)現(xiàn)容器之間的訪問(wèn)替梨。
那么有什么方式能實(shí)現(xiàn)直接通過(guò)容器內(nèi)部端口進(jìn)行數(shù)據(jù)通訊呢钓试?那就是通過(guò)network方式装黑。
docker network創(chuàng)建一個(gè)橋接網(wǎng)絡(luò),在docker run的時(shí)候?qū)⑷萜髦付ǖ叫聞?chuàng)建的橋接網(wǎng)絡(luò)中弓熏,這樣同一橋接網(wǎng)絡(luò)中的容器就可以通過(guò)互相訪問(wèn)恋谭。
1、創(chuàng)建network
[root@iZbp13sno1lc2yxlhjc4b3Z ~]# docker network create my-network
[root@iZbp13sno1lc2yxlhjc4b3Z ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
e4de24aaf1c2 bridge bridge local
093caaca12b4 host host local
a2b05d7d591a my-network bridge local
6e6497f8e311 none null local
[root@iZbp13sno1lc2yxlhjc4b3Z ~]#
可以看到my-network已經(jīng)創(chuàng)建好挽鞠,另外其他3個(gè)是docker默認(rèn)創(chuàng)建的疚颊。
2、創(chuàng)建容器時(shí)指定網(wǎng)絡(luò)
在創(chuàng)建容器時(shí)指定使用my-network網(wǎng)絡(luò)信认,并設(shè)置網(wǎng)絡(luò)別名材义。
docker run -itd --name mysql --network my-network --network-alias mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7.24
--network 指定使用的網(wǎng)絡(luò)
--network-alias 設(shè)置網(wǎng)絡(luò)別名
如果容器已創(chuàng)建好但是之前沒(méi)有指定自己的網(wǎng)絡(luò),則使用下面命令修改:
docker network connect --alias mysql my-network mysql
第一個(gè)mysql是網(wǎng)絡(luò)別名 第二個(gè)mysql是容器名
3嫁赏、通過(guò)網(wǎng)絡(luò)別名測(cè)試訪問(wèn)
進(jìn)入web容器其掂,使用ping命令測(cè)試
[root@iZbp13sno1lc2yxlhjc4b3Z ~]# docker exec -it tomcat_kq bash
root@161eee53356c:/usr/local/tomcat# ping mysql
PING mysql (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.my-network (172.18.0.2): icmp_seq=1 ttl=64 time=0.049 ms
可以看到通過(guò)mysql網(wǎng)絡(luò)別名可以直接訪問(wèn)。
另外通過(guò)容器id或者主機(jī)名也是可以訪問(wèn)的潦蝇。但是你不加入這個(gè)自定義網(wǎng)絡(luò)清寇,則沒(méi)法訪問(wèn)。這個(gè)在項(xiàng)目實(shí)際應(yīng)用中非常重要护蝶,特別是通過(guò)主機(jī)名識(shí)別服務(wù)的項(xiàng)目,如springcoud項(xiàng)目
4翩迈、項(xiàng)目實(shí)際應(yīng)用
修改web項(xiàng)目訪問(wèn)mysql的數(shù)據(jù)庫(kù)地址持灰,由ip改為網(wǎng)絡(luò)別名,端口為容器內(nèi)部端口:
jdbc:mysql://mysql:3306/kaoqin?allowMultiQueries=true
注意:mysql是前面設(shè)置的網(wǎng)絡(luò)別名负饲,3306是容器內(nèi)部端口
這里特別提一下springcloud項(xiàng)目堤魁,eureka中心一般是通過(guò)主機(jī)名來(lái)中注冊(cè)發(fā)現(xiàn)服務(wù)的,但是一放到docker容器中返十,springboot應(yīng)用就報(bào)錯(cuò)妥泉,提示不能發(fā)送心跳到注冊(cè)中心,就是因?yàn)槿萜髦虚g的網(wǎng)絡(luò)隔離造成的洞坑,通過(guò)把所有容器加入到自定義網(wǎng)絡(luò)就能解決此問(wèn)題盲链。