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ò)通信。
但是我們在實(shí)際部署應(yīng)用的時候,發(fā)現(xiàn)并不能直接通過容器內(nèi)部端口訪問另外一個容器的應(yīng)用(比如:mysql容器端口是3306,web應(yīng)用不能直接通過3306訪問mysql),而是通過端口映射到宿主機(jī)器來實(shí)現(xiàn)容器之間的訪問。
那么有什么方式能實(shí)現(xiàn)直接通過容器內(nèi)部端口進(jìn)行數(shù)據(jù)通訊呢?那就是通過network方式。
docker network創(chuàng)建一個橋接網(wǎng)絡(luò),在docker run的時候?qū)⑷萜髦付ǖ叫聞?chuàng)建的橋接網(wǎng)絡(luò)中,這樣同一橋接網(wǎng)絡(luò)中的容器就可以通過互相訪問。
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個是docker默認(rèn)創(chuàng)建的。
2、創(chuàng)建容器時指定網(wǎng)絡(luò)
在創(chuàng)建容器時指定使用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)建好但是之前沒有指定自己的網(wǎng)絡(luò),則使用下面命令修改:
docker network connect --alias mysql my-network mysql
第一個mysql是網(wǎng)絡(luò)別名 第二個mysql是容器名
3、通過網(wǎng)絡(luò)別名測試訪問
進(jìn)入web容器,使用ping命令測試
[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
可以看到通過mysql網(wǎng)絡(luò)別名可以直接訪問。
另外通過容器id或者主機(jī)名也是可以訪問的。但是你不加入這個自定義網(wǎng)絡(luò),則沒法訪問。這個在項(xiàng)目實(shí)際應(yīng)用中非常重要,特別是通過主機(jī)名識別服務(wù)的項(xiàng)目,如springcoud項(xiàng)目
4、項(xiàng)目實(shí)際應(yīng)用
修改web項(xiàng)目訪問mysql的數(shù)據(jù)庫地址,由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中心一般是通過主機(jī)名來中注冊發(fā)現(xiàn)服務(wù)的,但是一放到docker容器中,springboot應(yīng)用就報(bào)錯,提示不能發(fā)送心跳到注冊中心,就是因?yàn)槿萜髦虚g的網(wǎng)絡(luò)隔離造成的,通過把所有容器加入到自定義網(wǎng)絡(luò)就能解決此問題。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
centos7安裝/升級docker和docker compose方式
文章總結(jié)了在升級Docker和安裝Docker Compose時遇到的問題,包括舊版安裝和新版安裝的差異、docker-compose的安裝問題以及卸載前的注意事項(xiàng)2024-12-12
Docker容器之間數(shù)據(jù)傳輸?shù)膶?shí)現(xiàn)
本文主要介紹了Docker容器之間數(shù)據(jù)傳輸?shù)膶?shí)現(xiàn),文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
Ubuntu24.04LTS在線安裝Docker引擎的詳細(xì)過程
本文介紹了在Ubuntu 24.04 LTS系統(tǒng)上安裝Docker引擎的步驟,包括卸載舊版本、設(shè)置Docker APT倉庫、安裝最新版或指定版本的Docker,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-11-11
Dockerfile及新型容器鏡像構(gòu)建技術(shù)詳解
本文詳細(xì)介紹了dockerfile以及新型容器鏡像構(gòu)建技術(shù),文章中通過詳細(xì)的代碼示例介紹了dockerfile生成容器鏡像器的全過程,感興趣的小伙伴可以參考一下2023-04-04
Docker中啟動Nacos的實(shí)現(xiàn)示例
本文主要介紹了Docker中啟動Nacos的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02
Docker 部署單機(jī)版 Pulsar 和集群架構(gòu) Redis(開發(fā)神器)的方法
這篇文章主要介紹了Docker 部署單機(jī)版 Pulsar 和集群架構(gòu) Redis(開發(fā)神器)的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Docker容器實(shí)現(xiàn)SSH遠(yuǎn)程直連
在某些特殊需求下,我們想ssh直接遠(yuǎn)程連接docker 容器,本文主要介紹了Docker容器實(shí)現(xiàn)SSH遠(yuǎn)程直連,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08

