当我们在用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=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255inet6 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 0TX packets 38  bytes 2582 (2.5 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255inet6 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 0TX 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: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_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:ffinet 172.18.0.2/16 brd 172.18.255.255 scope global eth0valid_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容器连接宿主机redis和mysql相关推荐

  1. docker 容器连接宿主机mysql问题

    可通过文件挂载方式连接宿主机127.0.0.1:3306. #挂载目录 docker run -it -v [宿主机目录1]:[容器目录1] -v [宿主机目录n]:[容器目录n] [容器名称] /b ...

  2. docker容器访问宿主机mysql数据库

    docker容器内的localhost并不是指宿主机的localhost docker在运行时就建立了虚拟网卡,并命名为docker0,在宿主机ifconfig可以看到网桥的ip是172.17.0.1 ...

  3. OSCP-Sirol(Kibana、docker容器到宿主机)

    目录 扫描 WEB 提权 扫描 sudo nmap 192.168.64.54 -p- -sS -sVPORT STATE SERVICE VERSION 22/tcp open ssh OpenSS ...

  4. 为什么防火墙重启docker容器连接不上网络?

    记录一次docker网络连接的问题: docker 容器化技术 linux 主机防火墙重启了之后为啥docker 就不能正常连接网络了,需要重启docker服务: 系统版本:redhat 7.5 do ...

  5. Docker入门 - 005 Docker 容器连接

    Docker 容器连接 前面我们实现了通过网络端口来访问运行在docker容器内的服务.下面我们来实现通过端口连接到一个docker容器 网络端口映射 我们创建了一个 python 应用的容器. do ...

  6. docker容器的跨主机访问

    在同一宿主机下的Docker的容器之间是默认互相联通的.通过docker inspect id或name可以查看到ip地址.在不同的容器中来执行ping是可以ping通的,然而跨容器则行不通,于是总结 ...

  7. 运维之道 | Docker 容器连接

    Docker 容器连接 前面我们实现了通过网络端口来访问运行在 docker 容器内的服务. 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P或-p参数来指定端口映射. 下面我们来 ...

  8. 如何在Docker容器中挂载主机目录

    本文翻译自:How to mount a host directory in a Docker container I am trying to mount a host directory into ...

  9. Docker学习总结(44)——Docker容器时间与主机时间不一致的三种解决方式

    分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!点击浏览教程 问题 我们在使用docker时发现Docker容器时间与主机时间经常出现不一致的情况 ...

最新文章

  1. /var/spool/clientmqueue文件分析
  2. java青蛙青蛙跳井_公务员行测技巧:青蛙跳井问题
  3. 掌握Tiles框架 (二)-- Tiles布局和定义
  4. 我的第一个bada项目上线了【附源码下载】
  5. mysql不可重读读
  6. 虚拟网关与正规网关的区别
  7. vue.js学习笔记1——安装及创建并运行vue实例
  8. JavaScript数组实现图片轮播
  9. 会计需要哪方面的计算机知识,学会计需要哪些知识
  10. [答疑]请问商品领用审批的序列图画的对么
  11. MusicXML文档翻译(持续更新)
  12. 使用思博伦Spirent TsetCenter测试RFC 2544(1)_开始 _双极未来
  13. js代码前面的分号是什么意思?
  14. [经验教程]国内如何下载更新google谷歌浏览器及更新谷歌chrome浏览器无法访问此网站怎么办?
  15. PostgreSQL 13新特性:fetch first with ties
  16. 百度地图Javascript API 使用记录
  17. PTA 单链表分段逆转 (12 分)
  18. 云米科技的未来,谈不上乐观
  19. 对极验geetest滑块验证码图片还原算法的研究
  20. 趁着中秋节来临之际,学学如何做好团队管理

热门文章

  1. 一种网络模式切换延时场景介绍
  2. 男怕入错行 女怕入错行
  3. 数据挖掘 贝叶斯网络
  4. [微积分] 利用极坐标计算二重积分
  5. 卷积尺寸计算公式(含膨胀卷积和反卷积情况)
  6. C# QQ 机器人 Newbe.Mahua 1.X 主要特性介绍与常见问题讲解
  7. TP3.2+图片上传腾讯云存储(详细教程)
  8. mustache java 性能_mustache模板技术
  9. [附源码]Python计算机毕业设计Django影评网站系统
  10. 给普通人的Python——第五章(上)