06. 基于Dockerfile部LNMP架构

目录

前言

1、任务要求

1.1 关闭防火墙和核心防护

1.2 自定义网络docker1

1.3 所有安装包下载

2、Nginx 镜像创建

2.1 建立工作目录并上传相关安装包

2.2 编写 Nginx Dockerfile 脚本

2.3 准备 nginx.conf 配置文件

2.4 生成镜像

2.5 创建 Nginx 镜像的容器

2.6 验证nginx服务

3、Mysql 镜像创建

3.1 建立工作目录并上传相关安装包

3.2 编写 Mysql Dockerfile 脚本

3.3 编写 my.cnf 配置文件

3.4 生成镜像

3.5 创建 Mysql 镜像的容器

4、PHP 镜像创建

4.1 建立工作目录并上传相关安装包

4.2 编写 PHP Dockerfile 脚本

4.3 准备 php.ini、php-fpm.conf、www.conf 配置文件

4.3.1 准备 php.ini 配置文件

4.3.2 准备 php-fpm.conf 配置文件

4.3.3 准备 www.conf 配置文件

4.4 生成镜像

4.5 创建该镜像的容器

4.6 验证 PHP

5、启动 wordpress 服务

5.1 mysql 授权

5.2 浏览器访问安装 wordpress


前言

        在 Docker 上搭建 LNMP 架构(Linux + Nginx + MySQL + PHP)是一种常见的做法,可以通过容器化技术轻松地部署和管理整个 Web 应用程序的运行环境

  • Linux:作为操作系统,提供了稳定的运行环境
  • Nginx:作为Web服务器,具有高性能和高并发处理能力,可以作为反向代理服务器,负责接收用户的请求并将请求转发给后端的应用服务器
  • MySQL:作为关系型数据库,提供了数据存储和管理的功能
  • PHP(或Python、Perl):作为服务器端脚本语言,用于处理用户的请求,生成动态的网页内容

1、任务要求

任务说明:需要使用 Docker 技术在一台主机上创建LNMP服务并运行Wordpress网站平台,然后对此服务进行相关的性能调优和管理工作

宿主机

操作系统

IP地址

主要软件

配置要求

Docker

CentOS 7

10.4.7.11

Docker 26.1.4

4核8G以上

容器

 操作系统

IP地址

主要软件

nginx

CentOS 7

172.20.0.10

Docker-Nginx

mysql

CentOS 7

172.20.0.20

Docker-Mysql

php

CentOS 7

172.20.0.30

Docker-php

  • 使用 Docker 构建 LNMP 环境并运行 Wordpress 网站平台
  • 限制 Nginx 容器最多使用 500MB 的内存和 1G 的 Swap
  • 限制 Mysql 容器写 /dev/sda 的速率为 10 MB/s
  • 将所有容器进行快照,然后将 Docker 镜像打包成 tar 包备份到本地

1.1 关闭防火墙和核心防护

命令示例:关闭所有设备防火墙和临时防护

systemctl disable --now firewalld
setenforce  0

输出结果:

[root@MineGi ~]# systemctl disable --now firewalld
[root@MineGi ~]# setenforce  0
setenforce: SELinux is disabled
[root@MineGi ~]# 

1.2 自定义网络docker1

命令示例:

docker network create --subnet=172.20.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
ifconfig docker1

输出结果:

[root@MineGi ~]# docker network create --subnet=172.20.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
94e730cea05895488461456ed393da6f28be848b096a7e49abd3093e80fbca4c
[root@MineGi ~]# ifconfig docker1
docker1: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.20.0.1  netmask 255.255.0.0  broadcast 172.20.255.255
        ether 02:42:0a:bd:6d:a4  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@MineGi ~]# 

1.3 所有安装包下载

【lnmp:百度网盘

命令示例:

wget https://cdn.mysql.com//archives/mysql-5.7/mysql-boost-5.7.20.tar.gz
wget http://nginx.org/download/nginx-1.12.0.tar.gz
wget https://www.php.net/distributions/php-7.1.10.tar.bz2
wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
ll
ls -lh

输出结果:

[root@MineGi ~]# wget -q https://cdn.mysql.com//archives/mysql-5.7/mysql-boost-5.7.20.tar.gz
[root@MineGi ~]# wget -q http://nginx.org/download/nginx-1.12.0.tar.gz
[root@MineGi ~]# wget -q https://www.php.net/distributions/php-7.1.10.tar.bz2
[root@MineGi ~]# wget -q https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
[root@MineGi ~]# ll
总用量 72240
-rw-r--r-- 1 root root 48833145 9月  13 2017 mysql-boost-5.7.20.tar.gz
-rw-r--r-- 1 root root   980831 4月  12 2017 nginx-1.12.0.tar.gz
-rw-r--r-- 1 root root 15069098 2月   8 2024 php-7.1.10.tar.bz2
-rw-r--r-- 1 root root  9082696 2月   8 2018 wordpress-4.9.4-zh_CN.tar.gz
[root@MineGi ~]# ls -lh
总用量 71M
-rw-r--r-- 1 root root  47M 9月  13 2017 mysql-boost-5.7.20.tar.gz
-rw-r--r-- 1 root root 958K 4月  12 2017 nginx-1.12.0.tar.gz
-rw-r--r-- 1 root root  15M 2月   8 2024 php-7.1.10.tar.bz2
-rw-r--r-- 1 root root 8.7M 2月   8 2018 wordpress-4.9.4-zh_CN.tar.gz
[root@MineGi ~]# 

