博客搭建 | 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许可协议,转载请注明出处!
Typecho用的哪个版本啊?
目前是1.2.1
1.3.0好像发布了,但主题兼容性不是很好!
还是感觉稳定版比较好
方便管理了以后@(哈哈)