文章目录

  • Dockerfile 构建wordpress
  • *安装流程规划**
  • 1、上传wordpress
  • 2、源码安装php
  • 3、准备php文件+构建为镜像
  • 4、准备nginx文件+构建为镜像
  • 5、构建MYSQL镜像
  • 6、项目展示

Dockerfile 构建wordpress

安装流程规划*

  • wordpress装在宿主主机,相当于一台NFS
  • php5.4源码安装在一台容器内
  • nginx装在一个容器内
  • 将容器挂载到wordpress站点目录以实现访问
  • 宿主机内cpu要求四核四G

1、上传wordpress

1、创建目录
[root@docter ~]# mkdir blog
[root@docter ~]# mkdir -p blog/php
[root@docter ~]# cd blog/
2、上传wordpress包并解压
[root@docter blog ~]# rz
[root@docter blog ~]# tar xf wordpress.tar.gz
drwxr-xr-x 2 root root   44 Jun 26 18:17 php
-rw-r--r-- 1 root root   11098483 Apr  1 22:17 wordpress
3、构建centos:7镜像
[root@Centos7 tmp ]#  docker run -it  centos:7 bash
[root@docter tmp]# docker images
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
centos            7         3c9be54d505f  7 months ago     204MB
4、创建一个网桥
[root@Centos7 tmp ]#  docker network create lnmp
[root@docter ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
e26ae49a68f1   bridge    bridge    local
b0a268c1d902   host      host      local
bb02f8b94a1a   lnmp      bridge    local
0d214ca04d47   none      null      local

2、源码安装php

# 复制一下在另外一个窗口打开
1、下载php源码包
[root@Centos7 tmp ]# wget https://www.php.net/distributions/php-5.6.38.tar.gz
2、复制php.tar.gz 到容器中
[root@docter tmp]#  docker cp php-5.6.38.tar.gz 3c9be54d505f:/tmp # centos:7启动的ID

3、在容器编译安装PHP
[root@2510dcfa868c tmp]# ll
total 18936
-rwx------  1 root root      836 Nov 13  2020 ks-script-DrRL8A
drwxr-xr-x  3 root root       18 Jun 25 12:54 pear
-rw-r--r--  1 root root 19301157 Sep 13  2018 php-5.6.38.tar.gz
[root@2510dcfa868c tmp]#  tar xf  php-5.6.38.tar.gz 
[root@2510dcfa868c tmp]# rm -rf /etc/yum.repos.d/*   
[root@2510dcfa868c tmp]# rm -rf /etc/yum.repos.d/* 
[root@2510dcfa868c tmp]#  curl -o /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo  
[root@2510dcfa868c tmp]#  curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@2510dcfa868c tmp]#  yum clean all
[root@2510dcfa868c tmp]#  yum makecache

4、在容器中安装php所需要依赖包
[root@2510dcfa868c tmp]# cd php-5.6.38
[root@2510dcfa868c php-5.6.38]#  yum install -y gcc gcc-c++ make zlib zlib-devel pcre pcre-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers libtool-ltdl-devel 
5、继续在容器中开始编译安装
[root@2510dcfa868c php-5.6.38]#  ./configure --with-mysql --enable-fpm
[root@2510dcfa868c php-5.6.38]#  make -j
[root@2510dcfa868c php-5.6.38]#  make install

6、php在容器中编译的同时,复制一个窗口到宿主机中扩容swap分区,否则会报错 
#多执行几次,否则会失败,报内存不足   #切记,是在宿主机中,而不是容器内
[root@docter blog]#  dd if=/dev/zero of=/opt/newdiskq bs=1M count=1024
[root@docter blog]#  mkswap /opt/newdiskq
[root@docter blog]#  swapoff /opt/newdiskq
[root@docter blog]#  swapon /opt/newdiskq	
    
7、检查mysql扩展库
[root@2510dcfa868c php-5.6.38]# php -m | grep mysql
	mysql
8、复制php.ini到/usr/local/lib
[root@2510dcfa868c php-5.6.38]# cp php.ini-development /usr/local/lib/php.ini
[root@2510dcfa868c php-5.6.38]# php --ini
Configuration File (php.ini) Path: /usr/local/lib
Loaded Configuration File:         /usr/local/lib/php.ini

3、准备php文件+构建为镜像

  • Dockerfile
  • php-fpm.conf
1、编写php的dockerfile文件
[root@docter php]# ll
total 28
-rw-r--r-- 1 root root   154 Jun 26 01:27 Dockerfile
-rw-r--r-- 1 root root 23018 Jun 26 18:17 php-fpm.conf
[root@docter php]# cat Dockerfile 
FROM 15132332840/php:v10
RUN groupadd www -g 666 && \
    useradd www -u 666 -g 666

ADD php-fpm.conf /usr/local/etc/

EXPOSE 9000

CMD ["php-fpm","-F"] 

2、可以复制容器内的php.fpm.conf
# 进入容器,可以在已开启php的容器 
[root@3c9be54d505f etc]# pwd
/usr/local/etc
[root@2510dcfa868c etc]# mv php-fpm.conf.deault  php-fpm.conf

3、复制php-fpm.conf到宿主主机 #宿主主机执行 
[root@docter php]# pwd
/root/blog/php
[root@3c9be54d505f php]# docker cp 2510dcfa868c :/usr/local/etc/php-fpm.conf
[root@docter php]# ll
total 28
-rw-r--r-- 1 root root   154 Jun 26 01:27 Dockerfile
-rw-r--r-- 1 root root 23018 Jun 26 18:17 php-fpm.conf
[root@3c9be54d505f etc]#  vi php-fpm.conf 
...
listen = 9000
request_terminate_timeout = 0 #460行左右
 user = www
group = www
...

5、保存容器为镜像
[root@docter php]# docker login #登录docker.hub
docker commir -a '作者' -m '简介' -p  [容器ID] [新镜像名称]
[root@docter php]# docker images
REPOSITORY        TAG       IMAGE ID       CREATED             SIZE
centos            7         3c9be54d505f  7 months ago        204MB
[root@docter php]# docker commit -a "明明" -m " php-5.6.38的唯一版本" 3c9be54d505f -p php:v10
# 构建镜像
[root@docter php]# docker tag php:v1-fpm-mysql 15132332840/php:v10  #打包镜像 必须写自己的名字,否则会报错
[root@docter php]# docker push 15132332840/php:v10  #上传镜像
6、构建php镜像
[root@docter php]#  docker build -t lnmp-php:v1 . 
 #先上传镜像成功,在构建php镜像,而且构建必须和dockerfile在同一个目录中

4、准备nginx文件+构建为镜像

  • nginx.repo
  • nginx.conf
  • Dockerfile
  • default.conf
1、编写nginx的dockerfile文件
[root@docter nginx]# cat Dockerfile 
FROM centos:7

ADD nginx.repo /etc/yum.repos.d/
RUN yum -y install nginx

ADD default.conf /etc/nginx/conf.d/
ADD nginx.conf /etc/nginx/

WORKDIR /usr/share/nginx/

EXPOSE 80 443

RUN groupadd www -g 666 && \
    useradd www -u 666 -g 666

CMD nginx -g "daemon off;"
2、编写nginx的default.conf 文件
[root@docter nginx]# cat default.conf 
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;
    root   /usr/share/nginx/html;
    
    location / {
        index  index.php index.html index.htm;
    }

    location ~ \.php$ {
        root           /usr/share/nginx/html;
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

}
3、nginx.conf文件
[root@docter nginx]# cat nginx.conf 
user  www;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
user  www;
4、编写nginx的nginx.repo文件
[root@docter nginx]# cat nginx.repo 
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
5、构建镜像
[root@docter nginx]# docker build -t lnmp-nginx:v1 . #构建必须和dockerfile在同一个目录中

5、构建MYSQL镜像

1、启动mysql容器
[root@docter blog]# docker run -d -e MYSQL_ROOT_PASSWORD=123 --network=lnmp --name mysql mysql:5.7
2、进入mysql容器中创建数据库
[root@docter ~]# docker exec -it mysql bash
root@5b451395e693:/# mysql -u root -p 
Enter password: #密码 
mysql> create database wordpress;
3、启动php容器
[root@docter blog]# docker run -d -v /root/blog/wordpress/:/usr/share/nginx/html --network=lnmp --name php lnmp-php:v1 
4、启动nginx容器
[root@docter blog]#  docker run -d --name nginx -p 80:80 --network=lnmp -v /root/blog/wordp3、ress/:/usr/share/nginx/html lnmp-nginx:v1 
5、查看全部镜像
[root@docter nginx]# docker images 
REPOSITORY        TAG       IMAGE ID       CREATED             SIZE
lnmp-php          v1        d015dcbf1f91   About an hour ago   1.28GB
lnmp-nginx        v1        006660142825   3 hours ago         335MB
15132332840/php   v10       c2d4e5a145f0   23 hours ago        1.28GB
mysql             5.7       09361feeb475   3 days ago          447MB
centos            7         8652b9f0cb4c   7 months ago        204MB
6、查看全部容器是否启动成功
[root@docter nginx]# docker ps 
CONTAINER ID   IMAGE           COMMAND                  CREATED             STATUS             PORTS                                        NAMES
daca528bce0e   lnmp-nginx:v1   "/bin/sh -c 'nginx -…"   About an hour ago   Up About an hour   0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp   nginx
2510dcfa868c   lnmp-php:v1     "php-fpm -F"             About an hour ago   Up About an hour   9000/tcp                                     php
5b451395e693   mysql:5.7       "docker-entrypoint.s…"   About an hour ago   Up About an hour   3306/tcp, 33060/tcp                          mysql
e83d0fd837d3   lnmp-php:v1     "php-fpm -F"             About an hour ago   Up About an hour   9000/tcp                                     silly_wozniak

7、IP访问测试
#如果报错502 进入php容器中编辑php-fpm.conf
[root@2510dcfa868c etc]# pwd
/usr/local/etc
[root@2510dcfa868c etc]# ll
-rw-r--r-- 1 root root 23007 Jun 26 10:35 php-fpm.conf
[root@3c9be54d505f etc]#  vi php-fpm.conf 
...
listen = 9000
request_terminate_timeout = 0 #460行左右
 user = www
group = www
...
最后重启容器中的php就ok
[root@docter tmp]# docker restart php

6、项目展示

linux修改docker内文件权限_docker

1、把 wp-config.php文件写到此目录中就ok
[root@docter wordpress]# pwd
/root/blog/wordpress
[root@docter wordpress]# vim wp-config.php  
<?php
/**
 * WordPress基础配置文件。
 *
 * 这个文件被安装程序用于自动生成wp-config.php配置文件,
 * 您可以不使用网站,您需要手动复制这个文件,
 * 并重命名为“wp-config.php”,然后填入相关信息。
 *
 * 本文件包含以下配置选项:
 *
 * * MySQL设置
 * * 密钥
 * * 数据库表名前缀
 * * ABSPATH
 *
 * @link https://codex.wordpress.org/zh-cn:%E7%BC%96%E8%BE%91_wp-config.php
 *
 * @package WordPress
 */

// ** MySQL 设置 - 具体信息来自您正在使用的主机 ** //
/** WordPress数据库的名称 */
define('DB_NAME', 'wordpress');

/** MySQL数据库用户名 */
define('DB_USER', 'root');

/** MySQL数据库密码 */
define('DB_PASSWORD', '123');

/** MySQL主机 */
define('DB_HOST', 'mysql');

/** 创建数据表时默认的文字编码 */
define('DB_CHARSET', 'utf8mb4');

/** 数据库整理类型。如不确定请勿更改 */
define('DB_COLLATE', '');

/**#@+
 * 身份认证密钥与盐。
 *
 * 修改为任意独一无二的字串!
 * 或者直接访问{@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org密钥生成服务}
 * 任何修改都会导致所有cookies失效,所有用户将必须重新登录。
 *
 * @since 2.6.0
 */
define('AUTH_KEY',         '5It|*^U=b19e^%;P/<%VmPM9&miaA>bvBFpvqi9ULA1;ta@^1]stL>zKKoTSf,qQ');
define('SECURE_AUTH_KEY',  ' YVU-tJgiAuZ^f;z310SlnI@_NN@qxY,j/{$K=p_/=F77&$hG;7A;!u75MdsH;l^');
define('LOGGED_IN_KEY',    'l.1rg$u5+Zg_Bfim8o:SET)cG*&PC)Au,`Mrc*,^?@VgP lfJ =x2/yWP:z9IQz#');
define('NONCE_KEY',        'kzKT/4-.^F@aDaFu.GiW={#cmVv9OWmo+|b__guWWEq4FucLMR*aEEJn`o0aM3[j');
define('AUTH_SALT',        '(b1%eR<ChsudBoPwry^hV8OT%vBvwNCS]I^<Em+LV=.Kp_+cp;#~$]lBo$KB-p5 ');
define('SECURE_AUTH_SALT', '=e?!1mfh9mTh>:kx;9-t]Kt)Lv&%P$d ZnWTHW>Dj[=ciq s[E<9TgVOfa#<_vNv');
define('LOGGED_IN_SALT',   '*}L+,!?azO-BlM>prvxuZ<i80[v$&gs?Bts{;;? ._7dx>%W.(7_n:?$-N4heZYe');
define('NONCE_SALT',       'oQTk Lg(^`dV|h#8O0PLq*W>?g} SN& /kHW)>r98Xa,+ntdsw4;yy~$C%6n,-U7');

/**#@-*/

/**
 * WordPress数据表前缀。
 *
 * 如果您有在同一数据库内安装多个WordPress的需求,请为每个WordPress设置
 * 不同的数据表前缀。前缀名只能为数字、字母加下划线。
 */
$table_prefix  = 'wp_';

/**
 * 开发者专用:WordPress调试模式。
 *
 * 将这个值改为true,WordPress将显示所有用于开发的提示。
 * 强烈建议插件开发者在开发环境中启用WP_DEBUG。
 *
 * 要获取其他能用于调试的信息,请访问Codex。
 *
 * @link https://codex.wordpress.org/Debugging_in_WordPress
 */
define('WP_DEBUG', false);

/* 好了!请不要再继续编辑。请保存本文件。使用愉快! */

/** WordPress目录的绝对路径。 */
if ( !defined('ABSPATH') )
	define('ABSPATH', dirname(__FILE__) . '/');

/** 设置WordPress变量和包含文件。 */
require_once(ABSPATH . 'wp-settings.php');
2、授权root用户
[root@docter wordpress]#  chown -R root.root ./