项目小结:使用Docker迁移服务到离线服务器

项目,小结,使用,docker,迁移,服务,离线,服务器 · 浏览次数 : 290

小编点评

## docker迁移过程记录 **目标服务器:** Centos7.9 系统 **迁移步骤:** **1. 安装 docker** - 下载并安装 docker的 RPM 包:`sudo yum install containerd.io-1.6.21-3.1.el7.x86_64docker-buildx-plugin-0.10.5-1.el7.x86_64docker-ce-24.0.2-1.el7.x86_64docker-ce-cli-24.0.2-1.el7.x86_64docker-ce-rootless-extras-24.0.2-1.el7.x86_64docker-compose-plugin-2.18.1-1.el7.x86_64` **2. 下载并安装 docker配置文件** - 从 docker 官方网站下载最新的 docker configuration 文件:`docker run --rm -v /path/to/docker-compose.yml:/etc/docker/compose.yml` **3. 启动 dockersudo systemctl服务** ``` sudo systemctl enable dockersudo sudo systemctl start dockersudo ``` **4. 设置用户组和权限** ``` sudo groupadd dockersudo sudo usermod -aG docker $USERnewgrp docker ``` **5. 安装和配置 Docker** ``` sudo apt install docker-compose docker-compose up -d ``` **6. 启动容器** ``` docker-compose up ``` **7. 配置周边组件** - 创建一个名为 `nginx` 的容器,配置 Nginx 服务器。 - 将 Nginx 的配置文件从 `docker-compose.yml` 中获取。 - 启动 `nginx` 容器。 **8. 测试接口开放** - 使用 `curl` 工具测试接口开放:`curl -X GET your-server-ip:80` **9. 其他设置** - 考虑将代码部署到 Docker Hub 等公共仓库,方便其他开发者使用。 - 建立安全策略,例如设置防火墙规则。 **注意:** - 这只是一个示例搭建过程,具体配置可能会有所不同。 - 建议参考官方文档和相关资源,详细配置 docker 和周边组件。 - 测试接口开放后,可以尝试使用 `ssh` 或其他工具进行远程连接。

正文

前言

最近遇到的这个场景,需要把之前开发的一套系统迁移到一个离线的服务器上,这个服务器有点麻烦,接入VPN后通过堡垒机才能访问,速度也很慢,遇到不少坑,本文记录一下迁移过程。

基本信息

原本这套系统也挺简单的,Django 写的后端接口,搭配 Vue+Echarts 大屏,数据库用 Mysql 和 Redis 作为缓存,这些在原服务器上都是用 docker 部署的。

这台离线的服务器是 Centos7.9 系统的,虽然不能访问外网,但还好有个本地的 yum 仓库,可惜 yum 官方源少得可怜,只能安装很有限的几个软件。

现在除了前端不需要迁移之外,其他的服务都需要迁移到这个离线的服务器上。

迁移步骤:

  • 在离线服务器上安装 docker
  • 在原服务器上导出容器镜像
  • 在离线服务器上传并导入镜像
  • 在离线服务器上传各种docker配置并启动容器
  • 配置周边组件,如 nginx

离线安装docker

前面说到这个服务器是有 yum 本地镜像的,但里面并没有 docker,所以需要自行下载 docker 的 RPM 安装包。

在这个地址: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

需要下载以下安装包(版本号本文撰写时的最新版,请读者自行下载当下的最新版本)

  • containerd.io-1.6.21-3.1.el7.x86_64
  • docker-buildx-plugin-0.10.5-1.el7.x86_64
  • docker-ce-24.0.2-1.el7.x86_64
  • docker-ce-cli-24.0.2-1.el7.x86_64
  • docker-ce-rootless-extras-24.0.2-1.el7.x86_64
  • docker-compose-plugin-2.18.1-1.el7.x86_64

然后把这些安装包都上传到服务器

执行命令安装

