前言
LNMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写。L指Linux,N指Nginx,M一般指MySQL,也可以指MariaDB,P一般指PHP,也可以指Perl或Python。
本文通过在单Pod中创建Nginx与PHP容器,并连接到MySQL一主多从集群。
准备镜像
Nginx镜像
Nginx镜像制作流程:
官方centos -> 自定义centos -> base-nginx -> wordpress-nginx
官方centos:下载后上传至本地镜像。
docker pull centos:7.9.2009
docker tag centos:7.9.2009 easzlab.io.local:5000/myhub/centos:7.9.2009
docker push easzlab.io.local:5000/myhub/centos:7.9.2009
自定义centos:添加网络组件,日志收集等功能。
# centos-base:7.9.2009
FROM easzlab.io.local:5000/myhub/centos:7.9.2009
ADD filebeat-7.12.1-x86_64.rpm /tmp
RUN yum install -y /tmp/filebeat-7.12.1-x86_64.rpm vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop && rm -rf /etc/localtime /tmp/filebeat-7.12.1-x86_64.rpm && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && useradd nginx -u 2088
nerdctl build -t easzlab.io.local:5000/myhub/centos-base:7.9.2009 .
nerdctl push --insecure-registry easzlab.io.local:5000/myhub/centos-base:7.9.2009
需要下载很多安装包,这次构建大概10分钟。镜像大小从200MB增加到700MB。
base-nginx:添加安装nginx-1.22,并创建基础目录。
# nginx-base-wordpress:v1.22.0
FROM easzlab.io.local:5000/myhub/centos-base:7.9.2009
RUN yum install -y vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
ADD nginx-1.22.0.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-1.22.0 && ./configure --prefix=/apps/nginx && make && make install && ln -sv /apps/nginx/sbin/nginx /usr/sbin/nginx &&rm -rf /usr/local/src/nginx-1.22.0.tar.gz
nerdctl build -t easzlab.io.local:5000/myhub/nginx-base-wordpress:v1.22.0 .
nerdctl push --insecure-registry easzlab.io.local:5000/myhub/nginx-base-wordpress:v1.22.0
wordpress-nginx:在base-nginx基础上,创建wordpress目录。
# wordpress-nginx:v1
FROM easzlab.io.local:5000/myhub/nginx-base-wordpress:v1.22.0
ADD nginx.conf /apps/nginx/conf/nginx.conf
ADD run_nginx.sh /apps/nginx/sbin/run_nginx.sh
RUN mkdir -pv /home/nginx/wordpress
RUN chown nginx.nginx /home/nginx/wordpress/ -R
EXPOSE 80 443
CMD ["/apps/nginx/sbin/run_nginx.sh"]
nerdctl build -t easzlab.io.local:5000/myhub/wordpress-nginx:v1 .
nerdctl push --insecure-registry easzlab.io.local:5000/myhub/wordpress-nginx:v1
PHP镜像
PHP镜像:基于自定义centos。
# wordpress-php-5.6:v1
FROM easzlab.io.local:5000/myhub/centos-base:7.9.2009
RUN yum install -y https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm && yum install php56-php-fpm php56-php-mysql -y
ADD www.conf /opt/remi/php56/root/etc/php-fpm.d/www.conf
ADD run_php.sh /usr/local/bin/run_php.sh
EXPOSE 9000
CMD ["/usr/local/bin/run_php.sh"]
nerdctl build -t easzlab.io.local:5000/myhub/wordpress-php-5.6:v1 .
nerdctl push --insecure-registry easzlab.io.local:5000/myhub/wordpress-php-5.6:v1
Tips: 打镜像时,源文件有sh一定要chmod +x可执行。否则复制到容器里无法执行,哪怕以root身份也无执行权限。
创建Pod
先在NFS服务器共享一个wordpress目录,具体方法参考 5-2 基于StatefulSet运行MySQL一主多从
创建一个Pod,内含nginx与php容器。和NodePort服务。
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
app: wordpress-app
name: wordpress-app-deployment
namespace: myserver
spec:
replicas: 1
selector:
matchLabels:
app: wordpress-app
template:
metadata:
labels:
app: wordpress-app
spec:
containers:
- name: wordpress-app-nginx
image: easzlab.io.local:5000/myhub/wordpress-nginx:v1
imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
name: http
- containerPort: 443
protocol: TCP
name: https
volumeMounts:
- name: wordpress
mountPath: /home/nginx/wordpress
readOnly: false
- name: wordpress-app-php
image: easzlab.io.local:5000/myhub/wordpress-php-5.6:v1
imagePullPolicy: Always
ports:
- containerPort: 9000
protocol: TCP
name: http
volumeMounts:
- name: wordpress
mountPath: /home/nginx/wordpress
readOnly: false
volumes:
- name: wordpress
nfs:
server: 192.168.100.155
path: /data/k8sdata/myserver/wordpress
---
kind: Service
apiVersion: v1
metadata:
labels:
app: wordpress-app
name: wordpress-app-spec
namespace: myserver
spec:
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
nodePort: 30001
- name: https
port: 443
protocol: TCP
targetPort: 443
nodePort: 30002
selector:
app: wordpress-app
创建数据库
在 5-2 基于StatefulSet运行MySQL一主多从 中我们部署了数据库,从里面创建供wordpress使用的数据库。
# 在主数据库创建wordpress库
kubectl exec -it mysql-0 -n myserver -- mysql
mysql> CREATE DATABASE wordpress;
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO "wordpress"@"%" IDENTIFIED BY "wordpress";
mysql> exit
# 在从数据库查看wordpress数据库
kubectl exec -it mysql-1 -n myserver -- mysql -uwordpress -hmysql-0.mysql -pwordpress
mysql> show databases;
部署WordPress
在NFS服务器中,下载wordpress,解压到共享的目录中。
pwd
/data/k8sdata/myserver
wget https://cn.wordpress.org/wordpress-6.0.2-zh_CN.tar.gz
tar zxvf wordpress-6.0.2-zh_CN.tar.gz
浏览器打开任一物理机节点(master+node)与端口,即可进入wordpress首页。
http://192.168.100.156:30001
在数据库主机,填入mysql pod的服务域名:
- 同一namespace:mysql-0.mysql
- 不同namespace:mysql-0.mysql.myserver.svc.cluster.local
复制文本框中的内容,进入NFS的手工创建wp-config.php
pwd
/data/k8sdata/myserver/wordpress
cp -a wp-config-sample.php wp-config.php
vim wp-config.php
按dG删除全部文本,并粘贴文本框的内容。