2、Nginx 镜像创建

2.1 建立工作目录并上传相关安装包

命令示例:

mkdir -p /opt/lnmp/nginx/html
mv nginx-1.12.0.tar.gz /opt/lnmp/nginx/
tar xf wordpress-4.9.4-zh_CN.tar.gz -C /opt/lnmp/nginx/html/
ls /opt/lnmp/nginx/html/

输出结果:

[root@MineGi ~]# mkdir -p /opt/lnmp/nginx/html
[root@MineGi ~]# mv nginx-1.12.0.tar.gz /opt/lnmp/nginx/
[root@MineGi ~]# tar xf wordpress-4.9.4-zh_CN.tar.gz -C /opt/lnmp/nginx/html/
[root@MineGi ~]# ls /opt/lnmp/nginx/html/
wordpress
[root@MineGi ~]#

2.2 编写 Nginx Dockerfile 脚本

命令示例:

cat >/opt/lnmp/nginx/Dockerfile <<'eof'
FROM centos:7
MAINTAINER this is nginx image <lnmp>
RUN curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
    yum -y install pcre-devel zlib-devel gcc gcc-c++ make && yum clean all && \
    useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /usr/local/src/
ADD nginx.conf /usr/local/nginx/conf/
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure --prefix=/usr/local/nginx \
    --user=nginx \--group=nginx --with-http_stub_status_module && \
    make -j 4 && make install && \
    rm -rf /usr/local/src/nginx-1.12.0 && \
    chmod 777 -R /usr/local/nginx/html/
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80
EXPOSE 443
VOLUME [ "/usr/local/nginx/html/" ]
CMD [ "/usr/local/nginx/sbin/nginx","-g","daemon off;" ]
eof

输出结果:

[root@MineGi ~]# cat >/opt/lnmp/nginx/Dockerfile <<'eof'
> FROM centos:7
> MAINTAINER this is nginx image <lnmp>
> RUN curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
>     yum -y install pcre-devel zlib-devel gcc gcc-c++ make && yum clean all && \
>     useradd -M -s /sbin/nologin nginx
> ADD nginx-1.12.0.tar.gz /usr/local/src/
> ADD nginx.conf /usr/local/nginx/conf/
> WORKDIR /usr/local/src/nginx-1.12.0
> RUN ./configure --prefix=/usr/local/nginx \
>     --user=nginx \--group=nginx --with-http_stub_status_module && \
>     make -j 4 && make install && \
>     rm -rf /usr/local/src/nginx-1.12.0 && \
>     chmod 777 -R /usr/local/nginx/html/
> ENV PATH /usr/local/nginx/sbin:$PATH
> EXPOSE 80
> EXPOSE 443
> VOLUME [ "/usr/local/nginx/html/" ]
> CMD [ "/usr/local/nginx/sbin/nginx","-g","daemon off;" ]
> eof
[root@MineGi ~]#

2.3 准备 nginx.conf 配置文件

命令示例:

cat >/opt/lnmp/nginx/nginx.conf <<'eof'
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        charset utf-8;
        location / {
            root   html;
            index  index.html index.php;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location ~ \.php$ {
            root           html;
            fastcgi_pass   172.20.0.30:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
}
eof

输出结果:

[root@MineGi ~]# cat >/opt/lnmp/nginx/nginx.conf <<'eof'
> worker_processes  1;
> events {
>     worker_connections  1024;
> }
> http {
>     include       mime.types;
>     default_type  application/octet-stream;
>     sendfile        on;
>     keepalive_timeout  65;
>     server {
>         listen       80;
>         server_name  localhost;
>         charset utf-8;
>         location / {
>             root   html;
>             index  index.html index.php;
>         }
>         error_page   500 502 503 504  /50x.html;
>         location = /50x.html {
>             root   html;
>         }
>         location ~ \.php$ {
>             root           html;
>             fastcgi_pass   172.20.0.30:9000;
>             fastcgi_index  index.php;
>             fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;
>             include        fastcgi_params;
>         }
>     }
> }
> eof
[root@MineGi ~]#

2.4 生成镜像

docker build -t nginx:lnmp .
# -t 参数用于指定构建镜像的名称及标签
# . 就是指示Docker在当前目录中查找名为Dockerfile的文件,并以此文件作为构建镜像的基础
 
docker images  #查看所有镜像

命令示例:

cd /opt/lnmp/nginx/;ls
docker build -t nginx-lnmp:v1 .
docker images |grep nginx-lnmp

输出结果:

[root@MineGi ~]# cd /opt/lnmp/nginx/;ls
Dockerfile  html  nginx-1.12.0.tar.gz  nginx.conf
[root@MineGi nginx]# docker build -t nginx-lnmp:v1 .
[+] Building 85.8s (11/11) FINISHED                                                                             docker:default
 => [internal] load build definition from Dockerfile                                                                      0.0s
 => => transferring dockerfile: 804B                                                                                      0.0s
 => [internal] load metadata for docker.io/library/centos:7                                                               0.0s
 => [internal] load .dockerignore                                                                                         0.0s
 => => transferring context: 2B                                                                                           0.0s
 => CACHED [1/6] FROM docker.io/library/centos:7                                                                          0.0s
 => [internal] load build context                                                                                         0.0s
 => => transferring context: 981.89kB                                                                                     0.0s
 => [2/6] RUN curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo &&     yum -y i  58.7s
 => [3/6] ADD nginx-1.12.0.tar.gz /usr/local/src/                                                                         0.2s 
 => [4/6] ADD nginx.conf /usr/local/nginx/conf/                                                                           0.0s 
 => [5/6] WORKDIR /usr/local/src/nginx-1.12.0                                                                             0.0s 
 => [6/6] RUN ./configure --prefix=/usr/local/nginx     --user=nginx --group=nginx --with-http_stub_status_module &&     25.7s 
 => exporting to image                                                                                                    1.0s 
 => => exporting layers                                                                                                   1.0s 
 => => writing image sha256:f1ea01896901660542579e26040b00db8faa395869169fdbd5dafbf847b3be82                              0.0s 
 => => naming to docker.io/library/nginx-lnmp:v1                                                                          0.0s 
[root@MineGi nginx]# docker images |grep nginx-lnmp                                                                            
nginx-lnmp           v1          f1ea01896901   18 seconds ago   336MB
[root@MineGi nginx]#

2.5 创建 Nginx 镜像的容器

docker run -d --name nginx -p 80:80 -v /opt/lnmp/nginx/html:/usr/local/nginx/html -m 500m --memory-swap 1g --net mynetwork --ip 172.20.0.10 nginx:lnmp
 
#docker run: 运行一个新的容器
#-d: 在后台运行容器
#--name nginx: 为容器指定一个名称为 nginx
#-p 80:80: 将容器的 80 端口映射到主机的 80 端口,允许通过主机的 80 端口访问容器内的服务
#-v /opt/lnmp/nginx/html:/usr/local/nginx/html: 将主机的 /opt/lnmp/nginx/html 目录挂载到容器内的 /usr/local/nginx/html 目录,实现主机和容器之间的文件共享
#-m 500m: 限制容器的内存使用为 500MB
#--memory-swap 1g: 设置容器的内存加交换空间的上限为 1GB
#--net mynetwork: 连接容器到名为 mynetwork 的网络
#--ip 172.20.0.10: 为容器分配 IP 地址为 172.20.0.10
#nginx:lnmp: 使用 nginx:lnmp 镜像来创建容器
 
docker ps -a   #查看所有的容器
docker inspect nginx    #查看nginx容器的ip地址等信息

命令示例:

docker run -d \
    --name nginx -p 80:80 \
    -v /opt/lnmp/nginx/html:/usr/local/nginx/html \
    -m 500m --memory-swap 1g --net mynetwork --ip 172.20.0.10 nginx-lnmp:v1
   
docker ps -a
docker inspect -f '{{.NetworkSettings.Networks.mynetwork.IPAddress}}' nginx

输出结果:

[root@MineGi nginx]# docker run -d \
>     --name nginx -p 80:80 \
>     -v /opt/lnmp/nginx/html:/usr/local/nginx/html \
>     -m 500m --memory-swap 1g --net mynetwork --ip 172.20.0.10 nginx-lnmp:v1
37a64f5100f6ef41fb05d7aada3b47f5c4b076ca182010532537e6a9375d5f8b
[root@MineGi nginx]# docker ps -a
CONTAINER ID   IMAGE           COMMAND                   CREATED         STATUS         PORTS                                        NAMES
37a64f5100f6   nginx-lnmp:v1   "/usr/local/nginx/sb…"   5 seconds ago   Up 4 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp   nginx
[root@MineGi nginx]# docker inspect -f '{{.NetworkSettings.Networks.mynetwork.IPAddress}}' nginx
172.20.0.10
[root@MineGi nginx]# 

#如果有网络报错提示
[Warning] IPv4 forwarding is disabled. Networking will not work.
解决方法:
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
systemctl restart network
systemctl restart docker

2.6 验证nginx服务

命令示例:

echo "welcome to my world" |tee /opt/lnmp/nginx/html/index.html
curl 10.4.7.11

输出结果:

[root@MineGi nginx]# echo "welcome to my world" |tee /opt/lnmp/nginx/html/index.html
welcome to my world
[root@MineGi nginx]# curl 10.4.7.11
welcome to my world
[root@MineGi nginx]#

3、Mysql 镜像创建

3.1 建立工作目录并上传相关安装包

命令示例:

mkdir -p /opt/lnmp/mysql
cd !$
mv ~/mysql-boost-5.7.20.tar.gz .

输出结果:

[root@MineGi nginx]# mkdir -p /opt/lnmp/mysql
[root@MineGi nginx]# cd !$
cd /opt/lnmp/mysql
[root@MineGi mysql]# mv ~/mysql-boost-5.7.20.tar.gz .
[root@MineGi mysql]# 

3.2 编写 Mysql Dockerfile 脚本

命令示例:

cat >Dockerfile <<'eof' 
FROM centos:7
MAINTAINER this is mysql image <lnmp>
RUN curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
    yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake make && yum clean all
ADD mysql-boost-5.7.20.tar.gz /usr/local/src/
WORKDIR /usr/local/src/mysql-5.7.20/
RUN cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data \
    -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock -DSYSCONFDIR=/etc -DSYSTEMD_PID_DIR=/usr/local/mysql \
    -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_INNOBASE_STORAGE_ENGINE=1 \
    -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
    -DWITH_BOOST=boost -DWITH_SYSTEMD=1 && make -j 4 && make install 
ADD my.cnf /etc/
WORKDIR /usr/local/mysql
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
RUN useradd -M -s /sbin/nologin mysql && \
    rm -rf /usr/local/src/mysql-5.7.20/ && \
    chown mysql:mysql /etc/my.cnf && \
    chown -R mysql:mysql /usr/local/mysql/ && \
    /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
EXPOSE 3306
CMD ["/usr/local/mysql/bin/mysqld"]
eof

输出结果:

[root@MineGi mysql]# cat >Dockerfile <<'eof' 
> FROM centos:7
> MAINTAINER this is mysql image <lnmp>
> RUN curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
>     yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake make && yum clean all
> ADD mysql-boost-5.7.20.tar.gz /usr/local/src/
> WORKDIR /usr/local/src/mysql-5.7.20/
> RUN cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data \
>     -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock -DSYSCONFDIR=/etc -DSYSTEMD_PID_DIR=/usr/local/mysql \
>     -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_INNOBASE_STORAGE_ENGINE=1 \
>     -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \

>     -DWITH_BOOST=boost -DWITH_SYSTEMD=1 && make -j 4 && make install 
> ADD my.cnf /etc/
> WORKDIR /usr/local/mysql
> ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
> RUN useradd -M -s /sbin/nologin mysql && \
>     rm -rf /usr/local/src/mysql-5.7.20/ && \
>     chown mysql:mysql /etc/my.cnf && \
>     chown -R mysql:mysql /usr/local/mysql/ && \
>     /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data> EXPOSE 3306
> CMD ["/usr/local/mysql/bin/mysqld"]
> eof
[root@MineGi mysql]# 

3.3 编写 my.cnf 配置文件

命令示例:

cat >my.cnf <<'eof'
[client]
port = 3306
socket = /usr/local/mysql/mysql.sock
 
[mysql]
port = 3306
socket = /usr/local/mysql/mysql.sock
 
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
 
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
eof

输出结果:

[root@MineGi mysql]# cat >my.cnf <<'eof'
> [client]
> port = 3306
> socket = /usr/local/mysql/mysql.sock
>  
> [mysql]
> port = 3306
> socket = /usr/local/mysql/mysql.sock
>  
> [mysqld]
> user = mysql
> basedir = /usr/local/mysql
> datadir = /usr/local/mysql/data
> port = 3306
> character_set_server=utf8
> pid-file = /usr/local/mysql/mysqld.pid
> socket = /usr/local/mysql/mysql.sock
> server-id = 1
>  
> sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
> eof
[root@MineGi mysql]#

3.4 生成镜像

docker build -t mysql:lnmp .
# -t 参数用于指定构建镜像的名称及标签
# . 就是指示Docker在当前目录中查找名为Dockerfile的文件,并以此文件作为构建镜像的基础
 
docker images  #查看所有镜像

命令示例:

ls
docker build -t mysql-lnmp:v1 .
docker images |grep mysql-lnmp

输出结果:

[root@MineGi mysql]# ls
Dockerfile  my.cnf  mysql-boost-5.7.20.tar.gz
[root@MineGi mysql]# docker build -t mysql-lnmp:v1 .
[+] Building 1624.6s (13/13) FINISHED                                                                           docker:default
 => [internal] load build definition from Dockerfile                                                                      0.0s
 => => transferring dockerfile: 1.28kB                                                                                    0.0s
 => [internal] load metadata for docker.io/library/centos:7                                                               0.0s
 => [internal] load .dockerignore                                                                                         0.0s
 => => transferring context: 2B                                                                                           0.0s
 => [1/8] FROM docker.io/library/centos:7                                                                                 0.0s
 => [internal] load build context                                                                                         0.5s
 => => transferring context: 48.85MB                                                                                      0.5s
 => [2/8] RUN curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo &&     yum -y i  61.7s
 => [3/8] ADD mysql-boost-5.7.20.tar.gz /usr/local/src/                                                                   9.1s 
 => [4/8] WORKDIR /usr/local/src/mysql-5.7.20/                                                                            0.0s 
 => [5/8] RUN cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data     -DMYSQL_UNIX_AD  1476.3s 
 => [6/8] ADD my.cnf /etc/                                                                                                0.0s 
 => [7/8] WORKDIR /usr/local/mysql                                                                                        0.0s 
 => [8/8] RUN useradd -M -s /sbin/nologin mysql &&     rm -rf /usr/local/src/mysql-5.7.20/ &&     chown mysql:mysql /et  27.1s 
 => exporting to image                                                                                                   50.2s 
 => => exporting layers                                                                                                  50.1s 
 => => writing image sha256:f24afa726fdc63124622876e113247df2ef39b0ae8a6e04d4eb3370323807cb7                              0.0s 
 => => naming to docker.io/library/mysql-lnmp:v1                                                                          0.0s 
[root@MineGi mysql]# docker images |grep mysql-lnmp                                                                            
mysql-lnmp           v1          f24afa726fdc   About a minute ago   9.86GB
[root@MineGi mysql]# 

3.5 创建 Mysql 镜像的容器

docker run --name=mysql -d --privileged --device-write-bps /dev/sda:10M -v /usr/local/mysql --net mynetwork --ip 172.20.0.20 mysql:lnmp
 
#docker run: 运行一个新的容器
#--name=mysql: 为容器指定一个名称为 mysql
#-d: 在后台运行容器
#--privileged: 给容器赋予特权,即容器内的进程可以获得访问主机的权限
#--device-write-bps /dev/sda:10M: 限制容器对指定设备 /dev/sda 的写入速率为 10MB/s
#-v /usr/local/mysql: 挂载主机的 /usr/local/mysql 目录到容器内的相同路径,实现主机和容器之间的文件共享
#--net mynetwork: 连接容器到名为 mynetwork 的网络
#--ip 172.20.0.20: 为容器分配 IP 地址为 172.20.0.20
#mysql:lnmp: 使用 mysql:lnmp 镜像来创建容器
 
docker ps -a   #查看所有的容器
docker inspect mysql    #查看mysql容器的ip地址等信息

命令示例:

docker run -d \
    --name=mysql --privileged --device-write-bps /dev/sda:10M \
    -v /usr/local/mysql --net mynetwork --ip 172.20.0.20 mysql-lnmp:v1

docker ps -a
docker inspect -f '{{.NetworkSettings.Networks.mynetwork.IPAddress}}' mysql

输出结果:

[root@MineGi mysql]# docker run -d \
>     --name=mysql --privileged --device-write-bps /dev/sda:10M \
>     -v /usr/local/mysql --net mynetwork --ip 172.20.0.20 mysql-lnmp:v1
4e2a395a1727ce4e34a4e7a7bef63dd539fd3ccd18de52d0aee254178b7d9a12
[root@MineGi mysql]# docker ps -a
CONTAINER ID   IMAGE           COMMAND                   CREATED          STATUS          PORTS                                        NAMES
4e2a395a1727   mysql-lnmp:v1   "/usr/local/mysql/bi…"   13 seconds ago   Up 3 seconds    3306/tcp                                     mysql
37a64f5100f6   nginx-lnmp:v1   "/usr/local/nginx/sb…"   2 hours ago      Up 24 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp   nginx
[root@MineGi mysql]# docker inspect -f '{{.NetworkSettings.Networks.mynetwork.IPAddress}}' mysql
172.20.0.20
[root@MineGi mysql]# 

4、PHP 镜像创建

4.1 建立工作目录并上传相关安装包

命令示例:

mkdir -p /opt/lnmp/php
cd !$
mv /root/php-7.1.10.tar.bz2 .

输出结果:

[root@MineGi mysql]# mkdir -p /opt/lnmp/php
[root@MineGi mysql]# cd !$
cd /opt/lnmp/php
[root@MineGi php]# mv /root/php-7.1.10.tar.bz2 .
[root@MineGi php]#

4.2 编写 PHP Dockerfile 脚本

命令示例:

cat >Dockerfile <<'eof'
FROM centos:7
MAINTAINER this is php image <lnmp>
RUN curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
    yum -y install gd libjpeg libjpeg-devel libpng libpng-devel gcc gcc-c++ make pcre-devel \
    freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel curl curl-devel openssl openssl-devel && \
    useradd -M -s /sbin/nologin nginx && yum clean all     
ADD php-7.1.10.tar.bz2 /usr/local/src/
WORKDIR /usr/local/src/php-7.1.10
RUN ./configure --prefix=/usr/local/php --with-mysql-sock=/usr/local/mysql/mysql.sock \
    --with-mysqli --with-zlib --with-curl --with-gd --with-jpeg-dir --with-png-dir \
    --enable-session --enable-ftp --enable-pdo --with-freetype-dir --with-openssl --enable-fpm \
    --enable-mbstring --enable-xml --enable-tokenizer --enable-zip && make -j 4 && make install
ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH
ADD php.ini /usr/local/php/lib/
ADD php-fpm.conf /usr/local/php/etc/
ADD www.conf /usr/local/php/etc/php-fpm.d/
EXPOSE 9000
ENTRYPOINT [ "/usr/local/php/sbin/php-fpm", "-F" ]
eof

输出结果:

[root@MineGi php]# cat >Dockerfile <<'eof'
> FROM centos:7
> MAINTAINER this is php image <lnmp>
> RUN curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
>     yum -y install gd libjpeg libjpeg-devel libpng libpng-devel gcc gcc-c++ make pcre-devel \
>     freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel curl curl-devel openssl openssl-devel && \
>     useradd -M -s /sbin/nologin nginx && yum clean all     
> ADD php-7.1.10.tar.bz2 /usr/local/src/
> WORKDIR /usr/local/src/php-7.1.10
> RUN ./configure --prefix=/usr/local/php --with-mysql-sock=/usr/local/mysql/mysql.sock \
>     --with-mysqli --with-zlib --with-curl --with-gd --with-jpeg-dir --with-png-dir \
>     --enable-session --enable-ftp --enable-pdo --with-freetype-dir --with-openssl --enable-fpm \
>     --enable-mbstring --enable-xml --enable-tokenizer --enable-zip && make -j 4 && make install
> ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH
> ADD php.ini /usr/local/php/lib/
> ADD php-fpm.conf /usr/local/php/etc/
> ADD www.conf /usr/local/php/etc/php-fpm.d/
> EXPOSE 9000
> ENTRYPOINT [ "/usr/local/php/sbin/php-fpm", "-F" ]
> eof
[root@MineGi php]#

4.3 准备 php.ini、php-fpm.conf、www.conf 配置文件

4.3.1 准备 php.ini 配置文件

情况说明:该配置文件模板位于安装目录的 php-7.1.10/php.ini-development 位置

vim php.ini
 
#第939行,取消注释,修改
date.timezone = Asia/Shanghai
#第1170行,修改
mysqli.default_socket = /usr/local/mysql/mysql.sock

命令示例:

yum install -y bzip2
tar xjf php-7.1.10.tar.bz2
cp php-7.1.10/php.ini-development php.ini
grep "mysqli.default_socket =" php.ini
grep "date.timezone" php.ini

sed -i -e 's#mysqli.default_socket =#& /usr/local/mysql/mysql.sock'# \
    -e '/;date.timezone =/a\date.timezone = Asia/Shanghai' php.ini
    
grep "mysqli.default_socket =" php.ini
grep "date.timezone" php.ini

输出结果:

[root@MineGi php]# yum install -y -q bzip2
软件包 bzip2-1.0.6-13.el7.x86_64 已安装并且是最新版本
[root@MineGi php]# tar xjf php-7.1.10.tar.bz2
[root@MineGi php]# cp php-7.1.10/php.ini-development php.ini
[root@MineGi php]# grep "mysqli.default_socket =" php.ini
mysqli.default_socket =
[root@MineGi php]# grep "date.timezone" php.ini
; http://php.net/date.timezone
;date.timezone =
[root@MineGi php]# sed -i -e 's#mysqli.default_socket =#& /usr/local/mysql/mysql.sock'# \
>     -e '/;date.timezone =/a\date.timezone = Asia/Shanghai' php.ini
[root@MineGi php]# grep "mysqli.default_socket =" php.ini
mysqli.default_socket = /usr/local/mysql/mysql.sock
[root@MineGi php]# grep "date.timezone" php.ini
; http://php.net/date.timezone
;date.timezone =
date.timezone = Asia/Shanghai
[root@MineGi php]# 

4.3.2 准备 php-fpm.conf 配置文件

情况说明:该配置文件位于 /usr/local/php/etc/php-fpm.conf.default

vim php-fpm.conf
 
#第17行,删除注释符号“;”
pid = run/php-fpm.pid

命令示例:

[root@MineGi php]# cat >php-fpm.conf <<'eof'
> [global]
> pid = run/php-fpm.pid
> include=/usr/local/php/etc/php-fpm.d/*.conf
> eof
[root@MineGi php]#

输出结果:

[root@MineGi php]# cat >php-fpm.conf <<'eof'
> [global]
> pid = run/php-fpm.pid
> include=/usr/local/php/etc/php-fpm.d/*.conf
> eof
[root@MineGi php]#

4.3.3 准备 www.conf 配置文件

情况说明:该配置文件位于 usr/local/php/etc/php-fpm.d/www.conf.default

vim www.conf 
 
#第23、24行,修改用户和组
user = nginx
group = nginx
#第36行,修改监听IP和端口为容器IP:9000端口
listen = 172.20.0.30:9000
#第62行,修改被允许监听的客户端容器地址为回环地址和nginx容器地址
listen.allowed_clients = 127.0.0.1,172.20.0.10

命令示例:

cat >www.conf <<'eof'
[www]
user = nginx
group = nginx
listen = 172.20.0.30:9000
listen.allowed_clients = 127.0.0.1,172.20.0.10
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
eof

输出结果:

[root@MineGi php]# cat >www.conf <<'eof'
> [www]
> user = nginx
> group = nginx
> listen = 172.20.0.30:9000
> listen.allowed_clients = 127.0.0.1,172.20.0.10
> pm = dynamic
> pm.max_children = 5
> pm.start_servers = 2
> pm.min_spare_servers = 1
> pm.max_spare_servers = 3
> eof
[root@MineGi php]# 

4.4 生成镜像

docker build -t php:lnmp .
# -t 参数用于指定构建镜像的名称及标签
# . 就是指示Docker在当前目录中查找名为Dockerfile的文件,并以此文件作为构建镜像的基础
 
docker images  #查看所有镜像

命令示例:

ls
docker build -t php-lnmp:v1 .
docker images |grep php-lnmp

输出结果:

[root@MineGi php]# ls
Dockerfile  php-7.1.10  php-7.1.10.tar.bz2  php-fpm.conf  php.ini  www.conf
[root@MineGi php]# docker build -t php-lnmp:v1 .
[+] Building 962.5s (13/13) FINISHED                                                                            docker:default
 => [internal] load build definition from Dockerfile                                                                      0.0s
 => => transferring dockerfile: 1.12kB                                                                                    0.0s
 => [internal] load metadata for docker.io/library/centos:7                                                               0.0s
 => [internal] load .dockerignore                                                                                         0.0s
 => => transferring context: 2B                                                                                           0.0s
 => [1/8] FROM docker.io/library/centos:7                                                                                 0.0s
 => [internal] load build context                                                                                         0.2s
 => => transferring context: 15.14MB                                                                                      0.1s
 => [2/8] RUN curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo &&     yum -y i  98.4s
 => [3/8] ADD php-7.1.10.tar.bz2 /usr/local/src/                                                                         13.1s 
 => [4/8] WORKDIR /usr/local/src/php-7.1.10                                                                               1.9s 
 => [5/8] RUN ./configure --prefix=/usr/local/php --with-mysql-sock=/usr/local/mysql/mysql.sock     --with-mysqli --wi  843.2s 
 => [6/8] ADD php.ini /usr/local/php/lib/                                                                                 0.2s 
 => [7/8] ADD php-fpm.conf /usr/local/php/etc/                                                                            0.2s 
 => [8/8] ADD www.conf /usr/local/php/etc/php-fpm.d/                                                                      0.2s 
 => exporting to image                                                                                                    4.9s 
 => => exporting layers                                                                                                   4.8s 
 => => writing image sha256:d61fd605272454d4b249777345a7a1d6696760d0c1d394dbc1d720d380dd698c                              0.0s 
 => => naming to docker.io/library/php-lnmp:v1                                                                            0.0s
[root@MineGi php]# docker images |grep php-lnmp
php-lnmp             v1          d61fd6052724   5 minutes ago    965MB
[root@MineGi php]#

4.5 创建该镜像的容器

docker run --name=php -d -p 9000:9000 --volumes-from mysql --volumes-from nginx --net mynetwork --ip 172.20.0.30 php:lnmp
 
#docker run: 运行一个新的容器
#--name=php: 为容器指定一个名称为 php
#-d: 在后台运行容器
#-p 9000:9000: 将容器的 9000 端口映射到主机的 9000 端口,允许通过主机的 9000 端口访问容器内的服务
#--volumes-from mysql: 将容器 mysql 的数据卷挂载到当前容器中,实现数据共享
#--volumes-from nginx: 将容器 nginx 的数据卷挂载到当前容器中,实现数据共享
#--net mynetwork: 连接容器到名为 mynetwork 的网络
#--ip 172.20.0.30: 为容器分配 IP 地址为 172.20.0.30
#php:lnmp: 使用 php:lnmp 镜像来创建容器
 
docker ps -a   #查看所有的容器

命令示例:

docker run --name=php -d -p 9000:9000 \
    --volumes-from mysql --volumes-from nginx \
    --net mynetwork --ip 172.20.0.30 php-lnmp:v1
    
docker ps -a
docker inspect -f '{{.NetworkSettings.Networks.mynetwork.IPAddress}}' php

输出结果:

[root@MineGi php]# docker run --name=php -d -p 9000:9000 \
>     --volumes-from mysql --volumes-from nginx \
>     --net mynetwork --ip 172.20.0.30 php-lnmp:v1
3534665d89413565ab761c309e93c70694268422b0d1a7ed3dc1db798b357ea3
[root@MineGi php]# docker ps -a
CONTAINER ID   IMAGE           COMMAND                   CREATED              STATUS              PORTS                                        NAMES
3534665d8941   php-lnmp:v1     "/usr/local/php/sbin…"   5 seconds ago        Up 4 seconds        0.0.0.0:9000->9000/tcp, :::9000->9000/tcp    php
4e2a395a1727   mysql-lnmp:v1   "/usr/local/mysql/bi…"   About a minute ago   Up About a minute   3306/tcp                                     mysql
37a64f5100f6   nginx-lnmp:v1   "/usr/local/nginx/sb…"   2 hours ago          Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp   nginx
[root@MineGi php]# docker inspect -f '{{.NetworkSettings.Networks.mynetwork.IPAddress}}' php
172.20.0.30
[root@MineGi php]#

4.6 验证 PHP

#进入到 php 容器中
docker exec -it php bash
 
ps -aux

命令示例:

docker exec -it php bash
ps -aux
exit

输出结果:

[root@MineGi php]# docker exec -it php bash
[root@3534665d8941 php-7.1.10]# ps -aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.2  0.0 113028  7520 ?        Ss   03:47   0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
nginx         7  0.0  0.0 113028  3772 ?        S    03:47   0:00 php-fpm: pool www
nginx         8  0.0  0.0 113028  3772 ?        S    03:47   0:00 php-fpm: pool www
root          9  1.2  0.0  11828  1892 pts/0    Ss   03:48   0:00 bash
root         23  0.0  0.0  51732  1724 pts/0    R+   03:48   0:00 ps -aux
[root@3534665d8941 php-7.1.10]# exit
exit
[root@MineGi php]#

5、启动 wordpress 服务

5.1 mysql 授权

docker exec -it mysql /bin/bash   #进入到 mysql 容器内
mysql -u root -p
Enter password: 
                  #初始密码为空,回车即可
create database wordpress;
#创建wordpress数据库
grant all privileges on wordpress.* to 'wordpress'@'%' identified by '123456';
#授予一个名为 wordpress 的数据库中的用户 wordpress 在任何主机上('%')的所有权限,并使用密码 123456 进行身份验证
#将所有权限授予用户 wordpress,允许其从任何主机连接到 wordpress 数据库,并使用密码 123456 进行身份验证
 
grant all privileges on *.* to 'root'@'%' identified by 'abc123';
#授予用户名为 root,从任何主机连接到 MySQL 数据库服务器的用户,对所有数据库中的所有表具有全部权限,并设置密码为 abc123
#这样的设置允许用户 root 从任何地方以密码 abc123 连接到 MySQL 数据库,并具有对所有数据库的全部权限
 
flush privileges;
    #刷新权限
 
exit   #退出 mysql 数据库
 
exit  #退出 mysql 容器

命令示例:

docker exec -it mysql /bin/bash 
mysql -u root -p

create database wordpress;
grant all privileges on wordpress.* to 'wordpress'@'%' identified by '123456';
grant all privileges on *.* to 'root'@'%' identified by 'abc123';
flush privileges;
exit
exit

输出结果:

[root@MineGi php]# docker exec -it mysql /bin/bash 
[root@4e2a395a1727 mysql]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.20 Source distribution

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database wordpress;
Query OK, 1 row affected (0.00 sec)

mysql> grant all privileges on wordpress.* to 'wordpress'@'%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> grant all privileges on *.* to 'root'@'%' identified by 'abc123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> exit
Bye
[root@4e2a395a1727 mysql]# exit
exit
[root@MineGi php]#

5.2 浏览器访问安装 wordpress

浏览器访问
http://10.4.7.11/wordpress/index.php

报错页面:

解决方法:

cd /opt/lnmp/nginx/html/wordpress   #切换目录
cp wp-config-sample.php wp-config.php   #手动创建wp-config.php文件
vim wp-config.php
#第23行,将'database_name_here'改为'wordpress'
define('DB_NAME', 'wordpress');
#第26行,将'username_here'改为'wordpress'
define('DB_USER', 'wordpress');
#第29行,将'password_here'改为'123456'
define('DB_PASSWORD', '123456');
 
systemctl restart docker   #重启docker服务
docker start nginx;docker start mysql;docker start php   #重启docker容器
docker ps   #查看当前正在运行中的容器,必须得有nginx、mysql、php

命令示例:

ls /opt/lnmp/nginx/html/wordpress/wp-config-sample.php
cp -a /opt/lnmp/nginx/html/wordpress/{wp-config-sample.php,wp-config.php}
ll /opt/lnmp/nginx/html/wordpress/{wp-config-sample.php,wp-config.php}

grep -E "database_name_here|username_here|password_here" \
    /opt/lnmp/nginx/html/wordpress/wp-config.php

sed -i -e 's/database_name_here/wordpress/g' \
    -e 's/username_here/wordpress/g' \
    -e 's/password_here/123456/g' \
    /opt/lnmp/nginx/html/wordpress/wp-config.php

grep -E "DB_NAME|DB_USER|DB_PASSWORD" \
    /opt/lnmp/nginx/html/wordpress/wp-config.php

输出结果:

[root@MineGi php]# ls /opt/lnmp/nginx/html/wordpress/wp-config-sample.php
/opt/lnmp/nginx/html/wordpress/wp-config-sample.php
[root@MineGi php]# cp -a /opt/lnmp/nginx/html/wordpress/{wp-config-sample.php,wp-config.php}
[root@MineGi php]# ll /opt/lnmp/nginx/html/wordpress/{wp-config-sample.php,wp-config.php}
-rw-r--r-- 1 nobody 65534 2930 2月   8 2018 /opt/lnmp/nginx/html/wordpress/wp-config.php
-rw-r--r-- 1 nobody 65534 2930 2月   8 2018 /opt/lnmp/nginx/html/wordpress/wp-config-sample.php
[root@MineGi php]# grep -E "database_name_here|username_here|password_here" \
>     /opt/lnmp/nginx/html/wordpress/wp-config.php
define('DB_NAME', 'database_name_here');
define('DB_USER', 'username_here');
define('DB_PASSWORD', 'password_here');
[root@MineGi php]# sed -i -e 's/database_name_here/wordpress/g' \
>     -e 's/username_here/wordpress/g' \
>     -e 's/password_here/123456/g' \
>     /opt/lnmp/nginx/html/wordpress/wp-config.php
[root@MineGi php]# grep -E "DB_NAME|DB_USER|DB_PASSWORD" \
>     /opt/lnmp/nginx/html/wordpress/wp-config.php
define('DB_NAME', 'wordpress');
define('DB_USER', 'wordpress');
define('DB_PASSWORD', '123456');
[root@MineGi php]# 

命令示例:

systemctl restart docker
docker ps
docker start nginx mysql php
docker ps

输出结果:

[root@MineGi php]# systemctl restart docker
[root@MineGi php]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@MineGi php]# docker start nginx mysql php
nginx
mysql
php
[root@MineGi php]# docker ps
CONTAINER ID   IMAGE           COMMAND                   CREATED         STATUS         PORTS                                        NAMES
3534665d8941   php-lnmp:v1     "/usr/local/php/sbin…"   7 minutes ago   Up 2 seconds   0.0.0.0:9000->9000/tcp, :::9000->9000/tcp    php
4e2a395a1727   mysql-lnmp:v1   "/usr/local/mysql/bi…"   8 minutes ago   Up 2 seconds   3306/tcp                                     mysql
37a64f5100f6   nginx-lnmp:v1   "/usr/local/nginx/sb…"   3 hours ago     Up 3 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp   nginx
[root@MineGi php]#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MineGi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值