前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CentOS 7 使用 docker 安装 typecho 博客系统

CentOS 7 使用 docker 安装 typecho 博客系统

作者头像
savokiss
修改2021-01-08 20:53:35
2.3K0
修改2021-01-08 20:53:35
举报
文章被收录于专栏:码力全开

前言

我的博客 https://savokiss.com 用的是 typecho,一直使用的是 阿里云ECS 直接安装的 MySQL 和 PHP,由于买的时间比较早,当时用的是 CentOS 6.5。后来想玩 docker,发现 docker 只支持 CentOS 7+,加上之前的系统上东西太乱了,所以这次有时间就将数据库和 typecho 源码备份了一下,然后换了一个纯净的 CentOS 7.6 的镜像。由于我买的 ECS 是 1CPU 1GB 内存,之前还一直担心跑不起来 docker,这次升级完之后发现完全没问题,内存用了一半都不到哈~于是记录下这个过程,说不定可以帮到其他小伙伴。

升级系统,建议备份好数据,由于我的 ECS 上面主要就一个博客,所以直接用全新的镜像,安装完后啥都木有,当然也可以直接将快照创建为自定义镜像,然后升级系统的时候选择即可该快照即可。

本人也是 docker 小白,如果对 docker 不熟悉,可以先看笔者的另一篇文章:

写给前端工程师的 docker 入门

下面开搞:

配置新用户

如果想要用非 root 用户执行 docker 命令,请参考此步骤。 新增的用户名叫 savokiss。 下面的命令使用 root 执行。

添加用户

代码语言:javascript
复制
useradd savokiss

修改密码

代码语言:javascript
复制
passwd savokiss

加入 sudo 权限

代码语言:javascript
复制
visudo

找到下面两行,将新用户写入,如:

代码语言:javascript
复制
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
savokiss ALL=(ALL) ALL

创建 docker 用户组

代码语言:javascript
复制
groupadd docker

将新用户加入 docker 组

代码语言:javascript
复制
usermod -aG docker savokiss

让变更生效:

代码语言:javascript
复制
newgrp docker

然后用户 savokiss 执行 docker 命令时就不用加 sudo 了

安装 docker

以下命令均以 root 用户执行

下载安装依赖包

代码语言:javascript
复制
yum install -y yum-utils device-mapper-persistent-data lvm2

添加国内 yum 源

代码语言:javascript
复制
yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

更新缓存,安装 docker-ce

代码语言:javascript
复制
yum makecache fast
yum install docker-ce

启动 docker

代码语言:javascript
复制
systemctl enable docker
systemctl start docker

docker run hello-world

hello-world 是官方的测试镜像。

国内镜像源加速

如果启动失败的话可以更换为 daocloud 的 docker 源,然后重新 run:

代码语言:javascript
复制
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

也可以直接修改 /etc/docker/daemon.json 中的 registry(文件不存在就新建一个)

代码语言:javascript
复制
{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ]
}

修改后重启服务

代码语言:javascript
复制
systemctl daemon-reload
systemctl restart docker

如果能看到以下界面,就说明 hello world 成功咯:

代码语言:javascript
复制
$ docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:be0cd392e45be79ffeffa6b05338b98ebb16c87b255f48e297ec7f98e123905c
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

配置容器

这里主要获取 nginx@1.16.1、mysql@5.7、php@7.2 三个镜像,如有需要可以自行修改版本号。

获取 MySQL 镜像

代码语言:javascript
复制
docker pull mysql:5.7

创建容器 main_mysql

代码语言:javascript
复制
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name main_mysql mysql:5.7

参数说明:

  • -d 代表 daemon,即后台运行
  • -p 是设置宿主机和容器的端口号
  • -e 设置 mysql 密码
  • —name 给当前 container 起一个名字

获取 PHP 镜像

代码语言:javascript
复制
docker pull php:7.2-fpm

创建容器 main_phpfpm

代码语言:javascript
复制
docker run -d -v /home/savokiss/www:/var/www/html -p 9000:9000 --link main_mysql:mysql --name main_phpfpm php:7.2-fpm

参数说明:

  • -v 代表 volumes,即挂载宿主机和容器的目录映射
  • —link 代表链接外部 container,本例中即 main_mysql
测试目录映射

先进到容器内部:

代码语言:javascript
复制
docker exec -it main_phpfpm /bin/bash

这句话简单来说就是将容器中的 /bin/bash 连接到你当前的命令行,相当于进入容器中执行命令。

