Laravel学习 - 在Docker下开发时遇到数据库连接问题

公司的backend环境要求统一的docker下开发。之前只是零星地看过docker的东西,也没觉得对当时的公司环境有什么帮助就放弃了。现在仍然觉得放于小公司的开发和维护环境来看,docker并不是一个好选择。

当然docker有其天然的优势,譬如:

统一开发环境:所有人的运行环境是一致的,也避免了多种环境下每个人遇到的各种各样的问题。

多种环境选择:在不同的运行环境校验代码的兼容性,docker是一个非常棒的选择。

部署环境扩容:docker的swarm模式可以方便快速地通过manager/worker的node增减实现运行容器的负载扩容。

但是,所有的优点都来自于成本:

一是docker的Dockerfile编写维护成本,相当来说,这部分成本很小,甚至可以忽略不计。(官网有大把的资源可以使用)

二是docker的学习成本,每个人都会花出相当大的学习时间来了解docker的运行机制,掌握docker环境下开发的注意要点。

三是docker的机制对于小公司来说并不能负担。虽然docker环境的开销很小,但对于小公司而言,用户量并没有现下流行的大数据吹嘘的那么夸张,在单机或双机下一般来说也不成为问题。尤其是在阿里云和亚马逊这些公有云的负载均衡系统支持下,也可以实现一定程度的扩容。

其实最主要的就是:人和钱,最终都是因为钱。


上面说了这么多,其实都是总结,有点跑题了。

今天在学习Laravel的Lumen框架时,遇到了点小问题。

(2/2) QueryException
SQLSTATE[HY000] [2002] Connection refused (select ....)

(1/2) PDOException
SQLSTATE[HY000] [2002] Connection refused

刚看到这个错误时,第一反应是SQL出错了,并没有注意到提示Connection refused。

Lumen框架中有两个配置的地方:

1/ .env文件(cp .env.example .env)

DB_HOST=127.0.0.1
DB_PORT=3306

2/ config/*.php (--database)

'connections' => [
    'driver' => 'mysql',
    'host'   => env('DB_HOST', '127.0.0.1'),
    'port'   => env('DB_PORT', 3306),
];

需要注意的是,docker环境下你只能是通过映射出来的端口对其进行连接。如:

c2c987bef6d7        mariadb:10.1.36     "docker-entrypoint.s…"   23 hours ago        Up 2 hours          0.0.0.0:3306->3306/tcp   hi-mysql

可以看到,0.0.0.0:3306->3306,表示外部的3306端口映射到内部的3306端口。所以我们可以通过127.0.0.1的3306端口连接到docker下的mariadb进行管理。

但是在Lumen下的配置也配置了127.0.0.1却为什么会出现Connection confused呢?

原因在于,PHP的代码同样是运行在docker环境下,而不是实体机上。所以docker下php(service)的container下并没有mysql服务。

解决方法:

1、查看mariadb所在的container的IP

docker inspect <container>|grep IPAddress
--
"IPAddress": "172.20.0.2"

2、修改.env中的配置

DB_HOST=172.20.0.2

再次刷新页面,连接成功,OK!


问题又来了,通过修改IP是可以连接了。但是每次docker stop/start的时候,container的IP是会变化的……我们又怎么办呢?

在docker-compose.yml文件中,定义了不同的service,如:

version: '3'
services:
  db:
    image: mariadb:10.1.36
    container_name: hi-mysql
    volumes:
      - ./db_data:/var/lib/mysql
    ports:
      - 3306:3306

db就是service的name,通过这个name就可以达到与IPAddress同样的连接预期结果。另外,container_name的名称也可以用来作为此作用。

// Same as Using IP
DB_HOST=db
// Same as db
DB_HOST=hi-mysql

It's really done now!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值