我的编程空间,编程开发者的网络收藏夹
学习永远不晚

docker容器连接宿主机redis和mysql

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

docker容器连接宿主机redis和mysql

当我们在用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

在宿主机中输入以下命令:

ifconfig

然后找到docker0这一行下面的inet 172.17.0.1,这个就是docker虚拟网卡的ip,通过这个ip,我们就可以在容器中连接宿主机了。

[root@VM-8-8-centos ~]# ifconfigbr-ffb2f3de993a: flags=4163  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        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 0docker0: 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

找到redis的配置文件redis.conf,找到bind 127.0.0.1这一行,修改如下

bind 127.0.0.1 172.17.0.1

再找到# requirepass foobared 这行,取消注释,并自行配置密码,然后重启redis

最后在项目中将连接redis的ip改成上面的172.17.0.1,并加上密码即可

二、连接mysql

MySQL的跟Redis的就稍微有些不一样了,Redis主要是对配文件进行操作,而MySQL是要对表操作。

首先启动项目的容器,然后获取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 addr1: 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 forever35: 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

登录MySQL

# 一定要用root账号mysql -uroot -p密码# 指定数据库use mysql;

创建账号并指定权限

# 这个命令的作用是:创建一个账号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;

以上都执行成功后,就可以通过账号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来限制的。

来源地址:https://blog.csdn.net/weixin_50117915/article/details/128331304

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

docker容器连接宿主机redis和mysql

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

docker容器连接宿主机redis和mysql

当我们在用docker部署项目的时候可能会遇到这样一个问题:项目A和项目B都用到了redis和mysql,如果在docker-compose里link或者dependon一个redis和mysql的话,会发现每一个项目都有一个redis和m
2023-08-18

docker容器访问宿主机的MySQL操作

背景: 有一个flask项目提供接口,使用docker容器构建并且运行,MySQL在宿主机运行,需要在容器中可以让flask连接上宿主机的mysql 使用ifconfig命令可以看到,有一个docker0和eth0,在docker容器中可以
2022-05-13

docker如何映射容器目录到宿主机

在Docker中,可以使用 -v 或 --volume 参数来映射容器的目录到宿主机。例如,假设要将容器中的 /app/data 目录映射到宿主机的 /host/data 目录,可以使用以下命令:docker run -v /host/d
docker如何映射容器目录到宿主机
2024-04-09

docker怎么映射容器目录到宿主机

在Docker中,可以使用`-v`或`--volume`命令将容器内的目录映射到宿主机上。以下是两种常见的方法:使用绝对路径映射:docker run -v /宿主机目录:/容器目录 镜像名称例如,将宿主机的`/home/user/a
2023-10-27

docker容器时间与宿主机怎么同步

Docker容器的时间通常是与宿主机同步的,但有时候可能会出现时间不同步的情况。以下是一些常见的方法来确保Docker容器的时间与宿主机同步:使用Docker守护程序选项来指定容器时间与宿主机时间同步:可以在运行容器时使用 -v /etc
docker容器时间与宿主机怎么同步
2024-04-09

docker容器中无法获取宿主机hostname怎么办

小编给大家分享一下docker容器中无法获取宿主机hostname怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在nodejs环境中测试通过,其它语言同理,
2023-06-14

docker实现跨宿主机的容器之间网络互联

本文主要介绍了docker实现跨宿主机的容器之间网络互联,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-04

Docker容器与宿主机资源怎么隔离与共享

Docker容器与宿主机资源可以通过一些机制进行隔离与共享:命名空间(Namespaces):Docker使用Linux的命名空间功能来隔离容器与宿主机的资源,比如PID命名空间用来隔离进程,Network命名空间用来隔离网络等。控制组(C
Docker容器与宿主机资源怎么隔离与共享
2024-05-07

Docker容器与宿主机相互访问更方便的方法

Docker是当今使用范围最广的开源容器技术之一,具有高效易用的优点,然而如果使用Docker时采取不当安全策略,则可能导致系统面临安全威胁,这篇文章主要给大家介绍了关于Docker容器与宿主机相互访问更方便的方法,需要的朋友可以参考下
2023-05-20

如何连接docker中的MySQL容器

目录连接docker中mysql容器docker中MySQL容器启动一 下拉镜像二 运行镜像连接docker中MySQL容器我以gin web项目为例,演示在容器中运行时mysql的相关配置。1. 登入MySQL修改访问权限并刷新权限。
2022-11-30

利用overlay怎么实现docker容器间跨宿主机通信

这期内容当中小编将会给大家带来有关利用overlay怎么实现docker容器间跨宿主机通信,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。overlay网络解析内置跨主机的网络通信一直是Docker备受期待
2023-06-06

Docker容器跨主机通信之:直接路由方式

直观上看,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)与外界相通,并可以收发数据包;此外,如果不同子网之间要进行通信,需要额外的路由机制。Docker中的网络接口默认都是虚拟的接口。虚拟接口的最大优势就是转发效率极高。这是
2023-01-31

编程热搜

目录