博客网站容器化

博客网站容器化

原本的VPS是Centos 6的,系统比较老,而且不支持docker,wordpress本身就是lnmp一套走完,在宿主机上也要耗费不少时间,最近疫情肆虐,在家闲着也是闲着,着手把系统升级到7,7原生的支持docker,顺手也把网站的部署容器化。

备份

没看到网上有比较详细的资料应该怎么备份,有的说是通过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/
  2. 选择一个位置新建一个目录,用于存放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进行选择,以供测试,建议一开始先使用local\staging两个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. 本次更改后新增访问数据统计

发表评论