一、简介  

目的:使用Docker Swarm 搭建lnmp来部署WordPress

  1. 使用Dockerfile构建nginx、php镜像
  2. 将构建的镜像上传docker私有仓库
  3. 使用volume做workpress网站文件持久化(每个工作节点都要保存一份数据)
  4. 使用nfs共享存储做ngixn配置文件持久化(一份数据多个工作节点共享)
  5. mysql镜像直接从dockerhub中获取
  6. mysql的配置文件使用docker config创建(当然也可以用挂载的方式)
  7. mysql 数据使用volume数据卷持久化
  8. 启动是mysql--php--nginx

二、准备

  (1)如何创建私有仓库:http://www.cnblogs.com/bigberg/p/8821872.html   

# 已经创建好的私有库中的镜像
[root@manager ~]# curl http://172.16.60.95:5000/v2/_catalog
{"repositories":["busyboxx","nginx","php"]} # 其中nginx和php是准备要用的 

  (2)Dockerfiel文件 

 FROM centos:latest
MAINTAINER bigberg
RUN yum -y install pcre-devel openssl-devel net-tools gcc gcc-c++ zlib zlib-devel \
make openssl
ADD nginx-1.12.1.tar.gz /tmp/
RUN cd /tmp/nginx-1.12.1 \
&& ./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_realip_module \
&& make && make install ADD nginx.conf /usr/local/nginx/conf/nginx.conf RUN mkdir -p /usr/local/nginx/logs \
&& mkdir -p /usr/local/nginx/conf/vhosts \
&& groupadd -g 1001 nginx \
&& useradd -g 1001 -u 1001 -s /sbin/nologin -M nginx
RUN cat /usr/share/zoneinfo/Asia/Shanghai > /etc/localtime EXPOSE 80
EXPOSE 443
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

nginx-Dockerfile

 FROM centos:latest
MAINTAINER bigberg RUN yum -y install gcc gcc-c++ gd-devel libxml2 libxml2-devel libcurl-devel \
openssl openssl-devel curl curl-devel libjpeg libjpeg-devel libpng \
freestyle freestyle-devel pcre pcre-devel libxslt libxslt-devel bzip2 bzip2-devel
ADD php-7.2.3.tar.gz /tmp/
RUN cd /tmp/php-7.2.3 \
&& ./configure --prefix=/usr/local/php \
--with-curl --with-freetype-dir --with-gd \
--with-gettext --with-iconv-dir --with-kerberos \
--with-libdir=lib64 --with-libxml-dir --with-mysqli \
--with-openssl --with-pcre-regex --with-pdo-mysql \
--with-pdo-sqlite --with-pear --with-png-dir \
--with-jpeg-dir --with-xmlrpc --with-xsl --with-zlib \
--with-bz2 --with-mhash --enable-fpm --enable-bcmath \
--enable-libxml --enable-inline-optimization --enable-gd-native-ttf \
--enable-mbregex --enable-mbstring --enable-opcache \
--enable-pcntl --enable-shmop --enable-soap --enable-sockets \
--enable-sysvsem --enable-sysvshm --enable-xml --enable-zip \
&& make && make install \
&& cp ./sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm \
&& chmod a+x /etc/init.d/php-fpm \
&& groupadd -g 1001 www \
&& useradd -g 1001 -u 1001 www RUN cat /usr/share/zoneinfo/Asia/Shanghai > /etc/localtime
ADD php-fpm.conf /usr/local/php/etc/php-fpm.conf
ADD php.ini /usr/local/php/etc/php.ini
ADD www.conf /usr/local/php/etc/php-fpm.d/www.conf EXPOSE 9000
CMD ["/usr/local/php/sbin/php-fpm", "--nodaemonize"]

php-Dockerfile

  安装包并未提供,其余配置文件可以在下面下载:

  https://github.com/Bigberg/docker/tree/master/compose-lnmp

  (3)系统环境   

节点名称 IP 操作系统 内核版本
manager 172.16.60.95 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-01 172.16.60.96 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-02 172.16.60.97 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-03 172.16.60.98 CentOs7 4.16.1-1.el7.elrepo.x86_64
 #docker -v
Docker version 18.03.0-ce, build 0520e24

  (4)创建一个overlay网络  

# manager节点
docker network create -d overlay lnmp

  

三、部署服务

  3.1 创建mysql服务

  1)创建mysql配置文件 

