docker容器连接宿主机redis与mysql的配置方法
目录
- 前言
- 一、连接redis
- 二、连接mysql
- 三、tips
- 总结
前言
当我们在用docker部署项目的时候可能会遇到这样一个问题:项目A和项目B都用到了redis和mysql,如果在docker-compose里link或者dependon一个redis和mysql的话,会发现每一个项目都有一个redis和mysql,这样如果项目多了也会产生很多的redis和mysql,看着挺不爽而且也浪费资源的,那能不能让这些项目都能连同一个redis和mysql呢?
当然是可以了,我们可以利用docker的自定义网络实现,或者将redis和mysql装在宿主机上,所有的项目都连接宿主机的redis和mysql。
这里介绍的是第二种方法:将redis和mysql装在宿主机上
看起来挺简单,只要在项目的配置文件里把连接redis和mysql的地址改成localhost就行了,但是这样改部署完之后却发现报错了,连接不上,这是因为不能通过localhost在docker容器里面连接宿主机,接下来就需要做一点小小的配置了。
一、连接redis
1、在宿主机中输入以下命令:
ifconfig
然后找到docker0这一行下面的inet 172.17.0.1,这个就是docker虚拟网卡的ip,通过这个ip,我们就可以在容器中连接宿主机了。
[root@VM-8-8-centos ~]# ifconfig br-ffb2f3de993a: flags=4163mtu 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 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 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 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、最后在项目中将连接redis的ip改成上面的172.17.0.1,并加上密码即可
二、连接mysql
MySQL的跟Redis的就稍微有些不一样了,Redis主要是对配文件进行操作,而MySQL是要对表操作。
1、首先启动项目的容器,然后获取ip
docker exec -it 容器id ip addr
然后找到eth0@if36开头的这一行,下面的inet后的ip就是docker给容器的一个ip,我这里的是172.18.0.2
[root@VM-8-8-centos ~]# docker exec -it 8337cd4ab0a1 ip addr 1: lo: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: 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账号 mysql -uroot -p密码 # 指定数据库 use mysql;
3、创建账号并指定权限
# 这个命令的作用是:创建一个账号symx,密码12345678的用户,指定只能由172.18.0.2的ip连接 CREATE user `symx`@'172.18.0.2' IDENTIFIED WITH mysql_native_password by '12345678'; # 这个命令的作用是:指定用户symx,ip为172.18.0.2,该用户可以对任意数据库的任意表 # 进行SELECT,INSERT,UPDATE,DELETE,CREATE,DROP操作,*.*的意思是:第一个*是数据库, # 可以指定哪个数据库,*表示全部数据库;第二个*为表,可以指定是哪个表,*表示全部表 GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on *.* TO `symx`@'172.18.0.2'; #当然也可以给予账号全部权限,下面和上面的命令只能选择一个,看个人的情况 GRANT ALL PRIVILEGES on *.* TO `symx`@`172.18.0.2`; # 刷新 FLUSH PRIVILEGES; # 执行上面的命令可能会出现 # ERROR 1410 (42000): You are not allowed to create a user with GRANT的错误, # 这时可以执行下面的命令,给予权限 GRANT system_user ON *.* TO 'root'; FLUSH PRIVILEGES;
4、以上都执行成功后,就可以通过账号symx,密码12345678来连接数据库了
需要注意的是:连接数据库的ip为ifconfig的docker0的ip:172.17.0.1,而不是上面的容器里的ip。
三、tips
或许我们会有这样一个疑问:为什么redis的配置文件里bind的是docker0的ip:172.17.0.1,而在mysql里的却是docker容器的ip:172.18.0.2呢?
这是因为redis和mysql它们的策略不同。
首先讲MySQL的策略,MySQL的策略就比较简单,在上面我们通过增加一个记录在user表中指定了host和user这两个字段,分别是ip和用户名,即表示该账号可以通过这个ip访问到mysql,这个ip指的是请求方的ip,而请求方的ip也就是docker容器内的ip,即通过docker exec -it 容器id ip addr命令获取到的ip。
而Redis就不一样了,redis里的bind的意思是绑定本机的ip,准确的说是绑定本机的网卡对应的ip地址,每个服务器都有多个网卡,每个网卡都有一个ip地址。网卡的ip地址,可以通过ifconfig命令查询到,上面的172.17.0.1就是docker的网卡地址,所以bing:172.17.0.1意思是只允许来自docker这个网卡的请求,而不是说只有请求方的ip为172.17.0.1才能访问。
在修改配置文件的时候,我们可以看到有一个配置是bind:127.0.0.1,这个绑定的是lo网卡的ip地址,也就是ifconfig命令下的lo那个地址,称之为回环地址(Local Loopback),只有本地才能连接,默认的配置文件只有这一个配置,所以做到了只有本地才能连接redis。
当没有指定bind的时候,则表示所有的ip都能访问到redis,通常不要这样做,有很大几率会被攻击。
如果想限制只有指定的ip可以访问的话,还能通过防火墙来控制了,是不能通过redis的bind来限制的。
总结
上一篇:解决docker run hello-world遇到错误消息-error during conne
栏 目:其它服务器
本文标题:docker容器连接宿主机redis与mysql的配置方法
本文地址:https://zz.feitang.co/server/29909.html
您可能感兴趣的文章
- 12-20Kubernetes中使用临时容器进行故障排查的方法
- 12-20Nginx设置HTTPS的方法步骤
- 12-20二进制方式安装 Kubernetes1.18.3版本实现脚本
- 12-20Nginx工作模式及代理配置的使用细节
- 12-20ZooKeeper分布式协调服务设计核心概念及安装配置
- 12-20Kubernetes部署可视化地图的十个步骤
- 12-20关于docker清理Overlay2占用磁盘空间的问题(亲测有效)
- 12-20Docker compose配置文件写法及命令使用示例
- 12-20openwrt安装docker并启动的操作方法
- 12-20云原生Kubernetes初始化容器Init使用教程


阅读排行
推荐教程
- 12-07一文教你怎么选择Tomcat对应的JDK版本
- 12-07新版Eclipse集成Tomcat时找不到server选项的解决方法
- 12-06IIS7 应用程序池自动回收关闭的解决方案
- 12-05Windows Server 2019安装VMware
- 12-05Windows服务器默认IE浏览器无法下载文件的解决方法
- 12-05Docker安装Jenkins全过程
- 12-19Zabbix SAML SSO 登录绕过漏洞的操作流程
- 12-15Docker-Compose搭建Spark集群的实现方法
- 12-14Docker Desktop无法正常启动解决(failed to start...)
- 12-14k8s 与docker空间使用分析与清理方法





