docker上 利用centos镜像搭建lnmp环境
前言:
学完docker有一阵子了,早就想用这个练练手,这不今天有空,就来折腾一把。其实坑我都踩的差不多了,今天就算总结一下。
首先拉下镜像
docker pull centos
现在的镜像速度快多了,不像几年前必须换国内地址才能用。
下面是开启容器代码
docker run -itd -p 6001:80 -p 6002:3306 -p 6003:9000 -p 6004:6379 -v /Users/guanliyang/php:/data/ --name centos --privileged=true 470671670cac /sbin/init
其实没-itd 也能用,没有-d的话,exit退出时,容器也停止。没-it, 容器开启后不是启动状态,需手动启动下。
-p 指定端口, 80是我们的浏览器端口,3006是数据库mysql默认端口,9000是php-fpm默认端口,这个其实可以省略,因为我们外部不需要这个端口,6379是redis默认端口。
-v 指定挂载目录data
--name 是我给容器起个名字。
--privileged=true 和/sbin/init 是让systemctl命令可用,启动成功后进入容器
docker exec -it 容器名字或id /bin/bash
先装nginx
yum install nginx
别笑,我们采用了这种最简单的安装,而不是编译安装,其实编译安装更好玩儿一些,会多敲很多下键盘,但我实在玩腻了。
你会多敲几下 y, 让安装继续,不想敲y,可以换下命令
yum install -y nginx
nginx,被我们敲烂的几行代码这里敲一下
nginx -h #帮助
nginx -c /etc/nginx/nginx.conf #让配置文件生效,你需要先执行下次语句,再启动nginx。
#好多时候你改了配置文件,都得运行下此语句,再启动nginx。你可以故意写错配置文件,再执行此语句。
#它甚至可以把你配置错误的行号打印出来。
nginx -s reload #重启
那么直接访问下http://localhost:6001/
你就能看到欢迎页面。
我们要更换下nginx访问目录,改成我们挂载的目录。
yum install vim #我比较习惯用vim,裸机当然木有,安装下。
#绝大多数刚刚安装好的系统,vim是没有的,但都有vi
vim /etc/nginx/nginx.conf
# 看着有些闹心, 好多配置我们是不需要的,我现在只改下server里面的root目录
root /usr/share/nginx/html;
#改成
root /data;
#就是改成我们的映射目录,然后重启
nginx -s reload
#data下准备个index.html文件,刷新下地址,可以正常访问
安装php
yum install php
php -v #查看php版本
php-fpm #启动php
# 这里报错 未发现/run/php-fpm/www.sock文件
#需要我们改下配置
vim /etc/php-fpm.d/www.conf
#这里会卡住很多人,我直接贴配置
listen.owner = nginx
listen.group = nginx
listen = 127.0.0.1:9000
user = nginx
group = nginx
#这里我们指定开启php-fpm进程的用户是nginx
#但还是报错,nginx用户并没有创建文件的权限
#我们手动创建下文件
/run/php-fpm/php-fpm.pid
#再直接启动
php-fpm
#启动成功,好玩的是你去看我们创建的文件,它只写入了主进程id号
下面我们修改下nginx配置文件,让它支持php
vim /etc/nginx/nginx.conf
#一个被我配置烂了的文件
#我就直接贴server{}里的内容了
server {
listen 80;
# listen [::]:80 default_server;
# server_name _;
root /data;
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
}
index index.html index.htm index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ ^/assets/.*\.php$ {
deny all;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
try_files $uri =404;
}
}
#那个if写法是支持TP的配置
#我们去目录下新建一个index.php文件,内容是
echo $_SERVER['SERVER_ADDR'];
phpinfo();
#我看到第一行输出的ip是172.17.0.6
#我们安装下ifconfig命令
yum install net-tools
#然后查看下ip确实是172.17.0.6
然后我们安装下数据库
#这里不要直接
yum install mysql
#这样安装成功后,你连启动命令也找不到。写mysql的大佬,自mysql被甲骨文收购后,
#在甲骨文工作了几年,因为理念不合离职了,自己mysql名字也算是甲骨文的版权,
#于是他改了个名mariadb, 八卦想看的自行百度,这里我们安装mariadb
yum install mariadb mariadb-server
#mariadb 客户端
#mariadb-server 服务器
# 自己理解下,其实我们只安装mariadb-server就可以
#启动服务
systemctl restart mariadb
#相关命令自行google下,无非就是启动,暂停,重启,查看状态,开机启动等等
mysql -uroot #就可以进入数据库了
#这时我们用主机,直接连数据库是连不上的,默认mysql都不支持远程ip链接,得开下权限。这里我们新建一个用户
create user 'guanliyang'@'%' IDENTIFIED BY '123456';
#给权限
GRANT ALL ON *.* TO 'guanliyang'@'%';
#这里我们用户是新建的,不用刷新权限,更不用重启服务,链接证明连上了。
ip:localhost
端口:6002 # 我们开容器的时候 6002:3306
用户名:guanliyang
密码:123456
好,最后一步是php链接mysql,我们查看下phpinfo(); 发现pdo我们还没安装,先安装一下。
yum install php-pdo
yum install php-pdo_mysql
#重启php-fpm
好,准备测试php链接数据库代码
<?php
try {
$dbh = new PDO('mysql:host=localhost;port=6002;dbname=mysql', 'guanliyang', '123456');
foreach($dbh->query('SELECT * from user') as $row) {
print_r($row);
}
$dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>
嗯哼,一次成功。
我们6002是映射到本机的端口。至此,大工告成。
感觉好多,自己读了一遍感觉好少,再添加点内容吧,你可以导出镜像,上传到docker云,这样就永远不怕丢失了。这里有两点“无趣”的地方。
1,上传速度还行,但下载自己镜像时速度巨慢。
2,不要相信镜像大小。centos本身,在docker images 时大概237MB,但你导出本地的images,标志的是1.3G左右。上传后,273M左右。
嗯?我一度怀疑我导出的只是centos,但你下载下来,里面又确实安装的软件一个不少。
我的猜测是: 所谓的云嘛,就是不存储重复文件。
命令很简单,就随便敲两下代码以示结束
docker save ***
docker tag ***
docker push ***
docker pull ***
哦,我还给redis留了个端口,下次再说吧...