sudo yum install containerd.io-1.6.21-3.1.el7.x86_64.rpm docker-ce-24.0.2-1.el7.x86_64.rpm # 以及其他...

就是把全部文件都放在同一个 install 命令后面,因为这些包是有相互依赖要求的,如果一个个装的话可能会因为顺序问题报错。

安装之后启动一下 docker

sudo systemctl enable docker
sudo systemctl start docker

添加用户组啥的也属于安装 docker 后的常规操作了

sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

之后就可以不使用 root 用户来执行 docker 命令了

导出镜像

导出镜像有两种方式

  • docker export - 对应 docker import 导入镜像
  • docker save - 对应 docker load 导入镜像

PS:这俩的导出导入命令的匹配的,不能混用

前者主要用于制作基础镜像,导出后是没有历史记录和元数据的,也没有 entrypoint 所以无法直接运行,这次迁移服务使用 save 方式。

操作命令

docker save <container_id> -o image.tar

也可以重定向

docker save <container_id> > image.tar

补充一下这俩方式的具体区别

  • 文件大小不同,export 导出的镜像文件体积小于 save 保存的镜像,因为 save 会把所有 layer 都导出
  • save 可以把多个镜像打包到一个文件,export 不可以
  • export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作
  • save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)

应用场景区别

  • docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
  • docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。

打包数据

在旧的服务器上,使用了 docker 来部署 MySQL 服务,并且将 data 映射出来,需要把 data 也一并迁移到新的服务器上。

MySQL docker 的 volumes 配置

volumes:
	- ./data:/var/lib/mysql

因为VPN带宽很低,这次使用 tar + bzip2 来打包压缩

tar -cjvf ./data data.tar.bz2

命令参数说明:

  • -c: 建立一个压缩档案的参数指令 (create)
  • -j: 使用 bzip2 压缩
  • -v: 压缩的过程中显示详情 (verbose)
  • -f: 指定文件名,这个参数后面就不能再带其他参数了

然后将这个 data.tar.bz2 上传到新的服务器。

解压命令我也贴一下

tar -xjvf data.tar.bz2

这个命令会在当前目录生成 data 目录。

命令参数说明:

  • -x: 表示解压 (extract)
  • 其他的参数上面有了

导入镜像

把前面导出的 docker 镜像上传后,执行导入命令

docker load < image.tar

之后执行 docker images 看看是否导入成功

启动容器

把原本的几个 docker-compose 配置上传

之前为了方便更新,Django项目是上传代码之后在服务器直接 build,像这样

version: "3.6"
services:
  web:
    restart: always
    build: .
    environment:
      - ENVIRONMENT=docker
      - URL_PREFIX=demo/api
      - DEBUG=false
      - DEFAULT_DATABASE=mysql
    command: uwsgi uwsgi.ini
    volumes:
      - .:/code

但在离线服务器上,没有网络肯定是没法 build 了

所以要把 build . 改成 image: 镜像名称

搞定后顺利启动~

配置周边组件

只提供接口的话,也没啥啦,再安装个 nginx 就好

然而众所周知 yum 的默认源连 nginx 都没有,要安装 nginx 的话还得添加 epel-release 源

sudo yum install epel-release

万幸,离线服务器的本地源有这个东西

sudo yum update
sudo yum install nginx

搞定~

然后还是老套路,用 systemctl 启动 nginx,不重复了。

这个服务器很折腾的,既然搞定了,得测试一下,但是接口都不开放,ssh链接也是通过多层跳转的,好像没法开启 ssh-tunnel 转发在本地测试。

所以只能用 curl 之类的工具来测试一下。

不过我这次另辟蹊径,用命令行浏览器来试试能不能打开项目的网页。

分别试了这俩:

  • w3m
  • lynx

成功打开了网页,这俩浏览器的效果都差不多。

参考资料

与项目小结:使用Docker迁移服务到离线服务器相似的内容:

项目小结:使用Docker迁移服务到离线服务器

