目录
准备 php.ini、php-fpm.conf、www.conf 配置文件
NMP架构是一种用于运行动态网站或服务器的自由软件组合,它的名称取自其各个组成部分的首字母缩写。具体而言,LNMP代表Linux、Nginx、MySQL和PHP/Python/Perl,这四个元素共同构成了一套完整的服务器架构。
Linux: 作为操作系统,提供服务器的基础环境。
Nginx: 充当Web服务器,负责处理客户端的请求并向后端服务器传递这些请求。
MySQL: 作为关系型数据库管理系统,用于存储和管理数据。
PHP/Python/Perl: 用于处理动态内容和服务器端脚本。
LNMP架构在搭建和部署方面具有一定的灵活性和性能优势,因此被广泛用于运行各种动态网站和应用。这种架构的选择取决于项目的具体需求,例如使用PHP、Python或Perl等不同的服务器端脚本语言。
准备的是这些安装包
mysql-boost-5.7.20.tar.gz
nginx-1.12.0.tar.gz
php-7.1.10.tar.bz2
wordpress-4.9.4-zh_CN.tar.gz
基于 Docker 的服务器环境,其中运行了三个容器分别用于 Nginx、MySQL 和 PHP。
容器名称: Docker-Nginx
操作系统: CentOS 7
IP 地址: 172.20.0.10
主要软件: Nginx
容器名称: Docker-Mysql
操作系统: CentOS 7
IP 地址: 172.20.0.20
主要软件: MySQL
容器名称: Docker-php
操作系统: CentOS 7
IP 地址: 172.20.0.30
主要软件: PHP
这种容器化的架构使得每个服务都能够在独立的环境中运行,提高了灵活性和可维护性。
使用 Docker 构建 LNMP 环境并运行 Wordpress 网站平台
限制 Nginx 容器最多使用 500MB 的内存和 1G 的 Swap
限制 Mysql 容器写 /dev/sda 的速率为 10 MB/s
将所有容器进行快照,然后将 Docker 镜像打包成 tar 包备份到本地
mkdir /opt/nginx
#上传nginx-1.12.0.tar.gz、wordpress-4.9.4-zh_CN.tar.gz 到 /opt/nginx/ 目录中
cd /opt/nginx
vim Dockerfile
FROM centos:7
MAINTAINER this is nginx image <lnmp>
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make;useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /usr/local/src/
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
ENV PATH /usr/local/nginx/sbin:$PATH
ADD nginx.conf /usr/local/nginx/conf/
ADD wordpress-4.9.4-zh_CN.tar.gz /usr/local/nginx/html
RUN chmod 777 -R /usr/local/nginx/html/
EXPOSE 80
VOLUME [ "/usr/local/nginx/html/" ]
CMD [ "/usr/local/nginx/sbin/nginx","-g","daemon off;" ]
这是一个 Dockerfile 文件,用于构建一个包含 Nginx 1.12.0 和 WordPress 的镜像。以下是对每个部分的简要解释:
FROM centos:7
: 基础镜像是 CentOS 7。
MAINTAINER
: 指定镜像的维护者信息。
安装依赖和创建 Nginx 用户:
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make; \
useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /usr/local/src/
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
ENV PATH /usr/local/nginx/sbin:$PATH
ADD nginx.conf /usr/local/nginx/conf/
ADD wordpress-4.9.4-zh_CN.tar.gz /usr/local/nginx/html
RUN chmod 777 -R /usr/local/nginx/html/
EXPOSE 80
VOLUME [ "/usr/local/nginx/html/" ]
CMD [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]
这个 Dockerfile 创建一个包含 Nginx 1.12.0 和 WordPress 的镜像。它配置了 Nginx 的基本参数,并将 WordPress 安装在 Nginx 的默认 HTML 目录下。
#复制nginx.conf到/opt/nginx/
cp /usr/local/nginx/conf/nginx.conf /opt/nginx/
vim nginx.conf
egrep -v "^(.)*#(.)*$" nginx.conf | grep -v "^$" #查看
配置文件的主要部分解释:
worker_processes 1;
:指定Nginx使用一个worker进程。在实际生产环境中,可能需要根据服务器的CPU核心数量调整这个值。
events
块:
worker_connections 1024;
:设置每个worker进程的最大并发连接数。
http
块:
include mime.types;
:引用了一个包含了MIME类型的文件,以确保Nginx正确地处理各种文件类型。
default_type application/octet-stream;
:指定默认的MIME类型为二进制流。
sendfile on;
:启用sendfile指令,用于在磁盘和网络之间直接传输文件,提高性能。
keepalive_timeout 65;
:指定客户端与服务器之间的持续连接超时时间。
server
块:
listen 80;
:指定Nginx监听端口80。
server_name localhost;
:指定服务器名为localhost。
charset utf-8;
:设置字符集为UTF-8。
location /
块:
root html;
:指定Web根目录为html。
index index.html index.php;
:定义默认的索引文件。
error_page
块:
location ~ \.php$
块:
匹配以.php结尾的URL。
root html;
:指定PHP文件的根目录。
fastcgi_pass 172.20.0.30:9000;
:将PHP请求传递给FastCGI服务器,此处的IP和端口应与您的PHP-FPM服务器配置一致。
其余的参数配置用于传递必要的信息给FastCGI服务器。
docker build -t nginx:lnmp .
docker images
如果出现下面这个错误
ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
这个错误表明系统上 Docker 守护进程没有启动,或者你的用户没有足够的权限连接到 Docker 守护进程。
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker $USER
记得注销并重新登录,以使组成员身份得到更新。
docker build -t nginx:lnmp .
docker network create --subnet=172.20.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
#检查
docker network ls
ifconfig docker1
docker run -d --name nginx -p 80:80 -m 500m --memory-swap 1g --net mynetwork --ip 172.20.0.10 nginx:lnmp
这是一个用于在 Docker 中运行 Nginx 服务的命令。
docker run
: 运行一个 Docker 容器。
-d
: 在后台运行容器。
--name nginx
: 为容器指定名称为 "nginx"。
-p 80:80
: 将容器的端口 80 映射到主机的端口 80,使得可以通过主机的端口 80 访问容器中运行的 Nginx 服务。
-m 500m
: 限制容器的内存使用为 500 MB。
--memory-swap 1g
: 设置容器的内存加交换空间的总限制为 1 GB。
--net mynetwork
: 将容器连接到名为 "mynetwork" 的网络。
--ip 172.20.0.10
: 为容器指定 IP 地址为 172.20.0.10。
nginx:lnmp
: 使用 "nginx:lnmp" 镜像来运行容器。这表示使用了一个包含 Nginx 和 LNMP(Linux、Nginx、MySQL、PHP)环境的镜像。
总体而言,这个命令的目的是在 Docker 中创建并运行一个名为 "nginx" 的容器,该容器使用指定的配置和镜像来提供 Nginx 服务。
检查
docker ps
#显示当前正在执行的容器的基本信息,如容器 ID、名称、状态、端口映射等。
docker inspect nginx
#获取有关指定 Docker 容器(这里是 "nginx")的详细信息
这部分输出是关于 Docker 容器的网络配置的一部分。在这里,我们可以看到容器连接到一个名为 "mynetwork" 的网络,并被分配了 IPv4 地址 "172.20.0.10"。
具体来说:
"Networks" 表示容器所连接的网络部分。
"mynetwork" 是网络的名称。
"IPAMConfig" 包含有关 IP 地址管理的配置信息。
"IPv4Address" 是容器在该网络上分配的 IPv4 地址,这里是 "172.20.0.10"。
这表明容器 "nginx" 在网络 "mynetwork" 中拥有 IP 地址 "172.20.0.10"。这种网络配置使得容器可以在这个网络上进行通信,同时通过 Docker 主机上的端口映射可以与外部进行交互。
curl http://192.168.41.31:80
这个 curl
命令向指定的地址发送 HTTP 请求,并显示了该地址返回的 HTML 内容。在这个例子中,它向 http://192.168.41.31:80
发送了请求,并收到了 Nginx 的欢迎页面的 HTML 响应。
响应内容表明 Nginx 服务器已成功安装并正在运行。它提供了一些关于 Nginx 的基本信息,包括欢迎消息、安装成功提示以及一些相关的链接,如官方文档和商业支持。
mkdir /opt/mysql
cd /opt/mysql
#传入mysql安装包mysql-boost-5.7.20.tar.gz到/opt/mysql
vim Dockerfile
FROM centos:7
MAINTAINER this is mysql image <lnmp>
RUN yum -y install ncurses ncurses-devel bison cmake pcre-devel zlib-devel gcc gcc-c++ make;useradd -M -s /sbin/nologin mysql
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_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1;make -j4;make install
ADD my.cnf /etc/my.cnf
EXPOSE 3306
RUN chown -R mysql:mysql /usr/local/mysql/;chown mysql:mysql /etc/my.cnf
WORKDIR /usr/local/mysql/bin/
RUN ./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data;cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/;systemctl enable mysqld
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
VOLUME [ "/usr/local/mysql" ]
CMD ["/usr/sbin/init"]
这是一个 Dockerfile 文件,用于构建一个包含 MySQL 5.7.20 的镜像。以下是对每个部分的简要解释:
FROM centos:7
: 基础镜像是 CentOS 7。
MAINTAINER
: 指定镜像的维护者信息。
安装依赖和创建 MySQL 用户:
RUN yum -y install ncurses ncurses-devel bison cmake pcre-devel zlib-devel gcc gcc-c++ make; \
useradd -M -s /sbin/nologin mysql
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_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1; \
make -j4; \
make install
ADD my.cnf /etc/my.cnf
EXPOSE 3306
RUN chown -R mysql:mysql /usr/local/mysql/; \
chown mysql:mysql /etc/my.cnf
WORKDIR /usr/local/mysql/bin/
RUN ./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data; \
cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/; \
systemctl enable mysqld
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
VOLUME [ "/usr/local/mysql" ]
/usr/sbin/init
:CMD ["/usr/sbin/init"]
这个 Dockerfile 创建一个包含 MySQL 5.7.20 的镜像,配置了一些基本的参数和文件路径。
vim my.cnf
[client]
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
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
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
这是一个MySQL配置文件的示例,通常位于my.cnf
或my.ini
文件中。以下是对其中一些重要配置项的解析:
[client] 部分:
port = 3306
: 客户端连接MySQL服务器的端口号。
socket=/usr/local/mysql/mysql.sock
: 指定MySQL服务器的Unix套接字文件。
[mysqld] 部分:
user = mysql
: MySQL服务运行的用户。
basedir=/usr/local/mysql
: MySQL安装的基本目录。
datadir=/usr/local/mysql/data
: 存储数据库数据文件的目录。
port = 3306
: MySQL服务器监听的端口号。
character-set-server=utf8
: 服务器使用的字符集。
pid-file = /usr/local/mysql/mysqld.pid
: 保存MySQL服务器进程ID的文件路径。
socket=/usr/local/mysql/mysql.sock
: MySQL服务器的Unix套接字文件路径。
bind-address = 0.0.0.0
: MySQL服务器绑定的IP地址,0.0.0.0表示绑定到所有可用的网络接口。
skip-name-resolve
: 禁用DNS解析,提高性能。
max_connections=2048
: 允许的最大连接数。
default-storage-engine=INNODB
: 默认的存储引擎。
max_allowed_packet=16M
: 允许的最大数据包大小。
server-id = 1
: 为服务器指定唯一ID,通常用于主从复制。
sql_mode
: SQL模式设置,包括一系列启用或禁用特定SQL语法规则的选项。
docker build -t mysql:lnmp .
docker images
docker run --name=mysql --privileged --device-write-bps /dev/sda:10M -v /usr/local/mysql --net mynetwork --ip 172.20.0.20 -d mysql:lnmp
这是一个用于在Docker中运行MySQL容器的命令。以下是对该命令的解析:
docker run
: 启动一个新的Docker容器。
--name=mysql
: 为容器指定一个名称,这里是"mysql"。
--privileged
: 赋予容器全部的Linux Capabilities,这样容器内的进程就拥有了更高的权限。
--device-write-bps /dev/sda:10M
: 限制指定设备(此处是/dev/sda)的写入速率为10兆字节/秒。
-v /usr/local/mysql
: 将宿主机的/usr/local/mysql
目录挂载到容器中,实现数据持久化。
--net mynetwork
: 将容器连接到名为"mynetwork"的Docker网络。
--ip 172.20.0.20
: 为容器分配指定的IP地址,这里是172.20.0.20。
-d
: 以后台模式运行容器。
mysql:lnmp
: 使用"mysql:lnmp"镜像创建容器。
docker exec -it mysql bash
这是一个用于在运行中的MySQL容器中执行交互式bash shell的Docker命令。以下是对该命令的解析:
docker exec
: 在运行中的容器中执行命令。
-it
: 同时分配一个伪终端(pseudo-TTY)并保持标准输入打开,使得用户可以与容器的Shell进行交互。
mysql
: 这是容器的名称或ID,表示在哪个容器中执行命令。
bash
: 要在容器中执行的命令,这里是启动bash shell。
此命令的目的是进入MySQL容器的Shell,允许用户在容器内执行各种命令,例如配置、管理数据库等。在这个Shell中,你可以执行各种MySQL相关的操作。请确保容器正在运行,并已经使用此名称("mysql")启动。
systemctl status mysqld
#查看MySQL服务状态
mkdir /opt/php
cd /opt/php
#传入php安装包php-7.1.10.tar.bz2到/opt/php
vim Dockerfile
FROM centos:7
MAINTAINER this is php image <lnmp>
RUN yum install -y gd \
libjpeg libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel \
gcc gcc-c++ make pcre-devel;useradd -M -s /sbin/nologin nginx
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 \
--with-freetype-dir \
--with-openssl \
--enable-fpm \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--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
CMD /usr/local/php/sbin/php-fpm -F
这是一个Dockerfile文件,用于构建一个基于CentOS 7的PHP镜像。以下是对每个步骤的解析:
FROM centos:7
: 使用CentOS 7作为基础镜像。
MAINTAINER this is php image <lnmp>
: 设置镜像的维护者信息。
RUN yum install -y gd \ libjpeg libjpeg-devel \ libpng libpng-devel \ freetype freetype-devel \ libxml2 libxml2-devel \ zlib zlib-devel \ curl curl-devel \ openssl openssl-devel \ gcc gcc-c++ make pcre-devel; useradd -M -s /sbin/nologin nginx
: 安装一系列依赖包,然后创建一个不可登录的用户 "nginx"。
ADD php-7.1.10.tar.bz2 /usr/local/src/
: 将PHP源代码解压到 /usr/local/src/
目录下。
WORKDIR /usr/local/src/php-7.1.10
: 设置工作目录为PHP源代码目录。
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 \ --with-freetype-dir \ --with-openssl \ --enable-fpm \ --enable-mbstring \ --enable-xml \ --enable-session \ --enable-ftp \ --enable-pdo \ --enable-tokenizer \ --enable-zip ; make -j 4 ; make install
: 配置、编译和安装PHP。指定了一系列选项和模块,包括MySQL支持、zlib、curl、GD图形库等。
ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH
: 设置环境变量,将PHP可执行文件路径添加到系统PATH中。
ADD php.ini /usr/local/php/lib/
: 添加自定义的php.ini配置文件。
ADD php-fpm.conf /usr/local/php/etc/
: 添加自定义的php-fpm配置文件。
ADD www.conf /usr/local/php/etc/php-fpm.d/
: 添加自定义的php-fpm池配置文件。
EXPOSE 9000
: 暴露PHP-FPM的监听端口。
CMD /usr/local/php/sbin/php-fpm -F
: 设置容器启动时执行的默认命令,启动PHP-FPM服务。 -F
选项使PHP-FPM在前台运行。
vim php.ini
#939行,取消注释,修改
date.timezone = Asia/Shanghai
#1170行,修改
mysqli.default_socket = /usr/local/mysql/mysql.sock
vim php-fpm.conf
#17行,删除注释符号“;”
pid = run/php-fpm.pid
vim www.conf
#23、24行,修改用户和组
user = nginx
group = nginx
#36行,修改监听IP和端口为容器IP:9000端口
listen = 172.20.0.30:9000
#62行,修改允许客户端的IP地址列表
listen.allowed_clients = 127.0.0.1,172.20.0.10
docker build -t php:lnmp .
docker images
docker run --name php --net mynetwork --ip 172.20.0.30 -p 9000:9000 --volumes-from nginx --volumes-from mysql -itd php:lnmp
docker ps
docker exec -it php bash
ps -aux
docker exec -it php bash
: 这个命令使用 exec
在运行的Docker容器中执行命令。 -it
选项表示交互式执行,并使用 bash
进入容器的命令行终端。
一旦你进入了容器的命令行终端,然后执行 ps -aux
命令:这个命令用于显示当前正在运行的进程列表,以及它们的详细信息。
#进入mysql容器
docker exec -it mysql 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 '123456';
flush privileges;
上述代码是在MySQL数据库中创建一个名为"wordpress"的数据库,并授予了两个用户不同的权限。
create database wordpress;
: 创建一个名为"wordpress"的数据库。
grant all privileges on wordpress.* to 'wordpress'@'%' identified by '123456';
: 授予了一个名为"wordpress"的用户对"wordpress"数据库的所有权限,并设置了密码为'123456'。这个用户可以从任何主机('%'表示所有主机)连接到数据库。
grant all privileges on *.* to 'root'@'%' identified by '123456';
: 授予了一个名为"root"的用户对所有数据库的所有权限,并设置了密码为'123456'。同样,这个用户可以从任何主机连接到数据库。
flush privileges;
: 刷新权限,使更改生效。
访问 http://192.168.41.31/wordpress/index.php