[root@manager ~]# docker config create my.cnf /data/conf/my.cnf
tw5h0s7cby10x5kqhy26vn7hz
[root@manager ~]# docker config ls
ID NAME CREATED UPDATED
tw5h0s7cby10x5kqhy26vn7hz my.cnf 11 seconds ago 11 seconds ago

  简单的mysql配置文件 

[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
default-character-set = utf8
[mysql]
port = 3306
socket = /var/lib/mysql/mysql.sock
default-character-set = utf8
[mysqld]
port = 3306
basedir = /var/lib/mysql
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
character-set-server = utf8
skip-external-locking
slow-query-log = on
long_query_time = 1
slow_query_log_file = /var/lib/mysql/slow.log sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER log-error=/var/lib/mysql/mysql.log
pid-file=/var/lib/mysql/mysql.pid

  2)创建mysql服务 

[root@manager ~]# docker service create \
--name mysql \
--replicas 1 \
--network lnmp \
--config src=my.cnf,target=/etc/mysql/conf.d/my.cnf \
--mount type=volume,src=dbdata,dst=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_USER=wordpress \
-e MYSQL_PASSWORD=wp123456 \
-e MYSQL_DATABASE=wordpress \
--publish 3306:3306 \
mysql 参数:
--name: 服务名称
--replicas: 副本集个数
--network:使用的网络
--config:配置文件
--mount:挂载数据卷
MYSQL_ROOT_PASSWORD:设置mysql的root密码
MYSQL_USER:创建mysql的一个用户
MYSQL_PASSWORD:创建的用户密码
MYSQL_DATABASE:新建一个数据库实例
--publish:暴露端口

  3)查看mysql服务信息 

[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
k2nkk4dkpycb mysql replicated 1/1 mysql:latest *:3306->3306/tcp
[root@manager ~]# docker service ps mysql
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
uzzp4mpmbg59 mysql.1 mysql:latest node-01 Running Running 2 minutes ago

  4)登入mysql查看配置信息

  登入ip在4个节点中都可以,配置信息确实是docker my.cnf中设置的

  

  5)在node-01上查看持久化数据 

[root@node-01 ~]# docker volume ls
DRIVER VOLUME NAME
local dbdata

  

  mysql的数据确实已经保存在数据卷中了

  3.2 创建php服务

  1)创建服务  

[root@manager ~]# docker service create \
> --name php \
> --replicas 3 \
> --network lnmp \
> --mount type=volume,src=wwwroot,dst=/usr/local/nginx/html \
> 172.16.60.95:5000/php:v1.0.1
l0hb9efv4qckxk6ibh36vax9f
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged 参数:
--name php:服务名称
--replicas 3:副本数为3
--network lnmp:使用lnmp这个overlay网络
--mount :挂载数据卷,这个和nginx要使用的一样,方便php的fastcgi通过nginx找到文件
172.16.60.95:5000/php:v1.0.1:使用私有镜像

  2)查看服务 

[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
k2nkk4dkpycb mysql replicated 1/1 mysql:latest *:3306->3306/tcp
l0hb9efv4qck php replicated 3/3 172.16.60.95:5000/php:v1.0.1
[root@manager ~]# docker service ps php
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
p9x3eggj1up8 php.1 172.16.60.95:5000/php:v1.0.1 node-01 Running Running about a minute ago
kko40sac6twy php.2 172.16.60.95:5000/php:v1.0.1 node-02 Running Running about a minute ago
sz8q663q4gdt php.3 172.16.60.95:5000/php:v1.0.1 node-03 Running Running about a minute ago # 现在已经有两个服务mysql和 php

  

  3.3 创建nginx服务

  1)创建一个nfs共享存储

  如何创建docker nfs存储:http://www.cnblogs.com/bigberg/p/8795265.html 

# 该nfs数据卷是用来存储nginx配置文件的,省得每个节点都要做配置

# 创建目录
# mkdir -p /data/conf/lnmp_nginx # 修改nfs配置
vim /etc/exports /data/conf/lnmp_nginx 172.16.60.0/24(rw,sync,no_root_squash) # 重启nfs
# systemctl restart nfs # 挂载测试(工作节点) [root@node-03 ~]# mount -t nfs 172.16.60.95:/data/conf/lnmp_nginx /tmp
You have new mail in /var/spool/mail/root
[root@node-03 ~]# # 取消挂载 [root@node-03 ~]# umount /tmp/

  2)创建nginx服务  

