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

相关推荐
分布式存储与RustFS5 小时前
镜像仓库的层别堆本地盘:用 RustFS 给 Docker Registry 当 S3 后端
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
陈希1236 小时前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
@兽血沸腾7 小时前
Windows系统安装Jenkins部署应用至远程Windows服务器操作指南
运维·服务器·jenkins
闲云自留地12 小时前
K8s 的记忆大脑!ETCD 集群部署、etcdctl 命令与备份恢复全通关
容器·kubernetes·etcd
讯捷蓝达12 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
爱和冰阔落15 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
lisanmengmeng15 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮16 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
上火的金鱼妹16 小时前
k8s生产实际问题排查(网关,数据库读写等)
运维·服务器
孙克旭_16 小时前
k8s基础组件与创建资源
运维·docker·容器·kubernetes