因为php是一个脚本语言,我是打算把php的环境都打包到一个docker镜像中(主要是nginx php php的各种拓展,数据库mysql,redis这些为了安全一般使用云服务器的RDS和redis),以后起新的服务,直接拉这个镜像运行就行,避免每次的环境安装,同时以后有安全补丁啥的都再做一次镜像就行,其他的服务用这个镜像或用这个镜像调整即可,毕竟每次整环境是最烦人的,其实也是没必要的。 同时用镜像做服务还一个好处,php站点容易被黑挂马什么的,这样发现被黑了抛弃旧的容器,直接重启一个新的容器即可,不用再麻烦处理了,以前有个被黑挂马的站藏的很深,它修改了内核系统命令,你登录服务器时主动杀死挖矿程序,等你退出后它又自动运行,处理这个很麻烦
往期回顾
一.docker的安装
上期已经讲了服务器宿主机的 docker 安装,那么接下来我们就准备先做个nginx镜像
拉取centos镜像
centos版本选择 见后面的常见问题归纳 1
docker pull centos
启动并进入该容器准备安装nginx
docker run -it centos /bin/bash
先安装nginx所需的相关依赖包
检测这些依赖包是否安装过以及作用 见后面的常见问题归纳 3
yum -y install gcc gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel && yum clean all
我安装过程中遇到的问题 见后面的常见问题归纳 4
下载对应版本nginx安装包并编译安装
代码语言:shell复制nginx版本选择 见后面的常见问题归纳 2
#下载nginx安装包
cd /tmp
wget https://nginx.org/download/nginx-1.24.0.tar.gz
# 解压到指定目录
tar -zxvf /tmp/nginx-1.24.0.tar.gz -C /usr/local/
# 进入目录进行编译安装
cd /usr/local/nginx-1.24.0
#进行编译配置(yum安装的pcre也可以不指定目录)
./configure --prefix=/usr/local/nginx --with-http_gzip_static_module --with-http_stub_status_module --with-http_realip_module --with-http_ssl_module --with-pcre=/usr/share/doc/pcre
# 检测配置是否准确,返回0就可以下一步编译安装了
echo $?
0
#编译安装
make && make install && make clean
#检测是否安装成功
/usr/local/nginx/sbin/nginx -v
#创建软链接 之后就能直接使用nginx命令了
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
#创建相关用户组及用户(一般用软件名区分用户,比如nginx)
#我这里因为都是web站点,所以统一用www(包括后续的php安装)
groupadd www
useradd -g www www
nginx相关配置
代码语言:shell复制nginx.conf 配置见后面的 conf配置说明
#创建软链接 之后就能直接使用nginx命令了
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
#创建相关用户组及用户(一般用软件名区分用户,比如nginx)
#我这里因为都是web站点,所以统一用www(包括后续的php安装)
groupadd www
useradd -g www www
#修改调整 nginx.conf 配置
vi /usr/local/nginx/conf/nginx.conf
#根据配置创建站点vhost 便于后期容器配置目录映射
mkdir -p /usr/local/nginx/conf/vhost/nginx_online
#根据配置创建日志目录 便于后期容器nginx日志目录映射
mkdir -p /home/wwwlogs
chown -R www:www /home/wwwlogs
#规划创建项目目录 便于后期项目目录映射
mkdir -p /www/wwwroot
nginx检测及启动
代码语言:shell复制#检测nginx配置项
nginx -t
#使用绝对路径指定配置文件启动,这样比较显性和安全,一般shell脚本中都指明路径和配置
#启动
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#停止
/usr/local/nginx/sbin/nginx -s stop
#平滑重启
/usr/local/nginx/sbin/nginx -s reload
#当然这些命令都创建了软链接故而平常使用可以直接用nginx命令
#监测nginx进程是否正常启动
ps -ef | grep nginx
提交创建镜像
基本安装和配置在docker中已经完成,我们来提交创建我们刚才的容器做成镜像
代码语言:shell复制#容器内执行exit退出该容器
exit
#查看容器信息
[root@xxx]docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f4d7d1bf8f06 centos "/bin/bash" 1 days ago Exited (0) 1 days ago distracted_noether
#提交制作容器
#docker commit <容器 ID 或容器名> [<仓库名>[:<标签>]]
[root@xxx]docker commit f4d7d1bf8f06 my/lnp:v1
#查看我们新制作的image镜像
[root@xxx]docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my/lnp v1 e0519f62bdfe 1 days ago 691MB
centos latest 5d0da3dc9764 21 months ago 231MB
准备相关目录和配置测试文件
代码语言:shell复制#服务器上准备相关映射目录,便于后期经常改动的东西放在服务器上不用到容器内部调整
#同时保障容器镜像只是干净的服务环境,程序和日志配置什么的都在宿主机上
#用作程序目录
mkdir -p /wwwdocker/wwwroot/www.test.com
#用作nginx日志目录
mkdir -p /wwwdocker/wwwlogs
#用作nginx配置目录
mkdir -p /wwwdocker/vhost
代码语言:shell复制#建一个测试文件
cat /wwwdocker/wwwroot/www.test.com/index.html
欢迎访问我的站点
代码语言:shell复制#建一个最简单测试的nginx配置文件
#此处的www.test.com只是个测试域名,请用你自己真实的测试域名
cat /wwwdocker/vhost/www.test.com.conf
server {
listen 80;
server_name www.test.com;
root /www/wwwroot/www.test.com;
index index.html index;
}
相关端口和目录映射并启动测试这个镜像容器
服务器端口80对应容器内80端口
服务器 /wwwdocker/wwwroot 目录映射到 容器的/www/wwwroot 目录用作程序站点目录
服务器 /wwwdocker/wwwlogs 目录映射到 容器的/home/wwwlogs 目录用作nginx日志目录
服务器 /wwwdocker/vhost 目录映射到 容器的/usr/local/nginx/conf/vhost/nginx_online 目录用作容器内nginx配置目录
代码语言:shell复制#docker run -itd --name [新容器名称]
# -p [服务端口]:[容器端口]
# -v [服务器目录]:[容器目录] [镜像名称]
# /bin/bash
docker run -itd --name mylnp_test -p 80:80 -v /wwwdocker/wwwroot:/www/wwwroot -v /wwwdocker/wwwlogs:/home/wwwlogs -v /wwwdocker/vhost:/usr/local/nginx/conf/vhost/nginx_online my/lnp:v1 /bin/bash
#先手动启动一下容器nginx 后续写个脚本 运行容器的时候自动启动
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#当然也可以直接运行nginx启动,但后续脚本最后写全地址和指定配置比较好
nginx -t
nginx
#Ctrl Q 可以退出容器不关闭容器
#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5873bc26528f my/lnp:v1 "/bin/bash" 1 days ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp mylnp_test
#后期容器内环境没有变化的话就只需要 启动 关闭这个容器即可
#程序变动直接在服务器的/wwwdocker/wwwroot下修改即可
#nginx配置变更后 执行下面命令重启容器内部的nginx即可,不需要再进入了
docker exec <容器 ID 或容器名> nginx -s reload
#后期运营的一些nginx日志直接在/wwwdocker/wwwlogs下查看即可
这些做好了,解析你的域名到服务器的外网ip上
访问对应域名或IP应该就能正常访问到你的站点测试内容啦
下篇内容 三、php环境之php的docker镜像制作