## 前言 最近遇到的这个场景,需要把之前开发的一套系统迁移到一个离线的服务器上,这个服务器有点麻烦,接入VPN后通过堡垒机才能访问,速度也很慢,遇到不少坑,本文记录一下迁移过程。 ## 基本信息 原本这套系统也挺简单的,Django 写的后端接口,搭配 `Vue+Echarts` 大屏,数据库用

Docker Compose V2 安装 ClickHouse v20.6.8.5 经验分享

前言 ClickHouse 是一款开源的分布式列式数据库管理系统,专门设计用于高性能的大数据分析和查询。 目前项目中用到的一个场景是将mongo的数据同步到clickhouse,使用clickhouse做报表,后续也将分享同步和使用方案 使用 Docker Compose 部署单机版,小项目和自己测

几个公司wiki知识库调研和感悟

@目录需求背景具体实现经验&吐槽小结 需求背景 公司准备做一个知识库,我这边调研了几个项目,也看了篇别人的经验文章传送门,如下 第一个是我们耳熟能详的confluence,但是好想要收费,先搁置 第二个是mindoc,是一个小型的开源项目,可以docker跑项目,上传文件直接映射到本地,使可以用my

项目完成小结:使用Blazor和gRPC开发大模型客户端

## 前言 先介绍下这个项目。 最近我一直在探索大语言模型,根据不同场景训练了好几个模型,为了让用户测试使用,需要开发前端。 这时候,用 Gradio 搭建的前端是不太够的,虽说 GitHub 上也有一堆开源的 ChatGPT 前端,但我看了一圈,并没有找到便于二次开发定制的,再一想,这么简单的功能

C#集成ViewFaceCore人脸检测识别库

前言 人脸检测与识别现在已经很成熟了,C# 上有 ViewFaceCore 这个很方便的库,但这种涉及到 native 调用的库,一般会有一些坑,本文记录一下开发和部署的过程。 本文的项目是 AIHub ,关于本项目的开发过程,可以参考之前的文章:项目完成小结:使用Blazor和gRPC开发大模型客

在C#中使用RabbitMQ做个简单的发送邮件小项目

在C#中使用RabbitMQ做个简单的发送邮件小项目 前言 好久没有做项目了,这次做一个发送邮件的小项目。发邮件是一个比较耗时的操作,之前在我的个人博客里面回复评论和友链申请是会通过发送邮件来通知对方的,不过当时只是简单的进行了异步操作。 那么这次来使用RabbitMQ去统一发送邮件,我的想法是通过

分享一个修改了xml文件再也不用重启的项目mybatis-xmlreload

自我18年使用 Mybaits 以来,开发环境中如果修改了 xml 文件后,只有重启项目才能生效,如果小项目重启还好,但是对于一个重启需要十几分钟的大型项目来说,这就非常耗时了。开发人员因为修改了xml 文件少量内容,比如添加一个逗号、查询增加一个字段或者修改一个 bug 等,就需要重启整个项目,这就非常痛苦了。

Understand Abstraction and Interface

Foreword 抽象和接口是Java中的两个关键字,也是两种最基本的优化软件项目手段。为什么说它们是一种优化项目的手段? 人分三六九等,不同等级的人,所接触的事和处理的事是不一样的。同理,项目也分大项目和中项目和小项目,大、中、小项目所承载的目标也是不一样的。 先说小项目,如果你使用Java只是写

SpringSecurity-前后端分离教程

1、简介 Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多,因为相比与SpringSec

小程序中使用 lottie 动画 | 踩坑经验分享

最近被拉去支援紧急需求(赶在五一节假日前上线的,双休需要加班),参与到项目中才知道,开发的项目是微信小程序技术栈的。由于是临时支援,笔者也很久没开发过微信小程序了,所以挑选了相对独立,业务属性相对轻薄的模块参与。 其中有个营销活动(领红包)的弹窗动画就要用到 lottie 动画。 本文就