Docker容器使用宿主机上的mongod/redis等服务详解

我们在本地的开发中为了保证大家都开发环境一直,PHP 的扩展,版本保持一致, 我们使用了 docker .但是由于redis/mongodb 在宿主机上, 所以通过 127.0.0.1 是连接不上的

前提说明

这个是在 docker 运行容器时使用的桥接模式(默认) 时才会发生以上问题.如果使用 host 模式就没有.

所以,我们就是要把是 docker 的网络模式设置为 host 模式.

具体实现

~ docker run --network host php56

补充说明

使用了 host 模式后,则表示宿主机与容器共享宿主机的 IP,端口. 如果不希望与宿主机共享,则不能使用这种方式

如果你的电脑是 Mac, 并且你的docker 版本大于18.03,则你可以在代码中使用 docker.for.mac.localhost 来连接宿主机上的服务.

//使用示例

//以连接 mongod 为例

$mongodb = new \MongoDB\Driver\Manager('mongodb://docker.for.mac.localhost/:27017');

Windows 跟 Linux 暂时还没有发现可以在桥接模式下可以通过特使字符来使用宿主机上服务的方法。

如果各位有好的方法,欢迎留言讨论。

补充知识:Docker无法连接宿主机数据库

redis

已经修改过为宿主机 ifconfig命令下 docker0的 172.17.0.1 连接地址,还是无法连接redis

docker中redis配置信息

 # redis配置信息
 REDIS_HOST = '172.17.0.1'
 REDIS_PORT = 6379
 LEVEL_NAME = logging.DEBUG

 # session配置
 SESSION_TYPE = 'redis' # 设置redis存储的类型
 SESSION_REDIS = StrictRedis(host=REDIS_HOST, port=REDIS_PORT) # 指定session存储的redis服务器
 SESSION_USE_SIGNER = True # 设置签名存储

不利用守护方式启动容器,可以看到redis、mysql连接数据库报错

解决办法

修改redis.conf文件第69行,把 bind 127.0.0.1 改为 0.0.0.0

redis恢复连接

mysql

class ProductConfig(Config):
 # 数据库配置信息
 SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:root@172.17.0.1:3306/information'
 SQLALCHEMY_TRACK_MODIFICATIONS = False
 SQLALCHEMY_COMMIT_ON_TEARDOWN = True # 每当改变数据内容之后,在视图函数结束的时候会自动提交

 DEBUG = False
 LEVEL_NAME = logging.ERROR

以权限用户root登录

选择mysql库

查看mysql库中的user表的host值(即可进行连接访问的主机/IP名称)

改host值(以通配符%的内容增加主机/IP地址),当然也可以直接增加IP地址

刷新MySQL的系统权限相关表

MariaDB [(none)]> use mysql;
MariaDB [mysql]> SELECT user, host FROM mysql.user
MariaDB [mysql]> update user set host = '%' where user ='root' and host='localhost';
MariaDB [(mysql)]> flush privileges;

测试一下

问题解决

这两种开放所有地址访问都会有安全隐患

