Dockerfile搭建LNMP运行Wordpress平台

Dockerfile搭建LNMP运行Wordpress平台

  • 一、项目
    • 1.1 项目环境
    • 1.2 服务器环境
    • 1.3 任务需求
  • 二、Linux 系统基础镜像
  • 三、Nginx
    • 1、建立工作目录
    • 2、编写 Dockerfile 脚本
    • 3、准备 nginx.conf 配置文件
    • 4、生成镜像
    • 5、创建自定义网络
    • 6、启动镜像容器
    • 7、验证 nginx
  • 四、Mysql
    • 1、建立工作目录
    • 2、编写 Dockerfile
    • 3、准备 my.cnf 文件
    • 4、生成镜像
    • 5、启动镜像容器
    • 6、验证 mysql
  • 五、Php
    • 1、建立工作目录
    • 2、编写 Dockerfile 脚本
    • 3、准备 php.ini、php-fpm.conf、www.conf 配置文件
      • 3.1 php.ini
      • 3.2 php-fpm.conf
      • 3.3 www.conf
    • 4、生成镜像
    • 5、启动镜像容器
    • 6、验证 php
  • 六、启动 wordpress 服务
    • 1、mysql 授权
    • 2、浏览器访问测试

一、项目

1.1 项目环境

公司在实际的生产环境中,需要使用 Docker 技术在一台主机上创建 LNMP 服务并运行 Wordpress 网站平台。然后对此服务进行相关的性能调优和管理工作。

所有安装包下载:

wget http://101.34.22.188/lnmp_wordpress/mysql-boost-5.7.20.tar.gz
wget http://101.34.22.188/lnmp_wordpress/nginx-1.12.0.tar.gz
wget http://101.34.22.188/lnmp_wordpress/php-7.1.10.tar.bz2
wget http://101.34.22.188/lnmp_wordpress/wordpress-4.9.4-zh_CN.tar.gz
> 或者
wget -r -np http://101.34.22.188/lnmp_wordpress/

1.2 服务器环境

容器 操作系统 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

1.3 任务需求

使用 Docker 构建 LNMP 环境并运行 Wordpress 网站平台

限制 Nginx 容器最多使用 500MB 的内存和 1G 的 Swap

限制 Mysql 容器写 /dev/sda 的速率为 10 MB/s

将所有容器进行快照,然后将 Docker 镜像打包成 tar 包备份到本地

二、Linux 系统基础镜像

systemctl disable --now firewalld
setenforce 0

docker pull centos:7		#从公有仓库中下载 centos7 作为系统基础镜像
docker images

Dockerfile搭建LNMP运行Wordpress平台_第1张图片

三、Nginx

1、建立工作目录

[root@docker ~]# mkdir /opt/nginx
[root@docker ~]# cd /opt/nginx
[root@docker nginx]# rz -E
rz waiting to receive.
#上传 nginx 安装包 nginx-1.12.0.tar.gz
[root@docker nginx]# rz -E
rz waiting to receive.
#上传 wordpress 服务包 wordpress-4.9.4-zh_CN.tar.gz

在这里插入图片描述

2、编写 Dockerfile 脚本

[root@docker nginx]# vim Dockerfile

FROM centos:7
MAINTAINER this is nginx image 
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;" ]

3、准备 nginx.conf 配置文件

[root@docker nginx]# ls
Dockerfile  nginx-1.12.0.tar.gz  nginx.conf  wordpress-4.9.4-zh_CN.tar.gz
[root@docker nginx]# egrep -v "^(.)*#(.)*$" nginx.conf | grep -v "^$"
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;
        }
    }
}

Dockerfile搭建LNMP运行Wordpress平台_第2张图片

4、生成镜像

[root@docker nginx]# docker build -t nginx:lnmp .
[root@docker nginx]#docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx        lnmp      5a0e0043669b   35 seconds ago   598MB
centos       7         eeb6ee3f44bd   23 months ago    204MB

Dockerfile搭建LNMP运行Wordpress平台_第3张图片

5、创建自定义网络

[root@docker nginx]# docker network create --subnet=172.20.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
790d9ac4da077b7b5d37738f500554f145190363eb9dee49a75330c344941393
[root@docker nginx]#  docker network ls
NETWORK ID     NAME        DRIVER    SCOPE
5e8ef229859a   bridge      bridge    local
ef6adc314f24   host        host      local
de756c384380   mynetwork   bridge    local
d06f318f929d   none        null      local
[root@docker nginx]# ifconfig docker1
docker1: flags=4099  mtu 1500
        inet 172.20.0.1  netmask 255.255.0.0  broadcast 172.20.255.255
        ether 02:42:03:a1:95:19  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

