docker 搭建lnmp有两种方式
- 一个docker容器中集成mysql php nginx
- mysql nginx 和 php 各在一个容器,多容器联合工作
单容器操作简单,基于centos的docker镜像构建,其操作与在centos系统上搭建lnmp环境基本一致,适合入门学习。
单容器的-lnmp
单容器的lnmp通过一个 Dockerfile
来构建。
写Dockerfile时一般是先启动一个纯净的FROM镜像(这里是centos:7)
1 | docker run --rm -it centos:7 /bin/bash |
这时候就进入镜像里了,按往常操作步骤搭建 php nginx mysql环境。并将操作步骤记录下来,转换成 Dockerfile
中的指令。
转换时注意将步骤合理地合并,毕竟RUN指令不宜太多也不宜太少。
我这里有个写好的参考: https://github.com/talkera/docker-lnmp
单容器的缺点是复用性不强,而且格外大:这个镜像build下来大约1.9G。
多容器协作
多容器联合工作灵活性更强。只是容器间协作操作略复杂。
现在推荐使用docker-compose的方式,只需要配置文件即可。这个直接看docker-compose.yml
文件就能搞明白。
这里也有写好的一个: https://github.com/talkera/docker-lnmp
不过多容器协作有几个点需要搞清楚
- nginx和php分属不同容器,但是都需要访问代码
- php要暴露fpm的9000端口供nginx访问,mysql要暴露3306端口给mysql访问
如果 docker-compose.yml
定义如下
1 | services: |
那么nginx配置如下
1 | location ~ \.php$ { |
php连接数据库如下
1 | $pdo = new PDO('mysql:dbname=test;host=myDatabase;port=3306','root',''); //此处的host是 mysql容器的name |
docker-compose将几个docker连接到一个虚拟的局域网中,如果要访问某个docker可以直接访问其IP,但是IP一般不固定,所以改用name
(如:php, myDatabase)
docker连接宿主机的mysql
如果mysql单独运行,php代码要连接mysql就不能用name了,因为宿主机没有name
首先查看容器的具体IP地址
1 | docker inspect <容器ID> | grep -i ip |
宿主机IP与容器同网段,而且是XXX.XXX.XXX.1
比如容器查出来ip是192.169.0.2
,那么宿主机ip就是192.168.0.1
在容器内,可以通过192.168.0.1
访问宿主机
PHP代码应该变为
1 | $pdo = new PDO('mysql:dbname=test;host=192.168.0.1;port=3306','root',''); |
搭建Docker往往是辛苦一人,造福大家。无论是Dockerfile
还是 docker-compose.yml
只要有一个人写出来,其他人只需要简单看一下就将结构和依赖能了然于心,并且将环境跑起来。