.
目录
LNMP架构
(1)架构
搭建一个lnmp环境,需要涉及到两个目录结构。一个是Dockerfile配置的目录结构,另一个是最终lnmp运行的目录结构。Dockerfile配置目录主要存放Dockerfile构建脚本和一些配置文件,lnmp运行目录主要存放程序运行产生的一些数据,比如mysql数据等。
以下是此次Dockerfile配置的目录结构,包括了nginx、php、mysql的配置文件。
背景
(1)项目环境
公司在实际的生产环境中,需要使用 Docker 技术在一台主机上创建 LNMP 服务并运行 Wordpress 网站平台。然后对此服务进行相关的性能调优和管理工作。
(2)所有安装包下载
nginx:
nginx:下载
MySQL:
MySQL :: MySQL 下载
PHP:
PHP: 下载
(3)任务需求
使用 Docker 构建 LNMP 环境并运行 Wordpress 网站平台
限制 Nginx 容器最多使用 500MB 的内存和 1G 的 Swap
限制 Mysql 容器写 /dev/sda 的速率为 10 MB/s
将所有容器进行快照,然后将 Docker 镜像打包成 tar 包备份到本地
Dockerfile部署LNMP
(1)关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
先自定义网络,再使用指定IP运行docker
是LNMP各组件处于同一网段
docker network create --subnet=172.20.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
这个Docker命令是用来创建一个新的自定义网络,并指定一些网络配置参数。具体分析如下:
docker network create: 这是创建一个新的Docker网络的命令。
--subnet=172.18.0.0/16: 指定网络的子网范围。这里设置为172.18.0.0开始,掩码为16位,意味着该网络支持65,536个IP地址(从172.18.0.1到172.18.255.254)。Docker会在这个子网范围内分配IP给连接到这个网络的容器。
--opt "com.docker.network.bridge.name"="docker1": 这是一个自定义网络桥接选项,用来设置网络桥接接口的名字。这里将其命名为docker1。这意味着当网络创建后,Docker会在宿主机上创建一个名为docker1的网络接口,通过这个接口容器可以与外部网络通信。这个选项允许用户自定义网络接口名称,便于管理和识别。
mynetwork: 这是新创建的网络的名称,后续可以在运行Docker容器时通过--network=mynetwork参数指定容器加入到这个网络中。
综上所述,整个命令的作用是创建一个名为mynetwork的Docker网络,该网络使用172.18.0.0/16作为子网,并且在网络桥接到宿主机时,桥接接口被命名为docker1。这样的配置为容器提供了隔离的网络环境,并允许用户通过指定的子网和网络接口名称进行更细粒度的网络管理。
Docker各组件的ip为:
此实验所需的软件有:
mysql-boost-5.7.20.tar.gz
nginx-1.22.0.tar.gz
php-7.1.10.tar.bz2
wordpress-4.9.4-zh_CN.tar.gz
构建Nginx镜像
(1) 创建nginx的工作目录
mkdir /opt/nginx
cd /opt/nginx/
上传 nginx-1.22.0.tar.gz、wordpress-4.9.4-zh_CN.tar.gz 到 /opt/nginx/ 目录中
[root@localhost nginx]# rz -E
rz waiting to receive.
[root@localhost nginx]# ls
Dockerfile nginx-1.22.0.tar.gz nginx.conf run.sh wordpress-4.9.4-zh_CN.tar.gz
编辑Dockerfile配置文件
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文件中所需要的其他配置文件
vim nginx.conf
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;
}
}
}
构建nginx镜像
docker build -t nginx:lnmp .
docker build -t nginx:lnmp .
解释:
这个Docker命令是用来构建一个新的Docker镜像的。具体说明如下:
docker build: 是用于创建一个新的Docker镜像的命令。
-t nginx:lnmp: 指定了构建完成后镜像的名称(nginx)和标签(lnmp)。这意味着新镜像将被命名为nginx:lnmp,标签lnmp可以帮助区分不同版本或配置的镜像。
.(点字符): 表示Dockerfile所在的当前目录。Docker将会在当前目录下查找名为Dockerfile的文件,该文件包含了构建镜像所需的所有指令,比如基础镜像的选择、环境变量设置、文件复制、运行安装命令等。通过这个点字符,Docker知道从哪里开始寻找上下文并执行Dockerfile中的指令来构建镜像。
综上所述,该命令的作用是从当前目录下的Dockerfile开始,根据其中定义的步骤和指令,构建一个名为nginx:lnmp的新Docker镜像。这个镜像可能是基于某个基础镜像(如官方的Nginx镜像),并根据LNMP(Linux, Nginx, MySQL, PHP)堆栈的需求进行了定制化配置。
启动Nginx容器
docker run -d --name nginx -p 80:80 -m 500m --memory-swap 1g --net mynetwork --ip 172.20.0.10 nginx:lnmp
docker run -d --name nginx -p 80:80 -v /opt/nginx/html/:/usr/local/nginx/html --net
mynetwork --ip 172.18.0.10 nginx:lnmp
解释:
这个Docker命令是用来启动一个新的容器,其中包含了几个关键参数来定制容器的运行方式。下面是这个命令的详细解析:
docker run: 命令用于启动一个新的容器。
-d: 表示后台运行容器(detached模式),即容器启动后不会直接进入命令行界面。
--name nginx: 为容器指定一个名称,这里是nginx,方便后续引用和管理。
-p 80:80: 端口映射,将宿主机的80端口映射到容器的80端口,使得外界可以通过宿主机的80端口访问到容器内的服务。
-v /opt/nginx/html/:/usr/local/nginx/html: 卷挂载,将宿主机的/opt/nginx/html/目录挂载到容器内的/usr/local/nginx/html/目录。这样,你可以直接在宿主机的对应目录修改Nginx的网页内容,而无需进入容器内部。
--net mynetwork: 指定容器加入到之前创建的名为mynetwork的自定义网络中,实现容器间的网络隔离和通信。
--ip 172.18.0.10: 为容器在加入的网络mynetwork中分配固定的IP地址172.18.0.10。这个IP必须在之前定义的子网范围内(即172.18.0.0/16内)。
nginx:lnmp: 最后一部分指定了镜像名称及标签,用于创建容器。这里使用的是名为nginx的镜像,标签为lnmp。这意味着Docker会查找名为nginx:lnmp的镜像,并以此为基础启动容器。
总结起来,这个命令会以后台模式启动一个基于nginx:lnmp镜像的容器,容器名为nginx,它将宿主机的80端口映射到容器的80端口,挂载了HTML目录以便于内容管理,并且加入了自定义网络mynetwork,且在该网络中指定了一个固定的IP地址172.18.0.10。这样的配置非常适合需要固定IP地址和网络隔离的场景。
查看
docker inspect nginx
"Networks": {
"mynetwork": {
"IPAMConfig": {
"IPv4Address": "172.20.0.10"
验证nginx
curl http://192.168.88.4:80
构建MySQL容器
(1) 创建MySQL工作目录
mkdir /opt/mysqld
cd /opt/mysqld
(2) 上传 mysql-boost-5.7.20.tar.gz 到 /opt/mysqld 目录中
[root@localhost mysql]# rz -E
rz waiting to receive.
[root@localhost mysql]# ls
mysql-boost-5.7.20.tar.gz
编写 Dockerfile
FROM centos:7
MAINTAINER this is mysql image <wl>
RUN yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake make
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_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/
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
RUN useradd -M -s /sbin/nologin mysql
RUN chown mysql:mysql /etc/my.cnf
RUN chown -R mysql:mysql /usr/local/mysql/
RUN /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"]
编写 my.cnf 配置文件
vim my.cnf
[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
构建一个新的镜像
docker build -t mysql:lnmp .
启动一个新容器
docker run --name=mysql -d --privileged -v /usr/local/mysql --net mynetwork --ip 172.20.0.20 mysql:lnmp
部署php
(容器IP 为 172.20.0.30)
mkdir /opt/php
cd /opt/php
上传 php-7.1.10.tar.bz2 到 /opt/php 目录中
vim Dockerfile
FROM centos:7
MAINTAINER this is php image <wl>
RUN yum -y install 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
RUN 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 -j4 && 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" ]
docker build -t php:lnmp .
docker run --name=php -d -p 9000:9000 --volumes-from mysql --volumes-from nginx --net mynetwork --ip 172.18.0.30 php:lnmp
构建PHP镜像
(1) 创建工作目录
mkdir /opt/php
cd /opt/php
(2)上传 php-7.1.10.tar.bz2 到 /opt/php 目录中
[root@localhost php]# ls
[root@localhost php]# rz -E
rz waiting to receive.
[root@localhost php]# ls
php-7.1.10.tar.bz2 php-fpm.conf php.ini www.conf
配置 php-fpm.conf php.ini www.conf
这里使用的直接修改好的
编写 Dockerfile
FROM centos:7
MAINTAINER this is php image <wl>
RUN yum -y install 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
RUN 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 -j4 && 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" ]
vim Dockerfile
构建一个新的镜像
docker build -t php:lnmp .
启动一个新的容器
docker run --name=php -d -p 9000:9000 --volumes-from mysql --volumes-from nginx --net mynetwork --ip 172.20.0.30 php:lnmp
启动 wordpress 服务
登录到mysql容器中,授权
docker exec -it mysql /bin/bash
mysql -uroot -p
create database wordpress;
grant all privileges on wordpress.* to 'wordpress'@'%' identified by '123456';
grant all privileges on *.* to 'root'@'%' identified by '123';
flush privileges;
解释;
这些命令是用来在MySQL数据库服务器上执行一系列操作,以设置一个新的数据库环境,特别是为WordPress准备的。下面是逐条命令的解释:
创建数据库:
这条命令创建了一个名为wordpress的新数据库,用于存储WordPress网站的所有数据,如文章、页面、用户信息等。
分配权限给WordPress用户:
这条命令创建了一个名为wordpress的MySQL用户,并为这个用户分配了对wordpress数据库的所有权限(包括查询、插入、更新、删除等)。@'%'表示这个用户可以从任意IP地址连接到数据库,密码设为123456。这对于允许WordPress应用从任何服务器位置访问数据库是必要的,但在生产环境中,出于安全考虑,通常会限制访问源IP。
分配权限给root用户:
这条命令实际上是在重新配置或确认root用户拥有对所有数据库(*.*表示任意数据库和表)的全部权限,并且允许从任意IP地址(@'%')进行连接,密码设置为123。注意:这一步骤在实际操作中需要特别小心,因为它给予了root用户极宽泛的远程访问权限,这在生产环境中是非常不安全的。通常,root用户的权限应更加严格控制,避免从公网直接访问,以减少安全风险。
登录操作