11

Centos8使用docker迁移typecho博客

 4 years ago
source link: https://www.fengxianqi.com/index.php/archives/149/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

最近在学docker,先拿自己的博客来开下刀[手动狗头]。

安装docker

我是根据这个教程来安装的:Centos安装Docker。步骤如下:

  1. 卸载旧版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine
  1. 安装依赖包
sudo yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2
  1. 添加yum源(建议使用国内镜像)
sudo yum-config-manager \
    --add-repo \
    https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
  1. 更新软件源缓存并安装docker-ce
sudo yum makecache fast
sudo yum install docker-ce

sudo yum install docker-ce这一步可能会报错:containerd.io (>= 1.2.2-3),此时需要先安装新版本的containerd.io

yum install -y https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm

最新的containerd.io版本请在https://download.docker.com/linux/centos/7/x86_64/stable/Packages/找(国内直接安装containerd.io可能会非常慢导致安装失败,建议可以想办法将rpm包下载到本机再安装)。安装完containerd.io后再sudo yum install docker-ce即可。

  1. 启动Docker CE
sudo systemctl enable docker
sudo systemctl start docker
  1. 测试Docker是否安装正确
docker run hello-world
  1. 配置国内镜像加速
    vi /etc/docker/daemon.json(该文件不存在时请新建)
{
  "registry-mirrors": [
    "https://dockerhub.azk8s.cn",
    "https://reg-mirror.qiniu.com"
  ]
}

保存后重启服务

sudo systemctl daemon-reload
sudo systemctl restart docker

安装mariadb

mkdir -p /data/mariadb
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=test --mount type=bind,source=/data/mariadb,target=/var/lib/mysql --restart=always --name mariadb mariadb

--mount命令也可以用-v /data/mariadb:/var/lib/mysql --name mariadb mariadb代替,官方更推荐使用--mount,详情请看官网

参数说明:

  • -d 代表 daemon,即后台运行
  • -p是映射容器的3306端口到宿主机的3306端口,规则是:-p IP:host_port:container_port
  • -e是设置mariadb的密码
  • --mount是让容器的/var/lib/mysql映射到宿主机的/data/mariadb目录中
  • --restart=always是为了在docker重启时,容器能够自动启动

PS: 后面笔者会将所有容器依赖的一些数据都放在/data目录下,包括数据库、网站源码、nginx的conf等,目的是为了以后迁移方便,直接将/data拷贝到新服务器就可以。

安装nginx

mkdir -p /data/nginx/conf.d
docker run -p 80:80 -p 443:443 --mount type=bind,source=/data/nginx/conf.d,target=/etc/nginx/conf.d --mount type=bind,source=/data/solution,target=/data/solution --restart=always -d --name nginx nginx
  • --mount type=bind,source=/data/nginx/conf.d,target=/etc/nginx/conf.d是为了将nginx的配置目录映射到宿主机的目录中,这样当nginx容器被销毁时,依然能保留配置。
  • /data/solution用于存放网站项目,也是为了数据与容器分离。
  • -d这里同时映射了80和443端口

安装php

可以在php的官方镜像源找到最新版本的php,在实际使用中,我们可能还需要装一些php的扩展,而官方源中支持已经帮我们安装了一些扩展的php镜像,如:php:<version>-fpm,其中的<version>指的是php版本,具体可以从官方镜像源找到,当前最高版本是7.4。

docker run --name php-fpm -p 9000:9000 --mount type=bind,source=/data/solution,target=/data/solution --restart=always -d php:7.4-fpm

这里也将网站根目录/data/solution映射到php容器中,为了php能正确读取nginx中的root配置项。

由于typecho需要用到pdo_mysql扩展,因此要在php-fpm上安装这个扩展。

# 进入到`php-fpm`容器内部
docker exec -it php-fpm bash
# 安装扩展
docker-php-ext-install pdo_mysql
# 查看是否已经成功安装
php -m
# 退出容器
exit

容器与容器通信

