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

相关推荐
审判长烧鸡3 小时前
【AI问答/Docker】Docker全命令对照表:命令+中文+示例+示例说明
docker·ai
RisunJan3 小时前
Linux命令-nologin(用于系统账户或需要禁止交互式登录的场景)
linux·运维
倔强的石头1063 小时前
【Linux指南】Linux快捷键与系统实用技巧
linux·运维·服务器
番茄地瓜3 小时前
Linux 配置静态 IP 步骤
linux·运维·服务器
小肥君3 小时前
docker无法连接GPU资源解决方案
docker·容器·eureka
.千余4 小时前
【Linux】 传输层协议UDP:从端口号到传输机制
linux·运维·udp
viva51725 小时前
Docker/历史演进,核心功能,相关工具
docker
囚~徒~5 小时前
轻量化的虚拟机
linux·运维·服务器
SteveSenna5 小时前
Ubuntu 20.04 安装 Isaac Sim 4.5 + Isaac Lab
linux·运维·服务器
开开心心就好6 小时前
支持多显示器的Windows高效分屏工具
运维·python·科技·游戏·计算机外设·ocr·powerpoint