这里记录一下本博客由宝塔迁移至docker容器的记录。

简单分析一下网站由哪几部分组成

本博客是是php的系统,数据库用的是mysql,然后web服务用的是nginx,通过nginx代理到php-fpm上面。

这要迁移的话,无非就需要nginx、mysql、php-fpm这三个东西。

第一步,安装docker以及docker-compose。多个容器的启动非常的繁琐,docker-compose可以让多个容器同时运行,非常的方便。用yum安装这两个东西非常方便,简单两句命令搞定安装。

yum install docker
yum install docker-compose

第二步,去docker的官网找到这几个软件的镜像。官网地址https://www.docker.com

找到对应的镜像,然后写docker-compose的配置文件。文件名为docker-compose.yml

version: "0.1"
services:
  web:
    container_name: nginx
    image: nginx
    volumes:
     - ./nginx/conf.d:/etc/nginx/conf.d    #存放配置文件
     - ./nginx/webroot:/usr/share/nginx/html   #存放网页文件
     - ./nginx/cert:/etc/nginx/cert   #存放ssl证书文件
    ports:
     - "80:80"
     - "443:443"
    environment:
     - NGINX_HOST=summerpond.cn
     - NGINX_PORT=80
    links:
     - php-fpm
  php-fpm:
    container_name: php-fpm
    build: ./php-fpm
    volumes:
     - ./nginx/webroot:/www   #该文件夹需和nginx代理的文件夹一致
    links:
     - db
  db:
    container_name: db
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    ports:
     - "3306:3306"
    volumes:
     - ./mysql/datadir:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: mysqlpassword  #指定root用户的初始密码

注意,我这里php-fpm没有直接用image从docker总仓库拿,而是使用了本地的Dockerfile文件,是因为php在拉取下来之后还需要运行命令安装对应的模块。typcho连接数据库用的pdo-mysql模块默认是没有的。但是这个php镜像提供了安装的命令,在容器生成时进行安装得在Dockerfile里面写,所以写了个Dockerfile,在启动时进行build生成容器。

mysql和nginx不需要进行额外得操作,直接拉取下来用就可以了。

简单介绍一下这些属性的作用:

image 指定镜像

volumes 将宿主机文件或文件夹挂载至容器内

links 建立网络连接,容器间的相互调用一般通过主机名进行调用

ports 将宿主机的端口和容器的端口进行映射

这里把php-fpm的Dockerfile文件也放在出来,避免踩坑,这是php安装模块的方法。

FROM php:7.3-fpm
RUN /usr/local/bin/docker-php-ext-install pdo pdo_mysql \
  && /usr/local/bin/docker-php-ext-install mysqli

这里用&&将两条命令进行连接,为什么不用两条RUN命令呢,据说是用多条RUN会增加docker打包的层级,导致容器会变大,能用一条命令尽量用一条命令。

基础的已经弄好了,现在开始写nginx的配置文件,切到刚刚映射nginx配置文件的文件夹。这里建议为一个域名对应一份配置文件,而不是全部都写在default.conf里面。配置文件写好之后重启nginx就可以了,nginx默认会引用conf.d文件夹下面的所有配置文件。

这是我的配置文件,提供参考:

server
{
    listen 80;
    listen 443 ssl http2;
    server_name www.summerpond.cn;
  
    root /usr/share/nginx/html/typecho;
    index index.html index.htm index.php;

    location ~ [^/]\.php(/|$) {
        fastcgi_pass   php-fpm:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /www/typecho/$fastcgi_script_name;
        include        fastcgi_params;
    }
  
  
    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    #HTTP_TO_HTTPS_START
    if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }
    #HTTP_TO_HTTPS_END
    ssl_certificate    cert/www.summerpond.cn/fullchain.pem;
    ssl_certificate_key    cert/www.summerpond.cn/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    error_page 497  https://$host$request_uri;

    #SSL-END
  
    #ERROR-PAGE-START  错误页配置,可以注释、删除或修改
    #error_page 404 /404.html;
    #error_page 502 /502.html;
    #ERROR-PAGE-END
  
  
    #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php$1 last;
    }
    #REWRITE-END
  

    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }
  
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        error_log off;
        access_log /dev/null;
    }
  
    location ~ .*\.(js|css)?$
    {
        expires      12h;
        error_log off;
        access_log /dev/null; 
    }
}

由于本博客是https的,需要将两个证书文件配进去,非https可以去掉这一部分的配置。

配置文件配好了之后nginx基本没什么大问题,nginx如果启动不了肯定是配置文件有问题。

配好了之后可以运行一下试试了

docker-compose up -d //创建并运行容器
docker ps -a   //查看容器运行状态
docker logs {image}  //查看容器的日志
docker-compose down //停止并删除容器

访问网站进去可以看到主页或者typecho的报错,证明nginx和php-fpm的配置没有问题。

接下来可以导入数据库的数据了,进宝塔将数据库的数据进行导出,宝塔的数据库管理页面貌似依赖于它自带的nginx,得先关了刚刚启动好的docker nginx容器。服务器开放3306端口,云服务器开放安全组,用Navicat连接至数据库。创建typecho数据库,将刚刚导入的sql执行。一般没有太大问题,数据导入之后网站应该可以正常访问了。

现在可以关掉宝塔的所有服务,直接docker-compose up -d运行docker容器了。

Q.E.D.