MENU

博客搭建 | Docker-Compose部署

前言

在所有操作之前,应当做好备份
用来记录部署过程,同时为后来的人留下一点儿可借鉴的东西

步骤

以下内容全部在Debian 12,架构为x86_64的服务器上进行(架构可以使用arch命令进行查看)

其他系统的服务器一般不会有太大的问题,如果有问题可以在下面留言,我尽力提供帮助

安装Docker

使用下面这个命令即可

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

国内的服务器请使用这个: Docker在国内已经无法访问,请查看这篇文章

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun

安装完成后,可以用这个命令来验证是否安装成功:

docker -v

如果输出类似于Docker version 24.0.7, build afdd53b则安装成功

安装Docker-Compose

可以在这里找到最新的版本,截至2024年1月19日最新版本为2.24.1,请自行寻找对应版本的链接

值得注意的是,网上有些教程提供的位置是/usr/local/bin/docker-compose,但是在我实际部署情况中是我下面提到的位置,如果我提供的位置有误,还请自行替换
# 下载docker-compose可执行文件
curl -L "https://github.com/docker/compose/releases/download/v2.24.1/docker-compose-linux-x86_64" -o /usr/bin/docker-compose
# 添加执行权限
sudo chmod +x /usr/bin/docker-compose

验证安装

docker-compose --version

如果输出类似于Docker Compose version v2.24.1则安装成功

部署Typecho

在自己喜欢的位置下面创建一个目录

# 这个命令在data不存在时,会同时创建 /data 和 /data/blog
mkdir -p /data/blog

然后在这个目录下面创建以下内容

.
├── docker-compose.yml
├── logs
├── mysql
├── mysql.env
├── nginx
│   └── default.conf
├── php
│   └── Dockerfile
└── typecho

./docker-compose.yml

version: "3"

services:
  nginx:
    image: nginx:1.22.0
    ports:
      - "8001:80"
    restart: always
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./typecho:/var/www/html
      - ./nginx:/etc/nginx/conf.d
      - ./logs:/var/log/nginx
    depends_on:
      - php
    networks:
      - web

  php:
    build: php
    restart: always
    expose:
      - "9000"
    volumes:
      - ./typecho:/var/www/html
    environment:
      - TZ=Asia/Shanghai
    depends_on:
      - mysql
    networks:
      - web

  mysql:
#   mysql的版本可以根据自己的喜欢去替换,内存大于或等于8GB的服务器可以使用8.0
    image: mysql:5.7
    restart: always
    environment:
      - TZ=Asia/Shanghai
    expose:
      - "3306"
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/logs:/var/log/mysql
      - ./mysql/conf:/etc/mysql/conf.d
    env_file:
      - mysql.env
    networks:
      - web

networks:
  web:

./mysql.env

MYSQL_ROOT_PASSWORD=root_password
MYSQL_DATABASE=blog
MYSQL_USER=username
MYSQL_PASSWORD=user_password

./php/Dockerfile

FROM php:7.4-fpm-buster

RUN apt-get update \
  && docker-php-ext-install pdo_mysql \
  && echo "output_buffering = 4096" > /usr/local/etc/php/conf.d/php.ini \
  && echo "date.timezone = PRC" >> /usr/local/etc/php/conf.d/php.ini

./nginx/default.conf

这里我是使用前置服务器上的宝塔面板进行反代的,并且将ssl也放置于上面,如果你想要本机实现的话可以看看下面这个配置文件;要注意的是当你在使用宝塔的时候,前端和后端的nginx版本必须要保持一致

本机实现