以上这篇Docker容器使用宿主机上的mongod/redis等服务详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Docker容器访问宿主机网络的方法

    最近部署一套系统,使用nginx作反向代理,其中nginx是使用docker方式运行: $ docker run -d --name nginx $PWD:/etc/nginx -p 80:80 -p 443:443 nginx:1.15 需要代理的API服务运行在宿主机的 1234 端口, nginx.conf 相关配置如下: server { ... location /api { proxy_pass http://localhost:1234 } ... } 结果访问的时候发现老是报 5

  • 在宿主机上执行docker容器内部的shell或程序方式

    为了避免反复进入docker容器内部操作,可以将一系列容器内部的指令由宿主机来操作完成. 在宿主机(作者主机为windows7)上执行centos容器(name为centos-1)中/usr目录下的"printer"可执行程序,该程序输出为打印"123". C:\Users\Administrator>docker exec -it centos-1 /bin/bash -c "cd usr && ./printer" 12

  • 在docker容器中调用和执行宿主机的docker操作

    首先这个帖子,献给docker新手.当然如果你是一个老手,文中分割线后的操作方法也是一种思路. 首先说一下,如何在docker中执行宿主机的docker操作,我们管它叫docker in docker. 至于为什么要在docker中操作宿主机的docker,优点不言而喻,你既可以将你的具体需求容器化部署,又不用直接在宿主机上安装(假设我们没有办法在docker中操作宿主机的docker,那么我们只能将这样的软件程序直接安装到宿主机上,这样显然是不利于管理和维护的). 实现这种需求,其实非常简单,

  • Docker容器使用宿主机上的mongod/redis等服务详解

    我们在本地的开发中为了保证大家都开发环境一直,PHP 的扩展,版本保持一致, 我们使用了 docker .但是由于redis/mongodb 在宿主机上, 所以通过 127.0.0.1 是连接不上的 前提说明 这个是在 docker 运行容器时使用的桥接模式(默认) 时才会发生以上问题.如果使用 host 模式就没有. 所以,我们就是要把是 docker 的网络模式设置为 host 模式. 具体实现 ~ docker run --network host php56 补充说明 使用了 host

  • Docker容器迁移到其他服务器的5种方法详解

    迁移在许多情况下都是不可避免的.硬件升级.数据中心变化.过时的操作系统,所有这些都可能成为迁移的触发点. Docker容器迁移通常是迁移任务的一部分.今天我们将看到将Docker容器从现有服务器迁移到另一台服务器的不同方法. 如何将Docker容器迁移到另一台服务器,没有直接将Docker容器从一台服务器迁移到另一台服务器的方法,我们通过使用下面这些方法中的一个或多个来解决Docker容器迁移的问题. 1.导出和导入容器 导出容器意味着从容器的文件系统创建压缩文件,导出的文件保存为"gzip&q

  • docker如何快速搭建几个常用的第三方服务详解

    前言 本次和大家分享的内容是使用docker快速搭建工作中常用的第三方的服务,对于有一些互联网背景的公司来说,以下几个服务都是很需要的:redis,rabbit,elasticsearch: 本篇涉及内容深度只针对于简单的测试环境和程序员自身学习,要继续深入各位可以花时间自行研究,希望本篇内容给大家带来好的帮助. 本篇涉及docker常用几个命令: docker pull 镜像名:版本:拉去镜像 docker rmi 镜像名或id:删除镜像 docker images:获取本地已有镜像 dock

  • docker容器与宿主机的数据交互方式总结

    前言 在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 方式一.Docker cp命令 docker cp :用于容器与主机之间的数据拷贝. 语法 # 容器内文件 copy to 宿主机 docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- # 宿主机文件 copy to 容器内 docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_

  • docker容器挂载宿主主机目录的操作方法

    有一项重要的参数 -v 目录挂载,就是让容器内部目录和宿主主机目录关联起来,这样就可以直接操作宿主主机目录而不用再操作具体容器了 比如在2中,我们要发布一个war包,是通过 sudo docker cp demo.war tomcat_xiao:/usr/local/tomcat/webapps 来发布的,有没有更快捷的方式呢? 肯定有, 没有 我就不会在这里写这些玩意儿了 sudo docker run -p 8822:8080 --name tomcat_xiao_volume -v /ho

  • 解决docker容器与宿主机相差8小时的问题

    使用docker-compose部署时,在输出的日志以及相关事件校验及输出时,导致事件与现实相差8小时. 排查问题: 1.查看宿主机时间: # 查看时间 date Wed Sep 29 11:12:44 CST 2021 # 查看时区 date -R Wed, 29 Sep 2021 11:13:34 +0800 2.进入容器查看时间 # 查看所有容器 docker ps -a # 进入容器 docker eec -it [容器ID] /bin/bash # 查看时间 date 此时看到的宿主机

  • Docker容器上用DockerFile部署多个tomcat服务的步骤

    1. [admin@JD ~]$ cd opt #进入根目录下的opt 里 2. [admin@JD opt]$ mkdir web #创建Web 文件夹 3. [admin@JD web]$ cd web/ #进入web文件夹 4. [admin@JD web]$ touch Dockerfile #创建一个Dockerfile文件夹 名字不能错必须是这个名字否者检测不到 5. 利用三方工具将 tomcat 和 jdk的 上传到Web文件夹 6. [admin@JD web]$ vim Doc

  • Java使用Redis及其优化详解

    目录 前言 开启远程连接 Jedis连接Redis 封装Jedis进行操作 前言 所有坚韧不拔的努力迟早会取得报酬的.-- 安格尔 开启远程连接 Redis默认是不支持远程连接的,这里需要手动开启远程连接. 关闭本机IP绑定,允许远程连接.找到redis.conf中的bind:127.0.0.1将其注释. 开启密码校验.找到redis.conf中的requirepass去掉其注释并设置密码. Jedis连接Redis 创建一个Maven项目,导入Jedis依赖. <dependency> &l

  • C++使用redis的实例详解

    C++使用redis的实例详解 hiredis是redis数据库的C接口,目前只能在linux下使用,几个基本的函数就可以操作redis数据库了. 函数原型:redisContext *redisConnect(const char *ip, int port); 说明:该函数用来连接redis数据库,参数为数据库的ip地址和端口,一般redis数据库的端口为6379: 函数返回值:该函数返回一个结构体redisContext: 类似的提供了一个函数redisContext* redisConn

  • Redis 命令的详解及简单实例

    Redis 命令的详解及简单实例 Redis 命令用于在 redis 服务上执行操作. 要在 redis 服务上执行命令需要一个 redis 客户端.Redis 客户端在我们之前下载的的 redis 的安装包中. 语法 Redis 客户端的基本语法为: $ redis-cli 实例 以下实例讲解了如何启动 redis 客户端: 启动 redis 客户端,打开终端并输入命令 redis-cli.该命令会连接本地的 redis 服务. $redis-cli redis 127.0.0.1:6379>

随机推荐