今天继续在腾讯云逛逛,发现了腾讯云的开发者实验室,笔者在上面有很多实验都是基于云的真实标准的实验环境。笔者测试了两个,和笔者的虚拟机是一模一样的。现在根据实验,笔者在本地安装了docker的ubuntu上来实验Docker搭建 LNMP 环境,用来开发测试。
1、下载三个镜像
docker pull nginx:alpine
docker pull php:7-fpm-alpine
docker pull postgres:alpine
因PostgreSQL 更适合于容器化,所以使用选择PostgreSQL。
2、使用 docker-compose 管理并启动
通过pip安装 docker-compose,笔者的环境是基于python3
sudo apt-get install -y python-pip && sudo pip install docker-compose
建立docker_files目录,下目录里面操作yml文件。docker_files/docker-compose.yml
version: "3"
services:
Nginx:
image: nginx:alpine
ports:
- 80:80
volumes:
- ./web:/usr/share/nginx/html:ro
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
PHP:
image: undefined01/php:7-fpm-alpine
volumes:
- ./web:/var/www/html:rw
Database:
image: postgres:alpine
environment:
POSTGRES_USER: "postgres"
POSTGRES_PASSWORD: "rootroot"
volumes:
- ./data:/var/lib/postgresql/data:rw
image:表示该服务使用的镜像。
ports:表示该服务开放的端口。
volumes:表示将某目录或文件挂载到容器的相应位置上,后面的ro、rw表示对于容器是否可读写。此处挂载了配置文件、数据库和网站代码。
enviornment:设置该容器的环境变量。此处通过环境变量的形式设置数据库的账号和密码。
3、/docker_files新建nginx.conf文件
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ .php$ {
fastcgi_pass PHP:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
include fastcgi_params;
}
}
如何让 nginx 容器与 php 容器通讯?nginx.conf里用到了PHP:9000这样的地址,让 nginx 能够将请求顺利的转交给 php 处理。由 docker-compose 启动的所有容器,都会自动加入由 docker 维护的局域网中,并且会自动为其他容器将某容器的名称(如PHP)解析成相应的局域网IP。
4、启动LAMP服务
运行命令创建:docker-compose up -d
可以使用docker ps查看运行的容器。
在/docker_files/web目录下新建index.php文件,内容如下:
<?php
phpinfo();
?>
浏览器输入 localhost ,因笔者使用的是虚拟机的NAT,所以可以使用curl localhost 可以查看运行是否正常。
6、测试pg数据库
在/docker_files/web目录下新建pg.php文件。
<?php
$dbconn = pg_connect('host=Database user=postgres password=rootroot')
or die('Could not connect: ' . pg_last_error());
pg_query('CREATE TABLE IF NOT EXISTS test ( tester INT )');
pg_query('INSERT INTO test VALUES (0)');
$res = pg_query('SELECT * FROM test') or die('Query failed: ' . pg_last_error());
$num = pg_num_rows($res);
echo "You have visited this site $num times";
pg_free_result($res);
pg_close($dbconn);
?>
使用 curl localhost/pg.php来测试:
docker-compose down可以停止服务并自动销毁相应的容器,也可以docker-compose stop来停止服务,但是容器依然存在,可以使用docker ps -a来查看,停止后可以使用docker-compose start来重新启动服务。
使用 docker-compose可以轻松而优雅地部署多种服务,nginx.conf里面的 PHP:9000可以处理时容器之间通信时,使ngin可以识别处理php脚本。
网友评论