server {
    listen 80;
    server_name your_domain.com www.your_domain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name your_domain.com www.your_domain.com;

    ssl_certificate /path/to/your/certificate.crt;
    ssl_certificate_key /path/to/your/private.key;

    # Other SSL settings...

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

    access_log /var/log/nginx/typecho_access.log main;

    location / {
        index index.html index.htm index.php;
        if (!-e $request_filename) {
            rewrite ^(.*)$ /index.php$1 last;
        }
    }

    location ~ \.php(.*)$ {
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
        fastcgi_param  PATH_INFO  $fastcgi_path_info;
        fastcgi_param  SCRIPT_NAME $fastcgi_script_name;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

server {
  listen 80 default_server;
  root /var/www/html;
  index index.php;

  access_log /var/log/nginx/typecho_access.log main;
  if (!-e $request_filename) {
      rewrite ^(.*)$ /index.php$1 last;
  }
  location / {
      index index.html index.htm index.php;

      if (!-e $request_filename) {
          rewrite . /index.php last;
      }
  }

  location ~ \.php(.*)$ {
      fastcgi_pass   php:9000;
      fastcgi_index  index.php;
      fastcgi_param  PATH_TRANSLATED $document_root$fastcgi_path_info;
      fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
      fastcgi_param  PATH_INFO  $fastcgi_path_info;
      fastcgi_param  SCRIPT_NAME $fastcgi_script_name;
      fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
      include        fastcgi_params;
  }
}

./typecho

Typecho博客的目录文件放置于这个目录下面

启动与更新

需要在docker-compose.yml所在目录下面进行

# 启动
docker-compose up -d
# 停止
docker-compose stop
# 更新并启动
docker-compose pull
docker-compose up -d

一些问题

无法上传图片

从别人那里找到的解决方案

sudo chmod -R 777 /path/to/typecho/usr/uploads

数据库无法连接

由普通的部署方式改为部署到docker-compose
需要将./typecho/config.inc.php里面的'host' => 'localhost'修改为'host' => 'mysql'
如图所示

当你使用这个方法来部署新的博客时,数据库地址那里也应该使用mysql

数据库的导入与导出

mysql.env里面设置的root密码,以下简称密码

导入

# 先查看mysql容器id
docker ps
# 将需要导入的数据库拷贝到容器里面,/path/backup.sql是本地服务器上文件的位置,/in.sql是容器里面文件的位置
docker cp /path/backup.sql <container_id>:/in.sql
# 然后进入容器里面
docker exec -it <container_id> bash
# 登入mysql并导入数据,根据提示输入密码
mysql -u root -p
# 在mysql终端里面执行
mysql>use blog
mysql>source /in.sql
# 确认导入成功,退出mysql终端之后可以在容器里面使用rm in.sql来删除多余的文件

导出

# 先查看mysql容器id
docker ps
# 然后进入容器里面
docker exec -it <container_id> bash
# 登入mysql并导出数据,根据提示输入密码,/out.sql是容器里面文件的位置
mysqldump -uroot -p --databases blog >/out.sql
# 将需要导出的数据库拷贝到服务器里面,/path/backup.sql是本地服务器上文件的位置
docker cp <container_id>:/out.sql /path/backup.sql
# 确认备份成功,退出mysql终端之后可以在容器里面使用rm out.sql来删除多余的文件

迁移

直接将整个目录复制到新的服务器上之后,docker-compose up -d即可

binlog日志文件过大

2024年7月12日补充:最近备份博客时发现内容越来越多,发现binlog文件占用了特别多的空间

./mysql/conf/my.cnf

[mysqld]
#设置日志保留天数
expire_logs_days=7
#设置日志文件最大大小
max_binlog_size=100M

然后重新启动即可

本文作者:P3ter
本文标题:《博客搭建 | Docker-Compose部署》
本文链接:https://p3ter.me/posts/docker_compose_build_blog.html
版权声明:本博客文章均采用CC BY-NC-SA 4.0许可协议,转载请注明出处!

最后编辑于: 2024 年 07 月 12 日
返回文章列表 文章二维码
本页链接的二维码
打赏二维码
添加新评论

验证码:

已有 5 条评论
  1. Typecho用的哪个版本啊?

    1. @Teacher Du目前是1.2.1

    2. @P3ter1.3.0好像发布了,但主题兼容性不是很好!

    3. @Teacher Du还是感觉稳定版比较好

  2. 方便管理了以后@(哈哈)