• Docker Swarm应用--lnmp部署WordPress


    一、简介  

    目的:使用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文件 

     1 FROM centos:latest
     2 MAINTAINER bigberg
     3 RUN yum -y install pcre-devel openssl-devel net-tools gcc gcc-c++ zlib zlib-devel 
     4     make openssl
     5 ADD nginx-1.12.1.tar.gz /tmp/
     6 RUN cd /tmp/nginx-1.12.1 
     7     && ./configure --prefix=/usr/local/nginx 
     8      --with-http_ssl_module 
     9      --with-http_gzip_static_module 
    10      --with-http_realip_module 
    11     && make && make install
    12 
    13 ADD nginx.conf /usr/local/nginx/conf/nginx.conf
    14 
    15 RUN mkdir -p /usr/local/nginx/logs 
    16     && mkdir -p /usr/local/nginx/conf/vhosts 
    17     && groupadd -g 1001 nginx 
    18     && useradd -g 1001 -u 1001 -s /sbin/nologin -M nginx
    19 RUN cat /usr/share/zoneinfo/Asia/Shanghai > /etc/localtime
    20 
    21 EXPOSE 80
    22 EXPOSE 443
    23 CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
    nginx-Dockerfile
     1 FROM centos:latest
     2 MAINTAINER bigberg
     3 
     4 RUN yum -y install gcc gcc-c++ gd-devel libxml2 libxml2-devel libcurl-devel 
     5     openssl openssl-devel curl curl-devel libjpeg libjpeg-devel libpng  
     6     freestyle freestyle-devel pcre pcre-devel libxslt libxslt-devel bzip2 bzip2-devel
     7 ADD php-7.2.3.tar.gz /tmp/
     8 RUN cd /tmp/php-7.2.3 
     9     && ./configure --prefix=/usr/local/php 
    10     --with-curl --with-freetype-dir --with-gd 
    11     --with-gettext --with-iconv-dir --with-kerberos 
    12     --with-libdir=lib64 --with-libxml-dir --with-mysqli 
    13     --with-openssl --with-pcre-regex --with-pdo-mysql 
    14     --with-pdo-sqlite --with-pear --with-png-dir 
    15     --with-jpeg-dir --with-xmlrpc --with-xsl --with-zlib 
    16     --with-bz2 --with-mhash --enable-fpm --enable-bcmath 
    17     --enable-libxml --enable-inline-optimization --enable-gd-native-ttf 
    18     --enable-mbregex --enable-mbstring --enable-opcache 
    19     --enable-pcntl --enable-shmop --enable-soap --enable-sockets 
    20     --enable-sysvsem --enable-sysvshm --enable-xml --enable-zip 
    21     && make && make install 
    22     && cp ./sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm 
    23     && chmod a+x /etc/init.d/php-fpm 
    24     && groupadd -g 1001 www 
    25     && useradd -g 1001 -u 1001 www
    26 
    27 RUN cat /usr/share/zoneinfo/Asia/Shanghai > /etc/localtime
    28 ADD php-fpm.conf /usr/local/php/etc/php-fpm.conf
    29 ADD php.ini /usr/local/php/etc/php.ini
    30 ADD www.conf /usr/local/php/etc/php-fpm.d/www.conf
    31 
    32 EXPOSE 9000
    33 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)

      

      ⑤完成登入

      

      到此部署完成

  • 相关阅读:
    Asp.Net Core 进阶(一) —— 读取appsettings.json
    chrome控制台模拟hover、focus、active等状态,方便调试
    windows server 注意windows的temp目录
    (转)大公司里怎样开发和部署前端代码?
    排序算法——二分插入排序
    排序算法——归并排序
    排序算法——冒泡排序
    排序算法——插入排序
    排序算法——快速排序
    linux安装和配置 mysql、redis 过程中遇到的问题记录
  • 原文地址:https://www.cnblogs.com/bigberg/p/8855144.html
Copyright © 2020-2023  润新知