利用docker的LNMP

服务器环境

容器 操作系统 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 \ 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;" ]

  1. 准备 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 ![](https://file.jishuzhan.net/article/1746126733519622145/6602d3636b0cfd8f3d0c7091a0e8fe1b.webp) \[root@benet23 nginx\]# ifconfig docker1 docker1: flags=4099\ mtu 1500 ![](https://file.jishuzhan.net/article/1746126733519622145/bb37e5e0c3f881a5cda8137e33c8bf67.webp) 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 ![](https://file.jishuzhan.net/article/1746126733519622145/517677b2bcb46cd150dfc44a27851036.webp) \[root@benet23 nginx\]# docker inspect nginx ![](https://file.jishuzhan.net/article/1746126733519622145/9cb113e2011abf6060a9228a1a2d878e.webp) 7.测试 curl http://192.168.90.10:80 ![](https://file.jishuzhan.net/article/1746126733519622145/7b67f7a54ec54a59f607e17c0add6c44.webp) ### 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 \ 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"]

  1. 准备 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

  1. 生成镜像

root@docker mysql\]# docker build -t mysql:lnmp . \[root@docker mysql\]# docker images ![](https://file.jishuzhan.net/article/1746126733519622145/1825666f4de3d66b7a65fd98312b347d.webp) 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 ![](https://file.jishuzhan.net/article/1746126733519622145/9fd08d309688d0802421d3b4f8c8e9a7.webp) 6. 验证 mysql \[root@benet23 mysql\]# docker exec -it mysql bash \[root@e75631cda20b bin\]# systemctl status mysqld ![](https://file.jishuzhan.net/article/1746126733519622145/6a749f303890760f7e9cdda210f2ee85.webp) ### 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 \ 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

  1. 生成镜像

root@benet23 php\]# docker build -t php:lnmp . \[root@benet23 php\]# docker images ![](https://file.jishuzhan.net/article/1746126733519622145/a731de45589e2bfd3f9bdae996d0b39b.webp) 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 ![](https://file.jishuzhan.net/article/1746126733519622145/8838729fb6e6a3cd367806f480220625.webp) 6. 验证 php \[root@benet23 php\]# docker exec -it php bash \[root@03e251af5164 php-7.1.10\]# ps -aux ![](https://file.jishuzhan.net/article/1746126733519622145/77c076b0e55ee6b4584d785b70f30ab1.webp) ### 启动 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 ![](https://file.jishuzhan.net/article/1746126733519622145/627a06ba0926678d5386ed506f542b26.webp)

相关推荐
tonngw2 小时前
【Mac 从 0 到 1 保姆级配置教程 16】- Docker 快速安装配置、常用命令以及实际项目演示
macos·docker·容器·开源·github·docker desktop·orbstack
debug 小菜鸟4 小时前
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
docker·云计算·aws
SpikeKing4 小时前
Server - 使用 Docker 配置 PyTorch 研发环境
pytorch·docker·llm
码农101号5 小时前
Linux中shell编程表达式和数组讲解
linux·运维·服务器
powerfulzyh6 小时前
非Root用户启动SSH服务经验小结
运维·ssh
云道轩6 小时前
升级centos 7.9内核到 5.4.x
linux·运维·centos
斯普信云原生组6 小时前
Docker构建自定义的镜像
java·spring cloud·docker
爱学习的小道长6 小时前
Ubuntu Cursor升级成v1.0
linux·运维·ubuntu
2201_761199046 小时前
k8s4部署
云原生·容器·kubernetes
EelBarb6 小时前
seafile:ubuntu搭建社区版seafile12.0
linux·运维·ubuntu