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

  1. 编写 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;" ]

  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;

}

}

}

  1. 生成镜像

[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

  1. 创建自定义网络

[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

  1. 启动镜像容器

[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

  1. 编写 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"]

  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

  1. 启动镜像容器

[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

  1. 验证 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

  1. 编写 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

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

  1. 启动镜像容器

[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

  1. 验证 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)

  1. 浏览器访问测试

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

相关推荐
PythonFun18 分钟前
自建RustDesk服务器:详细步骤与操作指南
运维·服务器
可涵不会debug22 分钟前
【Linux】信号知识三把斧——信号的产生、保存和处理
linux·运维·信号
facaixxx202424 分钟前
京东云主机怎么用?使用京东云服务器建网站(图文教程)
运维·服务器·京东云
jyan_敬言24 分钟前
【Linux】Linux命令与操作详解(一)文件管理(文件命令)、用户与用户组管理(创建、删除用户/组)
linux·运维·服务器·c语言·开发语言·汇编·c++
程序那点事儿1 小时前
k8s 之安装busybox
云原生·容器·kubernetes
-$_$-1 小时前
【黑马点评】 使用RabbitMQ实现消息队列——1.Docker与RabbitMQ环境安装
分布式·docker·rabbitmq
芯的一天1 小时前
windows下DockerDesktop命令行方式指定目录安装
windows·docker
学思之道2 小时前
给Linux操作系统命令取个别名
linux·运维·经验分享·学习方法
dong_beijing2 小时前
GO语言工程构建示例-mac和linux适用
linux·运维·服务器
先生沉默先2 小时前
Unity WebGL使用nginx作反向代理处理跨域,一些跨域的错误处理(添加了反向代理的配置依旧不能跨域)
运维·nginx·webgl