[root@manager ~]# docker service create \
--name nginx \
--replicas 3 \
--network lnmp \
--publish 8888:80 \
--mount type=volume,src=wwwroot,dst=/usr/local/nginx/html \
--mount 'type=volume,src=nginx-conf,dst=/usr/local/nginx/conf/vhosts,volume-driver=local,volume-nocopy=true,volume-opt=type=nfs,volume-opt=device=172.16.60.95:/data/conf/lnmp_nginx,"volume-opt=o=addr=172.16.60.95,vers=4,soft,timeo=180,bg,tcp,rw"' \
172.16.60.95:5000/nginx:v1.0.1 参数:
--name nginx:服务名称
--replicas 3:副本数3
--network lnmp:使用lnmp这个overlay网络
--publish 8888:80:映射的端口
--mount:第一个mount为网站文件持久化使用,第二个mount持久化nginx配置文件
172.16.60.95:5000/nginx:v1.0.1:使用私有镜像

  3)查看服务

[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
k2nkk4dkpycb mysql replicated 1/1 mysql:latest *:3306->3306/tcp
q4ddyozuqguo nginx replicated 3/3 172.16.60.95:5000/nginx:v1.0.1 *:8888->80/tcp
l0hb9efv4qck php replicated 3/3 172.16.60.95:5000/php:v1.0.1
[root@manager ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
tr98r5yfo82r nginx.1 172.16.60.95:5000/nginx:v1.0.1 node-03 Running Running 29 seconds ago
mrlpj5kiixfs nginx.2 172.16.60.95:5000/nginx:v1.0.1 node-02 Running Running 30 seconds ago
pxrhvhinrhpe nginx.3 172.16.60.95:5000/nginx:v1.0.1 node-01 Running Running 30 seconds ago # 现在有3个服务,而且都已经起来了

  4)在nfs存储中添加一个nginx配置文件  

[root@manager ~]# cd /data/conf/lnmp_nginx/
[root@manager lnmp_nginx]# vim wordpress.con server { listen 80;
server_name localhost;
root html;
index index.htm index.hmtl index.php; location ~ \.php$ {
root html;
fastcgi_pass php-cgi:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
} } #因为是nfs共享存储,所以每个工作节点的nginx中vhosts中都有一个wordpress.conf # 每个工作节点的nginx 需要reload一下

  访问测试:

  

四、部署wordpress

  1)放置网站文件(所有节点操作)  

# wwwroot数据卷是放置网站文件的,但是是volume本地驱动,所以不是共享数据卷,需要在每个节点上都放置WordPress网站文件

#查看wwwroot数据卷

[root@node-03 _data]# docker volume inspect wwwroot
[
{
"CreatedAt": "2018-04-16T17:24:01+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/wwwroot/_data",
"Name": "wwwroot",
"Options": {},
"Scope": "local"
}
] # 存放位置在/var/lib/docker/volumes/wwwroot/_data # 下载WordPress压缩包
wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz # 将文件解压到wwwroot对应的文件夹中 tar -zxvf wordpress-4.9.4-zh_CN.tar.gz -C /var/lib/docker/volumes/wwwroot/_data/

  2)WordPress部署 

# 访问任意节点
http://172.16.60.96:8888/wordpress

  ①   

   

  ②用户名/密码(wordpress/wp123456)

  

  ③所有节点

  vim /var/lib/docker/volumes/wwwroot/_data/wordpress/wp-config.php

  

  ④填写信息,设置用户(admin/123456)

  

  ⑤完成登入

  

  到此部署完成