Dockerfile搭建LNMP运行Wordpress平台_第4张图片

6、启动镜像容器

[root@docker nginx]#  docker run -d --name nginx -p 80:80 -m 500m --memory-swap 1g --net mynetwork --ip 172.20.0.10 nginx:lnmp
41442cbff5029e002412a3df6d7b0af20ca1558c15dee36f12777008cb9308c5
[root@docker nginx]# docker ps
CONTAINER ID   IMAGE        COMMAND                   CREATED          STATUS          PORTS                               NAMES
1b5245030e46   nginx:lnmp   "/usr/local/nginx/sb…"   16 seconds ago   Up 15 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx
[root@docker nginx]#  docker inspect nginx

7、验证 nginx

[root@docker nginx]#  curl http://192.168.174.15:80



Welcome to nginx!



Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

Dockerfile搭建LNMP运行Wordpress平台_第5张图片

四、Mysql

1、建立工作目录

[root@docker nginx]#  mkdir /opt/mysql
[root@docker nginx]#  cd /opt/mysql/
[root@docker mysql]# rz -E
rz waiting to receive.
#传入mysql安装包mysql-boost-5.7.20.tar.gz

2、编写 Dockerfile

[root@docker mysql]# vim Dockerfile 

FROM centos:7
MAINTAINER this is mysql image 
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"]

3、准备 my.cnf 文件

[root@docker mysql]# 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

4、生成镜像

[root@docker mysql]# docker build -t mysql:lnmp .
[root@docker mysql]# docker images                                                                           REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx        lnmp      d4fe3c888a2d   3 minutes ago    598MB
mysql        lnmp      7f0f3a49d67e   14 minutes ago   10.1GB
centos       7         eeb6ee3f44bd   23 months ago    204MB

5、启动镜像容器

