目录
服务器环境
任务需求
服务搭建
Nginx
Mysql
Php
启动 wordpress 服务
服务器环境
 容器    操作系统    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 包备份到本地
服务搭建
 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 <xtc>
 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;
         }
     }
 }
 4. 生成镜像
[root@docker nginx]# docker build -t nginx:lnmp .
 [root@docker nginx]# docker images
 REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
 nginx        lnmp      35a6404fcfa1   5 seconds ago   522MB
 centos       7         eeb6ee3f44bd   4 weeks ago     204MB
 5. 创建自定义网络 
[root@docker nginx]# docker network create --subnet=172.20.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
 cdc7b80633abf6c1f573528234f024f6088340475acae277d9710f0d2d5dc400
 [root@docker nginx]# docker network ls
 [root@benet23 nginx]# ifconfig docker1
 docker1: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
 6. 启动镜像容器 
[root@benet23 nginx]# docker run -d --name nginx -p 80:80 -m 500m --memory-swap 1g --net mynetwork --ip 172.20.0.10 nginx:lnmp
 24cbedd7982b1cf658cff4efd1ea75a5bfe252b6d01b2a222ed4cde63215479d
 [root@benet23 nginx]# docker ps

 [root@benet23 nginx]# docker inspect nginx

7.测试
curl http://192.168.90.10:80

Mysql
 1. 建立工作目录
[root@benet23 nginx]# mkdir /opt/mysql
 [root@benet23 nginx]# cd /opt/mysql/
 [root@benet23 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 <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"]
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
 5. 启动镜像容器 
 [root@benet23 mysql]# docker run --name=mysql -d --privileged --device-write-bps /dev/sda:10M -v /sys/fs/cgroup:/sys/fs/cgroup --net mynetwork --ip 172.20.0.20 mysql:lnmp
 [root@benet23 mysql]# docker ps -a

 6. 验证 mysql 
 [root@benet23 mysql]# docker exec -it mysql bash
 [root@e75631cda20b bin]# systemctl status mysqld
Php
 1. 建立工作目录
[root@benet23  mysql]# mkdir ../php
 [root@benet23  mysql]# cd ../php/
 [root@benet23  php]# rz -E
 rz waiting to receive.
 #传入php安装包php-7.1.10.tar.bz2
2. 编写 Dockerfile 脚本 
 [root@benet23 php]# vim Dockerfile 
  
 FROM centos:7
 MAINTAINER this is php image <xtc>
 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@benet23 php]# vim php.ini
  
 #939行,取消注释,修改
 date.timezone = Asia/Shanghai
 #1170行,修改
 mysqli.default_socket = /usr/local/mysql/mysql.sock
 [root@benet23 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 
  
 #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@benet23  php]# docker build -t php:lnmp .
 [root@benet23 php]# docker images
 5. 启动镜像容器 
[root@benet23 php]# docker run -itd --name php --net mynetwork --ip 172.20.0.30 -p 9000:9000 --volumes-from nginx --volumes-from mysql php:lnmp
 38c3d71f3e4afcf060cb471ecd9c409d7f236b651bec752139cd5fd32916ee77
 [root@benet23 php]# docker ps
 6. 验证 php 
[root@benet23 php]# docker exec -it php bash
 [root@03e251af5164 php-7.1.10]# 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.90.10/wordpress/index.php