Docker Swarm应用--lnmp部署WordPress的更多相关文章

  1. 31. docker swarm 通过 service 部署 wordpress

    1. 创建 一个 overlay 的网络 driver docker network create -d overlay demo 查看网络列表 docker network ls 2. 创建mysq ...

  2. Docker swarm结合Openresty部署rabbitmq集群

    Docker swarm结合Openresty部署rabbitmq集群 大家好,年底了,年味儿越来越浓了.2019年的寒冬被定义为未来10年中最好的一年,对于这一说法悲观的人和乐观的人的理解是不一样的 ...

  3. 云计算之路-阿里云上:针对 docker swarm 故障的部署调整以及应急措施

    针对这周 docker swarm 集群的频繁故障(详见故障一 .故障二.故障三),我们今天对 docker swarm 集群的部署进行了如下调整. 将 docker engine 由  “17.12 ...

  4. Docker Swarm集群部署

    一.系统环境 1)服务器环境 节点名称 IP 操作系统 内核版本 manager 172.16.60.95 CentOs7 4.16.1-1.el7.elrepo.x86_64 node-01 172 ...

  5. Docker(二十一)-Docker Swarm集群部署

    介绍 Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令.目前,Swarm ...

  6. Docker自学纪实(四)搭建LNMP部署wordpress

    我们在工作中最常用的就是LNMP网站平台 这个架构呢,是整个公司网站的核心 如果对于访问量较小的网站,可以直接在服务器上面部署 而如果是访问量很大的网站,那负载就是个很大的问题. 要么需要再买很多服务 ...

  7. 云计算之路-阿里云上-容器难容:优化自建 docker swarm 集群的部署

    在上周六遭遇阿里云容器服务 swarm 版的故障之后,我们决定还是走自建 docker swarm 之路,只要不是阿里云底层的问题,我们相信会找到办法解决或避开自建 docker swarm 不稳定的 ...

  8. [docker swarm] 从单容器走向负载均衡部署

    背景 之前写过<<docker-compose真香>> 和<docker-compose.docker stack前世今生>两篇博客, 回顾一下思路: ① dock ...

  9. WordPress安装篇(4):YUM方式安装LNMP并部署WordPress

    YUM方式安装软件的优点就是简单.方便.快捷,本文介绍在Linux上如何使用YUM方式快速安装LNMP并部署WordPress.使用Linux CentOS 7.9 + Nginx 1.18 + My ...

随机推荐

  1. iOS中使用RNCryptor对资源文件加密(先加密后拖进项目中)

    概述:IPA 在发布时,业务相关的敏感资源文件以明文的形式存储,由于没有加密保护,这些文件在应用发布后 可能被其他人获取,并结合其他漏洞和手段产生真实攻击.所以我们要 1.在设计.开发阶段,集合业务确 ...

  2. css3 transform属性多值的顺序问题

    对于transform属性的多值的顺序问题,我自己就被困扰过.后来知道了跟顺序有关,但是不知道为什么.我想应该很多人跟我以前一样,知其然不知其所以然.如果不知道的,也许这篇文章会对大家有所帮助. 先来 ...

  3. apm server

    目录 1.apm的tomcat启动失败解决方法 2.apm的mysql修改root密码的方法 内容: 1.apm的tomcat启动失败解决方法 APMServ5.2.6 无法启动Apache的一个问题 ...

  4. 《Spring2之站立会议5》

    <Spring2之站立会议5> 昨天,接着对主界面进行代码的编写,实现了界面的美化,从图片库中调了一些图片对其进行优化: 今天,向主界面中加入语音功能部分的代码: 遇到的问题:发现虽然是调 ...

  5. Eclipse+MySQL+Tomcat web开发安装配置

    转载文章: 链接:https://blog.csdn.net/bbyyz01/article/details/78142126 1.Eclipse 这里选择Eclipse集成开发环境. 可以直接在官网 ...

  6. keil51下使用sprintf问题

    测试环境:keil c51 + STC89C52说明: 1.keil的不定参数只有15个字节也就是说sizeof(...) 加起来总共不能超过15字节,否则会出错 2.当不定参数中有常数时,你也会得不 ...

  7. spring时间管理

    spring时间管理相比Quartz要简单的多,但功能不如quartz强大 spring.xml的配置 <?xml version="1.0" encoding=" ...

  8. Java中的设计模式之单例模式

    Java中的单例模式 设计模式是软件开发过程中经验的积累 一.单例模式 1.单例模式是一种常用的软件设计模式,通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控 ...

  9. Jenkins权限控制-Role Strategy Plugin插件使用

    Role Strategy Plugin插件可以对构建的项目进行授权管理,让不同的用户管理不同的项目,将测试和生产环境分开. 具体配置方法如下(操作需要管理员用户权限). Jenkins版本:1.64 ...

  10. THREE.JS(如何想场景中添加物体对象)

    这篇主要实现向模型对象中添加头像,并组成一个矩形 一.three.js是什么? 上篇说了点TWEEN这篇又来一根THREE是不是两兄弟啊?还真有点像,当想要做3D动画的时候,可能会考虑用TWEEN的动 ...