Docker 搭建 LNMP + WordPress(详细步骤)

一、项目模拟

1. 项目环境

2. 服务器环境

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. 项目环境

公司在实际的生产环境中,需要使用 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/

2. 服务器环境

3.任务需求

  • 使用 Docker 构建 LNMP 环境并运行 WordPress 网站平台
  • 限制 Nginx 容器最多使用 500MB 的内存和 1G 的 Swap
  • 限制 Mysql 容器写 /dev/sda 的速率为 10 MB/s
  • 将所有容器进行快照,然后将 Docker 镜像打包成 tar 包备份到本地
[root@docker ~]# systemctl disable --now firewalld [root@docker ~]# setenforce 0 setenforce: SELinux is disabled [root@docker ~]# docker pull centos:7 #从公有仓库中下载 centos7 作为系统基础镜像 [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos 7 eeb6ee3f44bd 4 weeks ago 204MB

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 <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;" ]

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.111.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.111.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork 0cbe1bd0bd782bf1c8e69916d99427970196de22deb312f970e01030406d9b45 [root@docker nginx]# docker network ls NETWORK ID NAME DRIVER SCOPE dd7a55d01f86 bridge bridge local 63ddf1e359e9 host host local 0cbe1bd0bd78 mynetwork bridge local a4b66a8a6cd2 none null local [root@docker nginx]# ifconfig docker1 docker1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.111.0.1 netmask 255.255.0.0 broadcast 172.111.255.255 ether 02:42:40:dc:e8:1d 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 

6. 启动镜像容器

[root@docker nginx]# docker run -d --name nginx -p 80:80 -m 500m --memory-swap 1g --net mynetwork --ip 172.111.0.10 nginx:lnmp 57616d4ea225c82a50b731472b003dabfd681e8dc6c6ef85a9bb2f665354334b [root@docker nginx]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 57616d4ea225 nginx:lnmp "/usr/local/nginx/sb…" 13 seconds ago Up 12 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp nginx [root@docker nginx]# docker inspect nginx ······ "IPv4Address": "172.111.0.10" ······ 

7. 验证 nginx

[root@docker nginx]# curl http://192.168.223.30:80 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> 

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 <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 REPOSITORY TAG IMAGE ID CREATED SIZE mysql lnmp 49da8f7299af 3 minutes ago 9.98GB nginx lnmp 35a6404fcfa1 17 minutes ago 522MB centos 7 eeb6ee3f44bd 4 weeks 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.111.0.20 mysql:lnmp ebafbdc1c4dcfc49406a7db8ee5a2afc54f5b4203d11ad374dba885ec4ef5afd [root@docker mysql]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ebafbdc1c4dc mysql:lnmp "/usr/sbin/init" 11 seconds ago Up 10 seconds 3306/tcp mysql 57616d4ea225 nginx:lnmp "/usr/local/nginx/sb…" 17 minutes ago Up 17 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp nginx 

6. 验证 mysql

[root@docker mysql]# docker exec -it mysql bash [root@ebafbdc1c4dc 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 2022-07-20 01:05:59 UTC; 42s ago ······ 

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 <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 

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

该配置文件模板位于安装目录的 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] 

该配置文件位于 /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 

该配置文件位于 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.111.0.30:9000 [root@docker php]# egrep -v "^;" www.conf | egrep -v "^$" [www] user = nginx group = nginx listen = 172.111.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 985842f961f1 About a minute ago 1.2GB mysql lnmp 49da8f7299af 12 minutes ago 9.98GB nginx lnmp 35a6404fcfa1 26 minutes ago 522MB centos 7 eeb6ee3f44bd 4 weeks ago 204MB 

5. 启动镜像容器

[root@docker php]# docker run -itd --name php --net mynetwork --ip 172.111.0.30 -p 9000:9000 --volumes-from nginx --volumes-from mysql php:lnmp 954d8ecdd6c7d47270fe15ce4ad6db9c4a5396f42f9d111315ecee69358a9566 [root@docker php]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 954d8ecdd6c7 php:lnmp "/bin/sh -c '/usr/lo…" 15 seconds ago Up 14 seconds 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp php ebafbdc1c4dc mysql:lnmp "/usr/sbin/init" 8 minutes ago Up 8 minutes 3306/tcp mysql 57616d4ea225 nginx:lnmp "/usr/local/nginx/sb…" 26 minutes ago Up 26 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp nginx 

6. 验证 php

[root@docker php]# docker exec -it php bash [root@954d8ecdd6c7 php-7.1.10]# ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 113028 9536 pts/0 Ss+ 06:00 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf) nginx 7 0.0 0.0 113028 5780 pts/0 S+ 06:00 0:00 php-fpm: pool www nginx 8 0.0 0.0 113028 5784 pts/0 S+ 06:00 0:00 php-fpm: pool www root 9 0.2 0.0 11828 1888 pts/1 Ss 06:01 0:00 bash root 23 0.0 0.0 51732 1728 pts/1 R+ 06:01 0:00 ps -aux 

1. mysql 授权

进入 mysql 容器

[root@ebafbdc1c4dc 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.223.30/wordpress/index.php

原文链接:https://blog.csdn.net/weixin_67470255/article/details/125884037?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168994567316782427435997%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=168994567316782427435997&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-6-125884037-null-null.268%5Ev1%5Ekoosearch&utm_term=docker%E3%80%81wordpress%E3%80%81wordpress%E5%BB%BA%E7%AB%99%E3%80%81wordpress%E4%B8%BB%E9%A2%98%E3%80%81%E5%AE%B9%E5%99%A8%E9%95%9C%E5%83%8F%E3%80%81

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享