公司的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!