docker容器之間通訊-network

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)題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容