现在机器上已经运行着nginxPHPmariadb三个服务了,他们分别跑在宿主机的80(443)90003306端口上。我们现在需要做到的是让nginx能够使用php的服务,php能够调用mariadb的服务,但容器间默认是互相隔离的,没法直接通信,因此需要想办法让他们能够互相通信。容器间的通信初次接触会有点复杂,所以在这里先和大家分享下一些要点。

通过了解,容器间通信主要会有以下几种方法:

  1. 使用默认的bridge网络,用网桥给容器分配的ip进行通信,官方不推荐用于生产环境。
  2. 自定义bridge网络,可以通过容器名连接,官方推荐
  3. 使用host网络共用宿主机的网络。

很多早期的文章分享都会使用--link参数来指定容器通信,但这种方法已经是过时的了,官方不再推荐使用,所以咱们这里也就不再用了,用官方推荐的方法更好。

使用默认的bridge网络

启动容器时,docker默认会将自动将容器绑定到默认的bridge网络中。打印一下默认的网络:

$ docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
17e324f45964        bridge              bridge              local
6ed54d316334        host                host                local
7092879f2cc8        none                null                local

然后再看一下都有哪些容器连接到了bridge网络:

docker network inspect bridge
微信图片_20191208225610.png
可以看到mariadb,nginx,php-fpm的在bridge中的ip分别是172.17.0.4,172.17.0.2,172.17.0.3,宿主机的ip是172.17.0.1

我们可以通过在容器中通过宿主机的ip来访问对应的服务,即php-fpm想要访问mariadb,可以在php-fpm容器中通过172.17.0.1:3306来访问。

这种方式只能使用ip来访问对应的容器的服务,而ip可能会变化的,因此是不推荐使用在生产环境的,所以我们不会使用这种方式。

使用自定义bridge网络

除了默认的bridge网络,官方推荐用户自定义一个bridge网络用作生产环境,用户自定义的bridge网络不仅支持ip访问,还支持直接使用容器名称进行访问,官方推荐使用在生产环境,因此我们会使用这种方式进行容器间的通信。

  1. 创建一个自定义网络,名字可以随意,如typecho
docker network create typecho

打印一下当前的network,可以看到typecho已经存在了。

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
429eabf557a3        bridge              bridge              local
3f47e77c0ded        host                host                local
3784484fb92e        typecho             bridge              local
7ff63bc6d9bd        none                null                local
  1. 容器使用自定义的网络

如果容器尚未创建,可以在docker run命令时通过--network参数来指定网络,如

docker run -d --name mynginx --network typecho nginx

如果容器已经在运行了,我们也可以通过docker network connect ${网络名} ${容器名}来指定,在上面我们已经运行了mariadb,php-fpm,nginx,所以现在依次为他们都绑定到typecho网络中。

docker network connect typecho mariadb
docker network connect typecho php-fpm
docker network connect typecho nginx

检查一下绑定到typecho网络的容器