[root@docker 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
a2caf0708e3993407b81855b16826d7ffd59063b251a189c803a0a51afff5553
[root@docker mysql]#  docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                     PORTS      NAMES
a2caf0708e39   mysql:lnmp     "/usr/sbin/init"          56 seconds ago   Up 46 seconds              3306/tcp   mysql
1b5245030e46   5a0e0043669b   "/usr/local/nginx/sb…"   51 minutes ago   Exited (0) 7 minutes ago              nginx

6、验证 mysql

[root@docker mysql]# docker exec -it mysql bash
[root@31ca97f27c93 bin]#  systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: activating (start) since Sun 2023-08-20 12:34:12 UTC; 57s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 70 ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/usr/local/mysql/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
  Process: 49 ExecStartPre=/usr/local/mysql/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
   CGroup: /docker/31ca97f27c93b75d223f478d4fc4fa8617fa486caf18036a03253cd5d133edbb/system.slice/mysqld.service
           └─72 /usr/local/mysql/bin/mysqld --daemonize --pid-file=/usr/local/mysql/mysqld.pid

五、Php

1、建立工作目录

[root@docker  mysql]# mkdir ../php
[root@docker  mysql]# cd ../php/
[root@docker  php]# rz -E
rz waiting to receive.
#传入php安装包php-7.1.10.tar.bz2

2、编写 Dockerfile 脚本

[root@docker php]# vim Dockerfile 

FROM centos:7
MAINTAINER this is php image 
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

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

3.1 php.ini

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

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

[root@docker php]# egrep -v "^;" php.ini | egrep -v "^$"
[PHP]
engine = On
short_open_tag = Off
precision = 14
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = -1
disable_functions =
disable_classes =
zend.enable_gc = On
expose_php = On
max_execution_time = 30
max_input_time = 60
memory_limit = 128M
error_reporting = E_ALL
display_errors = On
display_startup_errors = On
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = On
html_errors = On
variables_order = "GPCS"
request_order = "GP"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 8M
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
default_charset = "UTF-8"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
upload_max_filesize = 2M
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
[CLI Server]
cli_server.color = On
[Date]
date.timezone = Asia/Shanghai
[filter]
[iconv]
[intl]
[sqlite3]
[Pcre]
[Pdo]
[Pdo_mysql]
pdo_mysql.cache_size = 2000
pdo_mysql.default_socket=
[Phar]
[mail function]
SMTP = localhost
smtp_port = 25
mail.add_x_header = On
[SQL]
sql.safe_mode = Off
[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1
[Interbase]
ibase.allow_persistent = 1
ibase.max_persistent = -1
ibase.max_links = -1
ibase.timestampformat = "%Y-%m-%d %H:%M:%S"
ibase.dateformat = "%Y-%m-%d"
ibase.timeformat = "%H:%M:%S"
[MySQLi]
mysqli.max_persistent = -1
mysqli.allow_persistent = On
mysqli.max_links = -1
mysqli.cache_size = 2000
mysqli.default_port = 3306
mysqli.default_socket = /usr/local/mysql/mysql.sock
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off
[mysqlnd]
mysqlnd.collect_statistics = On
mysqlnd.collect_memory_statistics = On
[OCI8]
[PostgreSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
[bcmath]
bcmath.scale = 0
[browscap]
[Session]
session.save_handler = files
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.sid_length = 26
session.trans_sid_tags = "a=href,area=href,frame=src,form="
session.sid_bits_per_character = 5
[Assertion]
zend.assertions = 1
[COM]
[mbstring]
[gd]
[exif]
[Tidy]
tidy.clean_output = Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
soap.wsdl_cache_limit = 5
[sysvshm]
[ldap]
ldap.max_links = -1
[mcrypt]
[dba]
[opcache]
[curl]
[openssl]

3.2 php-fpm.conf

该配置文件位于 /usr/local/php/etc/php-fpm.conf.default

[root@docker php]# vim php-fpm.conf.default

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

[root@docker php]# egrep -v "^;" php-fpm.conf | egrep -v "^$"
[global]
pid = run/php-fpm.pid
include=/usr/local/php/etc/php-fpm.d/*.conf

3.3 www.conf

该配置文件位于 usr/local/php/etc/php-fpm.d/www.conf.default

[root@docker php]# vim www.conf 
#23、24行,修改用户和组
user = nginx
group = nginx
#36行,修改监听IP和端口为容器IP:9000端口
listen = 172.20.0.30:9000

[root@docker php]# egrep -v "^;" www.conf | egrep -v "^$"
[www]
user = nginx
group = nginx
listen = 172.20.0.30:9000
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

4、生成镜像

[root@docker  php]# docker build -t php:lnmp .
[root@docker php]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
php          lnmp      10515f9b4707   About a minute ago   1.35GB
mysql        lnmp      cd27f2be29d9   21 minutes ago       10.1GB
nginx        lnmp      29a24033b897   2 hours ago          598MB
centos       7         eeb6ee3f44bd   23 months ago        204MB

5、启动镜像容器

[root@docker php]# docker run -itd --name php --net mynetwork --ip 172.20.0.30 -p 9000:9000 --volumes-from nginx --volumes-from mysql php:lnmp
3ae8287681c9b5db297a3ce92c8fb9dfacda9dbdb1d80cfe5930208f46a03037
[root@docker php]# docker ps
CONTAINER ID   IMAGE        COMMAND                   CREATED             STATUS             PORTS                               NAMES
31ca97f27c93   mysql:lnmp   "/usr/sbin/init"          20 minutes ago      Up 20 minutes      3306/tcp                            mysql
79f03202741d   nginx:lnmp   "/usr/local/nginx/sb…"   About an hour ago   Up About an hour   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx

6、验证 php

[root@docker php]# docker exec -it php bash
[root@03e251af5164 php-7.1.10]# ps -aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1 113028  7516 pts/0    Ss+  14:41   0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
nginx         7  0.0  0.0 113028  3768 pts/0    S+   14:41   0:00 php-fpm: pool www
nginx         8  0.0  0.0 113028  3768 pts/0    S+   14:41   0:00 php-fpm: pool www
root          9  0.1  0.0  11828  1876 pts/1    Ss   14:57   0:00 bash
root         23  0.0  0.0  51732  1728 pts/1    R+   14:57   0:00 ps -aux

六、启动 wordpress 服务

1、mysql 授权

进入 mysql 容器

[root@e75631cda20b bin]# mysql -u root -p
Enter password: 
#初始密码为空
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 '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

2、浏览器访问测试

访问 http://192.168.174.15/wordpress/index.php

Dockerfile搭建LNMP运行Wordpress平台_第6张图片

你可能感兴趣的:(docker,容器,运维,数据库,云计算)