执行完后会进入容器的 /var/www/html 然后来创建个文件:

代码语言:javascript
复制
touch test.php
exit

然后在宿主机中的 /home/savokiss/www 目录下就会发现一个 test.php,说明映射目录成功啦~

PHP 扩展安装

由于 typecho 需要使用 mysql pdo。再次用上面的命令进入 main_phpfpm 容器,然后执行:

代码语言:javascript
复制
docker-php-ext-install pdo_mysql

然后执行 php -m 就可以看到已经安装的扩展

获取 nginx 镜像

代码语言:javascript
复制
docker pull nginx:1.16.1

创建 nginx 容器

代码语言:javascript
复制
docker run -d -p 80:80 -p 443:443 --name main_nginx -v /home/savokiss/www:/var/www/html -v /home/savokiss/conf/nginx:/etc/nginx/conf.d --link main_phpfpm:phpfpm --name main_nginx nginx:1.16.1

这里由于网站配置了 https,所以需要打开 443 端口,并且除了挂载网站目录,也将 nginx 的 conf.d 目录挂载到了宿主机

然后到 /home/savokiss/conf/nginx 目录下,

1. 新建 savokiss.com.conf 文件,内容如下,已经开启了 https 和伪静态:

代码语言:javascript
复制
server {
    listen 443 ssl http2 reuseport;
    server_name savokiss.com www.savokiss.com;
    root /var/www/html/savokiss.com;
    index index.php;
    include /etc/nginx/conf.d/ssl.config;

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

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

    location ~ .*\.php(\/.*)*$ {
        include        fastcgi_params;
        fastcgi_param  PATH_INFO $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param  SCRIPT_NAME $fastcgi_script_name;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index  index.php;

        fastcgi_pass   phpfpm:9000;
    }
}
server {
    listen       80;
    server_name  savokiss.com  www.savokiss.com;
    rewrite ^(.*) https://savokiss.com$1 permanent;
}

2. 新建 ssl.config 文件

代码语言:javascript
复制
 ssl_certificate /etc/nginx/conf.d/cert/perm.pem;
 ssl_certificate_key /etc/nginx/conf.d/cert/perm.key;
 ssl_session_cache shared:SSL:1m;
 ssl_session_timeout 5m;
 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_prefer_server_ciphers on;

3. 创建 cert 文件夹,将 https 证书 perm.pem, perm.key 放进去

如果不需要 https,上面的配置文件就不需要后面这两步,同时 conf 文件内容适当删减即可。

注意:上面的配置文件中的路径都是对于容器内部来说的。 提示:如果启动失败,可以使用 docker logs main_nginx 查看错误日志,启动成功后是可以进入到容器内部的。修改配置文件后可能需要进入容器内部执行 nginx -s reload,或者直接在宿主机 docker restart main_nginx 即可。

部署 typecho

由于笔者是迁移,typecho 源码都在 github 上,所以直接 git clone 到 /home/savokiss/www/ 中即可。然后用工具连接数据库将 sql 导入就完成啦。

后记

本文主要参考了文末的第一篇文章,主要是为了记录折腾的过程,当然目前搭建完成还有几个问题可以优化,如:

  1. 多个网站是否应使用同一个 nginx 容器
  2. 容器如何在挂掉后自动重启
  3. 换成 docker-compose 编排会不会更好

第一条等遇到了再考虑一下,第二条可以通过 run 命令指定 —restart 即可。 第三条其实可以另写一篇文章了~

参考文章

CentOS 7 使用 docker 搭建基本的 lnmp 环境 Manage Docker as a non-root user Get Docker Engine - Community for CentOS DaoClound 镜像站 MySQL Image PHP Image Nginx Image

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码力全开 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 配置新用户
    • 添加用户
      • 修改密码
        • 加入 sudo 权限
          • 创建 docker 用户组
            • 将新用户加入 docker 组
            • 安装 docker
              • 下载安装依赖包
                • 添加国内 yum 源
                  • 更新缓存,安装 docker-ce
                    • 启动 docker
                      • 国内镜像源加速
                        • 修改后重启服务
                        • 配置容器
                          • 获取 MySQL 镜像
                            • 获取 PHP 镜像
                              • 测试目录映射
                              • PHP 扩展安装
                            • 获取 nginx 镜像
                            • 部署 typecho
                            • 后记
                            • 参考文章
                            相关产品与服务
                            容器镜像服务
                            容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档