这里记录一下本博客由宝塔迁移至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容器了。