$ docker network inspect typecho
[
    {
        "Name": "typecho",
        "Id": "3784484fb92e36c1448d2303af1b8bdce680e2cba0452fca354cefb6cb81bb54",
        "Created": "2019-12-08T08:32:57.299750734-05:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "6c644a890f3d1e7cc9e846236b6467ac31084470289fba5f6af1c2c1a0171e8e": {
                "Name": "mariadb",
                "EndpointID": "881c4f00a8d15f4e941d50faf53846a3ab8f15772fccc5e8c568e8d97b346b3b",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "f98355c7b220c0ab2897aa2478037e3322d78ccd81518af7a4756b07e1e26719": {
                "Name": "nginx",
                "EndpointID": "f14e5c36fcfe7ac5f26b8495335366957b6d7ab6d59c13e55cae2f1dc7751929",
                "MacAddress": "02:42:ac:12:00:04",
                "IPv4Address": "172.18.0.4/16",
                "IPv6Address": ""
            },
            "f9cb6cfcebf6f82beca76d3061765c1deb482a9c3c30d0c6d3644fe10ae40e3e": {
                "Name": "php-fpm",
                "EndpointID": "c4a2e26fe887e04f01a36eea9771eb2e817ef29d1bd7c435b380a7ca18485e64",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

可以看到mariadb,php-fpm,nginx都已经连接到typecho网络了。这样,我们在nginx容器,就可以直接通过php-fpm的名字来调用php的服务了。

使用host网络

如果容器使用了host网络,即docker运行时通过--network host来指定容器的网络,会使得容器共享宿主机的网络配置,即容器的localhost就是宿主机的localhost。

直接使用Docker host网络最大的好处就是性能更好,如果容器对网络传输效率有较高要求,则可以选择host网络。当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host上已经使用的端口就不能再用了。

我们这里暂时不使用这种方式。

容器内与宿主机通信

如果在容器内部想要访问宿主机的端口,是不行的,两者的环境是隔离的。如nginx容器的配置中想要使用http://localhost:1234是访问不到宿主机的1234端口的。

  • 办法一:使用宿主机ip
$ ip addr show docker0
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:d5:4c:f2:1e brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:d5ff:fe4c:f21e/64 scope link
       valid_lft forever preferred_lft forever

可以看到宿主机的ip是172.17.0.1,容器内通过该ip访问宿主机。

  • 办法二:容器使用host网络

在容器启动时指定连接到host网络,容器暴露的端口即宿主机暴露的端口,从而做到容器内也可以通过localhost访问宿主机。

docker run -d --name nginx --network host nginx

参考该文章: Docker容器访问宿主机网络

迁移typecho博客

迁移数据库

由于是第一次迁移,新旧两个数据库的配置可能会有些不一样,所以为了不改变新服务器的一些配置,我们只迁移mariadb中涉及到数据的部分。

具体操作就是: 将原服务器/var/lib/mysql中数据库相关的文件夹提取出来,如旧服务器有两个名为typechotest的数据库,就只将这两个文件夹复制到新服务器的/data/mariadb中,然后重启一下mariadb即可:docker restart mariadb

PS: 还有一种迁移办法是可以选择将旧服务器的数据库备份成sql文件,然后在新服务器做还原哦。

迁移typecho源码

笔者这里将typecho的源代码放到/data/solution/typecho文件夹中。

配置nginx

vi /data/nginx/conf.d/typecho.conf

server {
  listen       80;
  server_name  localhost;
  location / {
    try_files $uri $uri/ /index.php?$args;
  }
  location ~ .php$ {
    root      /data/solution/typecho;
    fastcgi_pass  php-fpm:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include       fastcgi_params;
  }
}

server_name我这里写了localhost,暂时算是本地测试一下,实际使用时会改成域名。

修改nginxi配置后需要重启一下nginx的镜像才能生效:docker restart nginx

typecho的配置文件config.inc.php

注意数据库连接的配置,数据库的host可以直接使用mariadb,因为前面将两个容器绑在了同一个网络,php能正常解析到。

/** .... */

/** 定义数据库参数 */
$db = new Typecho_Db('Pdo_Mysql', 't_');
$db->addServer(array (
  'host' => 'mariadb',
  'user' => 'root',
  'password' => 'YOUR_PASSWORD',
  'charset' => 'utf8',
  'port' => '3306',
  'database' => 'typecho',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);

至此,整个迁移过程就完成了,可以用curl localhost测试一下或在浏览器中直接使用服务器的ip来访问页面啦。

PS: 记得不要忘了要打开服务器的80端口防火墙哦~~

Tips: 如果没法正常启动typecho,可能是某一步配置的不对,可以通过docker logs <container_name>命令查看对应容器的日志,然后查找相关的解决办法哦。附上两篇typecho解决错误的文章:Typecho 部署踩坑, 安装Typecho卡在“确认您的配置,数据库配置”问题的终极解决方法

https证书迁移(202011更新)

证书涉及到自动更新,比较复杂,请看: docker安装acme.sh

用上docker最爽的一点就是不用再关心怎么安装软件的过程了,整个过程十分清爽。在整个过程中有几点可以留意一下:

  1. 笔者将所有docker依赖的数据都挂载到宿主机的/data目录中,是为了方便管理和以后迁移;
  2. 每个服务都是一个独立的容器,不会互相影响。如mariadb除了可以为我的博客系统服务,也可以给其他的服务调用;nginx也支持多站点,只需要/data/nginx/conf.d增加一个配置。

由于是第一次用上docker迁移,第一次会有点折腾,但以后再迁移就会方便多了。整个流程大概会是这样子:

# 在新服务器拉取旧服务器的数据
scp -r root@<old_server_ip>:/data /data/

# 安装docker-ce

# 新建一个网络
docker network create typecho

# 分别启动mariadb,php-fpm,nginx三个容器,并绑定typecho网络
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=test --mount type=bind,source=/data/mariadb,target=/var/lib/mysql --restart=always --network typecho --name mariadb mariadb
docker run --name php-fpm -p 9000:9000 --mount type=bind,source=/data/solution,target=/data/solution --restart=always --network typecho -d php:7.4-fpm
docker run -p 80:80 -p 443:443 --mount type=bind,source=/data/nginx/conf.d,target=/etc/nginx/conf.d --mount type=bind,source=/data/solution,target=/data/solution --restart=always --network typecho -d --name nginx nginx

# 安装php扩展
docker exec -i php-fpm docker-php-ext-install pdo_mysql

# 测试走起
curl localhost

「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」


Recommend

  • 14
    • blog.popkx.com 4 years ago
    • Cache

    typecho个人博客修整记录

    typecho个人博客修整记录 发表于 2020-03-07 10:03:00...

  • 9
    • www.wyr.me 3 years ago
    • Cache

    CentOS8卸载podman安装docker

    CentOS8卸载podman安装docker - 轶哥CentOS8卸载podman安装docker由于CentOS8默认安装了podman,因此在CentOS8中安装docker会导致冲突引发如下异常。 Error: Problem 1: problem with installed package podman-2.0.5-5.module_el8...

  • 10

    在Centos8 中使用Stratis管理本地存储(二)发布于 45 分钟前本文介绍如何通过向现有Stratis池中添加新磁盘和添加缓存磁盘。下面将介绍添加、删除、快照等内容。

  • 5

    为 Typecho 博客添加表情评论 #1:使用 OwO.js 2019.05.15 |

  • 4

    2021-11-12 14:03:41 update 由于很多表情资源 404 或者访问速度不佳,我又懒得将它们保存下来然后托管到一个访问速度不错的图床上,于是我将 owo 表情区的大部分表情全删了。虽有不舍,但是更看重博客访问速度,虽然表情的加载不影响博客的阅读,但是...

  • 10

    使用 OwO.js 为 Typecho 博客添加表情评论教程 在上面引用的第一篇文章中,「绑定表情框与评论框」 这个步骤,将 textarea 或者 input 标签的class属性追加 OwO-text...

  • 9
    • blog.devwiki.net 3 years ago
    • Cache

    威联通使用Typecho搭建博客

    内网穿透搞好了, 接下来就是迁移博客了. 之前的博客使用 Typecho 搭建的, 浏览其 github 仓库,发现已经支持了 docker 部署. 前提条件: 已经处理好内网穿透, 如未设置好, 可参见:

  • 3
    • os.51cto.com 3 years ago
    • Cache

    Centos8 中迁移逻辑卷

    Centos8 中迁移逻辑卷-51CTO.COM Centos8 中迁移逻辑卷 作者:逄增宝 2022-04-15 07:51:36 假设在我们的设置中,只有一个磁盘 /dev/sda1,大小为20gb。此时 /dev/sda1处于故障警告状态,需要更换...

  • 10

    Emlog到Typecho的迁移工具:emlog2typecho emlog2typecho 是一个用python写的脚本,用来迁移Emlog的数据库到Typecho。正如你所看到的这个网站我的博客,就是用它迁移过来的,相信你也可以很方便的使用它。目前它可以自动迁移文章、页面、分类...

  • 3

    linux 网络相关的简单介绍及centos8 yum源无法使用的解决方法 原创 想剪个寸头...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK