docker容器之間通訊-network解讀
docker為容器創(chuàng)建獨立的網(wǎng)絡(luò)環(huán)境,實現(xiàn)宿主和容器、容器之間的網(wǎng)絡(luò)隔離,默認(rèn)使用bridge模式的網(wǎng)絡(luò),實現(xiàn)容器之間、容器與宿主機之間、乃至與外界之間 的網(wǎng)絡(luò)通信。
但是我們在實際部署應(yīng)用的時候,發(fā)現(xiàn)并不能直接通過容器內(nèi)部端口訪問另外一個容器的應(yīng)用(比如:mysql容器端口是3306,web應(yīng)用不能直接通過3306訪問mysql),而是通過端口映射到宿主機器來實現(xiàn)容器之間的訪問。
那么有什么方式能實現(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或者主機名也是可以訪問的。但是你不加入這個自定義網(wǎng)絡(luò),則沒法訪問。這個在項目實際應(yīng)用中非常重要,特別是通過主機名識別服務(wù)的項目,如springcoud項目
4、項目實際應(yīng)用
修改web項目訪問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項目,eureka中心一般是通過主機名來中注冊發(fā)現(xiàn)服務(wù)的,但是一放到docker容器中,springboot應(yīng)用就報錯,提示不能發(fā)送心跳到注冊中心,就是因為容器中間的網(wǎng)絡(luò)隔離造成的,通過把所有容器加入到自定義網(wǎng)絡(luò)就能解決此問題。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker tomcat的設(shè)置內(nèi)存大小配置方式
這篇文章主要介紹了Docker tomcat的設(shè)置內(nèi)存大小配置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
docker nginx + https 子域名配置詳細(xì)教程
這篇文章主要介紹了docker nginx + https 子域名配置詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
Docker+Vscode搭建(本地/遠(yuǎn)程)開發(fā)環(huán)境
本文介紹了使用Docker+VSCode搭建統(tǒng)一開發(fā)環(huán)境的完整方案,文中通過圖文示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-12-12
Docker快速部署主流腳本語言JavaScript的全過程
JavaScript是目前所有主流瀏覽器上唯一支持的腳本語言,這也是早期JavaScript的唯一用途,下面這篇文章主要給大家介紹了關(guān)于Docker快速部署主流腳本語言JavaScript的相關(guān)資料,需要的朋友可以參考下2023-02-02
docker-compose基于MySQL8部署項目的實現(xiàn)
這篇文章主要介紹了docker-compose基于MySQL8部署項目的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03

