docker搭个简单的lnmp环境
docker 搭建lnmp有两种方式
- 一个docker容器中集成mysql php nginx
- mysql nginx 和 php 各在一个容器,多容器联合工作
单容器的-lnmp 【docker搭个简单的lnmp环境】单容器的lnmp通过一个
Dockerfile
来构建。写Dockerfile时一般是先启动一个纯净的FROM镜像(这里是centos:7)
docker run --rm -it centos:7 /bin/bash
# -it 表示以交互终端的方式运行
# --rm 表示执行完就删除
这时候就进入镜像里了,按往常操作步骤搭建 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
定义如下services:
php:
....
myDatabase:
....
nginx:
....
那么nginx配置如下
location ~ \.php$ {
fastcgi_passphp:9000;
#php是 php容器的name
include fastcgi_params;
fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;
fastcgi_index index.php;
}
php连接数据库如下
$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地址
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代码应该变为
$pdo = new PDO('mysql:dbname=test;
host=192.168.0.1;
port=3306','root','');
搭建Docker往往是辛苦一人,造福大家。无论是
Dockerfile
还是 docker-compose.yml
只要有一个人写出来,其他人只需要简单看一下就将结构和依赖能了然于心,并且将环境跑起来。参考
- http://www.voidcn.com/article/p-nyrhtuzl-d.html
推荐阅读
- ElasticSearch笔记|#ElasticSearch笔记#利用ElasticSearch实现全文搜索(一)简单介绍及环境搭建
- 大数据那些事儿|神策军丨优秀 Leader 养成记(多做简单又有效的事)
- 算法|二进制,八进制,十进制,十六进制的相互转换【简单易懂】
- firewall|firewall 命令简单操作
- 男人不简单
- docker|跟拐友们讲讲docker compose的用法
- docker|Docker -------harbor 私有仓库概述及构建
- linux|Docker高级篇之可视化工具Portainer和CAdvisor+InfluxDB+Granfana
- 919. 完全二叉树插入器 : 简单 BFS 运用题
- docker|docker 数据卷容器,很简单的