博客从 Ubuntu14.0 迁移到 Ubuntu24.0 流程

一、迁移目的

博客是 10年前用PHP7.0(laraval框架)在阿里云上搭建的,服务器配置 1C 2G 30G,每年 750元,费用很贵,对老用户一点优惠也没有;

二、迁移步骤

使用 Docker 进行构建应用服务和相关组件;

root@dev-server:~# cd /var/www/
root@dev-server:/var/www# ls -l
total 24
-rw-r--r--  1 root root     1129 Nov 13 17:56 docker-compose.yml
-rw-r--r--  1 root root      236 Nov 13 17:55 Dockerfile
-rw-r--r--  1 root root      236 Nov 13 17:54 Dockerfile-php78
-rw-r--r--  1 root root      461 Nov 13 17:59 nginx.conf
-rw-r--r--  1 root root      140 Nov 13 16:02 php.ini
drwxr-xr-x 15 root www-data 4096 Nov 13 16:28 road2chain
root@dev-server:/var/www#

docker-compose.yml 文件:

version: '3.8'

services:
  php:
    build: .
    image: myphp:7.0-fpm-pdo_mysql
    container_name: php7-fpm
    restart: always
    volumes:
      - ./road2chain:/var/www/html
      - ./php.ini:/usr/local/etc/php/php.ini
    working_dir: /var/www/html
    networks:
      - backend

  nginx:
    image: nginx:1.21
    container_name: nginx-php7
    restart: always
    ports:
      - "80:80"
    volumes:
      - ./road2chain:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
    networks:
      - backend

  mysql:
    image: mysql:5.7
    container_name: mysql57
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: xxxxxxx
      MYSQL_DATABASE: road2chain
    volumes:
      - /data/mysql57/conf/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
      - /data/mysql57/data:/var/lib/mysql
      - /data/mysql57/logs:/var/log/mysql
    networks:
      - backend

  redis:
    image: redis:5.0
    container_name: redis5
   # ports:
   #  - "6379:6379"   # redis不对外暴露,防止被侵入
    restart: always
    networks:
      - backend

networks:
  backend:
    driver: bridge

Dockerflie 文件(主要用来构建 mysql-pdo扩展到 php7.0-fpm 镜像)

root@dev-server:/var/www# cat Dockerfile
# 使用官方 PHP 7.0 FPM 镜像, 只能是 php7.0, 如果过高的版本 如 php7.4 就会出现语法报错;
# 使用官方 PHP 7.0 FPM 镜像
FROM php:7.0-fpm

# 安装 GD 扩展需要的依赖库(用于图像上传处理,由于 php7.0 -fpm 版本过老,所以,很难下载到匹配的gd库,这里也是折腾了很久,才找到可以下载相关依赖的库)
# 切换源到 archive,并删除 security 仓库
RUN sed -i 's/deb.debian.org/archive.debian.org/g' /etc/apt/sources.list \
 && sed -i '/security.debian.org/d' /etc/apt/sources.list \
 && sed -i '/stretch-updates/d' /etc/apt/sources.list

# 允许无 GPG 验证(因为旧源已经过期)
RUN apt-get update -o Acquire::Check-Valid-Until=false -o Acquire::Check-Date=false \
 && apt-get install -y --allow-unauthenticated \
        libpng-dev \
        libjpeg62-turbo-dev \
        libfreetype6-dev

# 配置 & 安装 GD 扩展(PHP 7.0 用旧语法)
RUN docker-php-ext-configure gd \
        --with-freetype-dir=/usr/include/ \
        --with-jpeg-dir=/usr/include/ \
 && docker-php-ext-install gd

# 安装 MySQL PDO 扩展
RUN docker-php-ext-install pdo_mysql

# 可选:拷贝自定义 php.ini
COPY php.ini /usr/local/etc/php/php.ini

# 设置工作目录
WORKDIR /var/www/html

注意:上边的镜像构建环境需要php 7.0 版本的gd库,否则无法上传处理图片;另外,需要安装pdo_mysql 扩展,否则无法连接数据库

nginx.conf 文件

root@dev-server:/var/www# cat nginx.conf
server {
    listen 80;
    server_name digtime.cn www.digtime.cn;

    root /var/www/html/public;
    index index.php index.html;

    ##
    # Basic Settings
    ## 需要添加上传文件大小,负责图片无法被上传;
    client_max_body_size 20m;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    #include /etc/nginx/mime.types;
    #default_type application/octet-stream;

    ##
    # Logging Settings
    ##
    #access_log /var/log/nginx/access.log;
    #error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##
    #gzip on;
    #gzip_disable "msie6";

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
    }

    location ~ /\.ht {
        deny all;
    }
}

php.ini 文件:


root@dev-server:/var/www# cat php.ini
date.timezone = Asia/Shanghai
memory_limit = 512M
upload_max_filesize = 50M
post_max_size = 50M
display_errors = On
error_reporting = E_ALL

构建镜像命令

# 构建含有 pdo-mysql 的php7.0 镜像,只能是 php7.0, 如果过高的版本 如 php7.8 就会出现语法报错;
docker compose build php

启动服务

cd /var/www

# 启动
docker compose up -d

# 停止
docker compose down

打印:

root@dev-server:/var/www# docker images
                                                                                                                                                                                         i Info →   U  In Use
IMAGE                     ID             DISK USAGE   CONTENT SIZE   EXTRA
myphp:7.0-fpm-pdo_mysql   1a81dd962ad4        547MB          143MB    U   
myphp:7.4-fpm-pdo_mysql   1a2f6408d898        651MB          163MB        
mysql:5.7                 f2ad209efe9c        620MB          155MB    U   
nginx:1.21                0d17b565c37b        213MB         56.7MB    U   
php:7.0-fpm               8e8644c0fd61        512MB          130MB        
php:7.4-fpm               def6bdad9c31        651MB          163MB        
redis:5.0                 a30e893aa92e        162MB         40.1MB    U   

---
查看 容器:
root@dev-server:/var/www# docker ps
CONTAINER ID   IMAGE                     COMMAND                  CREATED          STATUS          PORTS                                                    NAMES
9bbf84c4bd30   nginx:1.21                "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes   0.0.0.0:80->80/tcp, [::]:80->80/tcp                      nginx-php7
b3f5a71a2c5e   myphp:7.0-fpm-pdo_mysql   "docker-php-entrypoi…"   10 minutes ago   Up 10 minutes   9000/tcp                                                 php7-fpm
760d929f129b   redis:5.0                 "docker-entrypoint.s…"   10 minutes ago   Up 10 minutes   6379/tcp                                                 redis5
d94e0db6f948   mysql:5.7                 "docker-entrypoint.s…"   10 minutes ago   Up 10 minutes   0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp   mysql57
root@dev-server:/var/www# 

为者常成,行者常至