博客网站容器化

文章目录


原本的VPS是Centos 6的,系统比较老,而且不原生的支持docker。最近疫情肆虐,在家闲着也是闲着,着手把系统升级到7,顺手也把网站的部署容器化。

备份

关于如何备份,查到的资料中,有的说是通过wordpress的插件,有的说是备份wordpress的完整目录,据我观察,比较关键的内容是数据库和wp-content文件夹。据我实际体验,插件会备份一堆乱七八糟的没用的东西,博客网站最重要的是内容,其次是文件,最后是样式,剩下的都不是很紧要。内容在数据库,文件和样式分别对应content和themes的设置。

  1. 备份数据库,看一下wp用的哪个database,用mysqldump -u {username} -p {passwd} --databases {db_name} > wp_db.sql保存数据库的所有数据,大括号圈住的字段是要换成自己的参数,例如mysqldump -u root -p rootpw --databases wp-db > wp_db.sql
  2. 备份wp-content下面你觉得有用的内容,不是所有都需要,uploads文件夹里面是你之前上传过的文件,我只有这个比较重要,所以我直接scp下来了。

升级系统

直接在云厂商的可视化控制台上一键升级

Docker部署wordpress以及https设置

  1. 安装docker engine以及docker compose
  • https://docs.docker.com/install/linux/docker-ce/centos/
  • https://docs.docker.com/compose/install/
  • 选择一个位置新建一个目录,用于存放docker-compose.yaml文件,需要用的几个镜像,分别是
    • mysql 5.7
    • phpmyadmin (可选,mysql的可视化控制台)
    • nginx
    • wordpress
    • https-portal (封装了https ssl证书申请服务的一个镜像)
    • portainer(可选的,这个镜像提供一个可视化的容器管理界面) 目录下新建docker-compose.yaml文件:
    version: '3'
    
    services:
       db:
         image: mysql:5.7
         container_name: mysql57
         volumes:
           - ./db-data:/var/lib/mysql
         restart: always
         environment:
           MYSQL_ROOT_PASSWORD: YOURPASSWD
           MYSQL_DATABASE: DATABASENAME
           MYSQL_USER: USER
           MYSQL_PASSWORD: PASSWD
    
       phpmyadmin:
         image: phpmyadmin/phpmyadmin:latest
         container_name: phpmyadmin
         ports:
           - "9090:80"
         environment:
           - MYSQL_USER=MYSQLUSER
           - MYSQL_PASSWORD=USERPASSWD
           - MYSQL_ROOT_PASSWORD=ROOTPASSWD
           - PMA_HOST=mysql57
         links:
           - db
    
       wordpress:
         links:
           - db
         image: wordpress:5-fpm
         volumes:
           - ./php-uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
           - ./wordpress:/var/www/html
         restart: always
         environment:
           WORDPRESS_DB_HOST: db:3306
           WORDPRESS_DB_USER: DUSER
           WORDPRESS_DB_PASSWORD: PASSWD
           WORDPRESS_DB_NAME: DBNAME
    
       web:
         image: nginx
         depends_on:
           - wordpress
         restart: always
         volumes:
           - ./nginx.conf:/etc/nginx/conf.d/default.conf
           - ./wordpress:/var/www/html
           - ./logs:/var/log/nginx
    
       https-portal:
         image: steveltn/https-portal:1
         container_name: https-portal
         depends_on:
           - web
           - phpmyadmin
         ports:
           - 80:80
           - 443:443
         restart: always
         volumes:
           - ./ssl_certs:/var/lib/https-portal
         environment:
           #DOMAINS: 'localhost -> http://web:80 #local'
           DOMAINS: 'jeffdingzone.com -> http://web:80 #staging' # Uncomment when you want to test a staging cert.
           #DOMAINS: 'jeffdingzone.com -> http://web:80 #production' # Uncomment when you are ready for production.
           CLIENT_MAX_BODY_SIZE: 64M
    
       portainer:
        image: portainer/portainer:latest
        container_name: portainer-test
        restart: always
        ports:
          - 9095:9000
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
    
    

    这里还有两个文件,nginx.confphp-uploads.ini,一个是nginx的配置文件,一个是php上传文件大小的设置文件,这个根据自己的需要进行设置。

    nginx.conf如下:

    实际的时候,fastcgi_pass这一项需要根据自己wordpress的service来设置,别的不需要改动。注意到这里没有server_name的设置。上一层实际是被https portal容器处理了,所以域名的设置放在了https portal的环境变量里。

    server {
        listen 80;
    
        root /var/www/html;
        index index.php;
    
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
    
        client_max_body_size 64M;
    
        location / {
            try_files $uri $uri/ /index.php?$args;
        }
    
        location ~ .php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+.php)(/.+)$;
            fastcgi_pass wordpress:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }
    

    php-uploads.ini文件如下,因为我有上传大文件的需要,所以值都设置的比较大,自己可以按需进行设置

    #
    # Allow larger file uploads
    #
    file_uploads = On
    memory_limit = 1024M
    upload_max_filesize = 2048M
    post_max_size = 2048M
    max_execution_time = 36000
    
    
    • 注意:https-portal镜像申请ssl证书时,使用的是Let's Encrypt网站的证书,由于资源的限制,Let's Encrypt会对每个域名的证书发放频率进行限制,详见:https://letsencrypt.org/docs/rate-limits/。因此他们提供了几个stage进行选择,以供测试,建议一开始先使用localstaging两个stage进行测试,在网站部署成功后,再改为production的stage。这里我自己就因为触发rate limit,导致一个星期之后才能使用production的stage。
    • docker-compose logs service_name可以查看特定的容器的log,用于定位问题。
    1. 最后,在当前目录执行docker-compose up -d,即可启动镜像,关闭的时候,可以执行docker-compose down,成功启动后,执行netstat -plntu查看当前有哪些端口被监听。可以看到目录下会多出几个文件夹,这几个文件夹是容器的挂载文件,用于保证关键数据的持久化,避免容器重启后,数据丢失,并且,如果以后想要迁移网站到新的服务器,只要把整个文件夹整个打包即可。
    2. 浏览器中输入网址,查看网站是否部署成功,成功后,可以将https portal的stage改为production。重启容器即可。如果启动了phpmyadmin和portainer,可以通过http://ip:9090,htt[://ip:9095端口进行查看。

    网站数据恢复

    网站数据原本已经用备份到wp_db.sql了,在部署好网站,设置好wordpress之后,两个方式恢复

    • 本地docker-compose exec mysql-service-name sh进入mysql的容器,然后mysql -u username -p passwd进mysql控制台,用source命令读入wp_db.sql,恢复数据
    • phpmyadmin,点击导入,上传sql文件或者sql文件的压缩文件

    零碎点

    1. cloudfare可以提供DNS和CDN服务,一定程度上防护网站、加快,用于设置dns和cdn,还可以进行简单的防攻击防护。普通网站选择免费套餐就够了。
    2. 本次更改后新增DB管理入口
    3. 本次更改后新增访问数据统计

    欢迎关注公众号

    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值