docker容器連接宿主機(jī)redis與mysql的配置方法
前言
當(dāng)我們?cè)谟胐ocker部署項(xiàng)目的時(shí)候可能會(huì)遇到這樣一個(gè)問題:項(xiàng)目A和項(xiàng)目B都用到了redis和mysql,如果在docker-compose里link或者dependon一個(gè)redis和mysql的話,會(huì)發(fā)現(xiàn)每一個(gè)項(xiàng)目都有一個(gè)redis和mysql,這樣如果項(xiàng)目多了也會(huì)產(chǎn)生很多的redis和mysql,看著挺不爽而且也浪費(fèi)資源的,那能不能讓這些項(xiàng)目都能連同一個(gè)redis和mysql呢?
當(dāng)然是可以了,我們可以利用docker的自定義網(wǎng)絡(luò)實(shí)現(xiàn),或者將redis和mysql裝在宿主機(jī)上,所有的項(xiàng)目都連接宿主機(jī)的redis和mysql。
這里介紹的是第二種方法:將redis和mysql裝在宿主機(jī)上
看起來挺簡(jiǎn)單,只要在項(xiàng)目的配置文件里把連接redis和mysql的地址改成localhost就行了,但是這樣改部署完之后卻發(fā)現(xiàn)報(bào)錯(cuò)了,連接不上,這是因?yàn)椴荒芡ㄟ^localhost在docker容器里面連接宿主機(jī),接下來就需要做一點(diǎn)小小的配置了。
一、連接redis
1、在宿主機(jī)中輸入以下命令:
ifconfig
然后找到docker0這一行下面的inet 172.17.0.1
,這個(gè)就是docker虛擬網(wǎng)卡的ip,通過這個(gè)ip,我們就可以在容器中連接宿主機(jī)了。
[root@VM-8-8-centos ~]# ifconfig br-ffb2f3de993a: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255 inet6 fe80::42:e9ff:fecd:eb0b prefixlen 64 scopeid 0x20<link> ether 02:42:e9:cd:eb:0b txqueuelen 0 (Ethernet) RX packets 32 bytes 2489 (2.4 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 38 bytes 2582 (2.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 inet6 fe80::42:c1ff:fedc:e526 prefixlen 64 scopeid 0x20<link> ether 02:42:c1:dc:e5:26 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 3 bytes 266 (266.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2、找到redis的配置文件redis.conf,找到bind 127.0.0.1
這一行,修改如下
bind 127.0.0.1 172.17.0.1
再找到# requirepass foobared
這行,取消注釋,并自行配置密碼,然后重啟redis
3、最后在項(xiàng)目中將連接redis的ip改成上面的172.17.0.1
,并加上密碼即可
二、連接mysql
MySQL的跟Redis的就稍微有些不一樣了,Redis主要是對(duì)配文件進(jìn)行操作,而MySQL是要對(duì)表操作。
1、首先啟動(dòng)項(xiàng)目的容器,然后獲取ip
docker exec -it 容器id ip addr
然后找到eth0@if36
開頭的這一行,下面的inet
后的ip就是docker給容器的一個(gè)ip,我這里的是172.18.0.2
[root@VM-8-8-centos ~]# docker exec -it 8337cd4ab0a1 ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 35: eth0@if36: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0 valid_lft forever preferred_lft forever
2、登錄MySQL
# 一定要用root賬號(hào) mysql -uroot -p密碼 # 指定數(shù)據(jù)庫(kù) use mysql;
3、創(chuàng)建賬號(hào)并指定權(quán)限
# 這個(gè)命令的作用是:創(chuàng)建一個(gè)賬號(hào)symx,密碼12345678的用戶,指定只能由172.18.0.2的ip連接 CREATE user `symx`@'172.18.0.2' IDENTIFIED WITH mysql_native_password by '12345678'; # 這個(gè)命令的作用是:指定用戶symx,ip為172.18.0.2,該用戶可以對(duì)任意數(shù)據(jù)庫(kù)的任意表 # 進(jìn)行SELECT,INSERT,UPDATE,DELETE,CREATE,DROP操作,*.*的意思是:第一個(gè)*是數(shù)據(jù)庫(kù), # 可以指定哪個(gè)數(shù)據(jù)庫(kù),*表示全部數(shù)據(jù)庫(kù);第二個(gè)*為表,可以指定是哪個(gè)表,*表示全部表 GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on *.* TO `symx`@'172.18.0.2'; #當(dāng)然也可以給予賬號(hào)全部權(quán)限,下面和上面的命令只能選擇一個(gè),看個(gè)人的情況 GRANT ALL PRIVILEGES on *.* TO `symx`@`172.18.0.2`; # 刷新 FLUSH PRIVILEGES; # 執(zhí)行上面的命令可能會(huì)出現(xiàn) # ERROR 1410 (42000): You are not allowed to create a user with GRANT的錯(cuò)誤, # 這時(shí)可以執(zhí)行下面的命令,給予權(quán)限 GRANT system_user ON *.* TO 'root'; FLUSH PRIVILEGES;
4、以上都執(zhí)行成功后,就可以通過賬號(hào)symx,密碼12345678來連接數(shù)據(jù)庫(kù)了
需要注意的是:連接數(shù)據(jù)庫(kù)的ip為ifconfig
的docker0的ip:172.17.0.1
,而不是上面的容器里的ip。
三、tips
或許我們會(huì)有這樣一個(gè)疑問:為什么redis的配置文件里bind的是docker0的ip:172.17.0.1,而在mysql里的卻是docker容器的ip:172.18.0.2呢?
這是因?yàn)閞edis和mysql它們的策略不同。
首先講MySQL的策略,MySQL的策略就比較簡(jiǎn)單,在上面我們通過增加一個(gè)記錄在user表中指定了host和user這兩個(gè)字段,分別是ip和用戶名,即表示該賬號(hào)可以通過這個(gè)ip訪問到mysql,這個(gè)ip指的是請(qǐng)求方的ip,而請(qǐng)求方的ip也就是docker容器內(nèi)的ip,即通過docker exec -it 容器id ip addr
命令獲取到的ip。
而Redis就不一樣了,redis里的bind的意思是綁定本機(jī)的ip,準(zhǔn)確的說是綁定本機(jī)的網(wǎng)卡對(duì)應(yīng)的ip地址,每個(gè)服務(wù)器都有多個(gè)網(wǎng)卡,每個(gè)網(wǎng)卡都有一個(gè)ip地址。網(wǎng)卡的ip地址,可以通過ifconfig
命令查詢到,上面的172.17.0.1就是docker的網(wǎng)卡地址,所以bing:172.17.0.1
意思是只允許來自docker這個(gè)網(wǎng)卡的請(qǐng)求,而不是說只有請(qǐng)求方的ip為172.17.0.1才能訪問。
在修改配置文件的時(shí)候,我們可以看到有一個(gè)配置是bind:127.0.0.1
,這個(gè)綁定的是lo網(wǎng)卡的ip地址,也就是ifconfig命令下的lo那個(gè)地址,稱之為回環(huán)地址(Local Loopback),只有本地才能連接,默認(rèn)的配置文件只有這一個(gè)配置,所以做到了只有本地才能連接redis。
當(dāng)沒有指定bind的時(shí)候,則表示所有的ip都能訪問到redis,通常不要這樣做,有很大幾率會(huì)被攻擊。
如果想限制只有指定的ip可以訪問的話,還能通過防火墻來控制了,是不能通過redis的bind來限制的。
總結(jié)
到此這篇關(guān)于docker容器連接宿主機(jī)redis與mysql的文章就介紹到這了,更多相關(guān)docker連接宿主機(jī)redis與mysql內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker-compose 部署 Apollo 自定義環(huán)境的詳細(xì)教程
本篇文章給大家介紹docker-compose 部署 Apollo 自定義環(huán)境的詳細(xì)教程,而其中Config Service提供配置的讀取、推送等功能,服務(wù)對(duì)象是Apollo客戶端,對(duì)docker部署Apollo環(huán)境相關(guān)知識(shí)感興趣的朋友一起看看吧2021-06-06Docker容器沒有權(quán)限寫入宿主機(jī)目錄的解決方案
這篇文章主要介紹了Docker容器沒有權(quán)限寫入宿主機(jī)目錄的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03Docker啟動(dòng)PostgreSQL時(shí)創(chuàng)建多個(gè)數(shù)據(jù)庫(kù)的解決方案
這篇文章主要介紹了Docker啟動(dòng)PostgreSQL時(shí)創(chuàng)建多個(gè)數(shù)據(jù)庫(kù)的解決方案,重點(diǎn)給大家介紹如何把shell/sql腳本放入/docker-entrypoint-initdb.d/目錄中,讓容器啟動(dòng)的時(shí)候自動(dòng)執(zhí)行創(chuàng)建2021-06-06docker搭建Mycat實(shí)現(xiàn)讀寫分離的項(xiàng)目實(shí)踐
本文主要介紹了docker搭建Mycat實(shí)現(xiàn)讀寫分離的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06超詳細(xì)Docker Desktop下安裝rocketmq的教程
這篇文章主要介紹了Docker Desktop下安裝rocketmq,本文內(nèi)容通過圖文操作命令給大家講解的非常詳細(xì),需要的朋友可以參考下2021-10-10Docker開放2375端口實(shí)現(xiàn)遠(yuǎn)程訪問的操作方法
因?yàn)镮DEA集成docker環(huán)境,實(shí)質(zhì)上是通過遠(yuǎn)程訪問的形式,進(jìn)行連接,因此需要開啟Docker的2375端口的遠(yuǎn)程訪問權(quán)限,這篇文章主要介紹了Docker開放2375端口實(shí)現(xiàn)遠(yuǎn)程訪問的操作方法,需要的朋友可以參考下2024-05-05skywalking agent 關(guān)聯(lián)docker鏡像的多種方法
Apache SkyWalking 提供了多種方式來部署和使用 SkyWalking Agent,包括在 Docker 容器中運(yùn)行的應(yīng)用,本文給大家分享幾種方式將 SkyWalking Agent 集成到你的 Docker 應(yīng)用中,感興趣的朋友一起看看吧2025-04-04