项目小结:使用Docker迁移服务到离线服务器
前言
最近遇到的这个场景,需要把之前开发的一套系统迁移到一个离线的服务器上,这个服务器有点麻烦,接入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
成功打开了网页,这俩浏览器的效果都差不多。
参考资料
- https://www.hangge.com/blog/cache/detail_2411.html
- https://www.cnblogs.com/52linux/archive/2012/03/04/2379738.html
- https://docs.docker.com/engine/install/centos/#install-from-a-package
项目小结:使用Docker迁移服务到离线服务器的更多相关文章
- idea使用docker-maven-plugin插件将项目编译为docker镜像到远程linux服务器 原
在使用idea开发时,直接docker-maven-plugin插件,把项目编译成docker镜像,然后通过docker:push推送到linux服务器,非常简单,快捷,也避免了手动打包,然后拷贝wa ...
- docker 运行jenkins及vue项目与springboot项目(五.jenkins打包springboot服务且在docker中运行)
docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...
- docker微服务部署之:四、安装docker、docker中安装mysql和jdk1.8、手动构建镜像、部署项目
docker微服务部署之:三,搭建Zuul微服务项目 1.Centos7安装Docker 详见:Centos7安装Docker 2.Docker中安装jdk1.8 详见:使用Docker构建jdk1. ...
- docker微服务部署之:三,搭建Zuul微服务项目
docker微服务部署之:二.搭建文章微服务项目 一.新增demo_eureka模块,并编写代码 右键demo_parent->new->Module->Maven,选择Module ...
- docker微服务部署之:二、搭建文章微服务项目
docker微服务部署之:一,搭建Eureka微服务项目 一.新增demo_article模块,并编写代码 右键demo_parent->new->Module->Maven,选择M ...
- docker微服务部署之:一,搭建Eureka微服务项目
先说明一下docker需要搭建的微服务的基本情况: 项目情况:一个demo_parent项目,下面三个子模块:demo_eureka(eureka服务).demo_article(文章服务).demo ...
- 《Spring Cloud与Docker微服务架构实战》配套代码
不才写了本使用Spring Cloud玩转微服务架构的书,书名是<Spring Cloud与Docker微服务架构实战> - 周立,已于2017-01-12交稿.不少朋友想先看看源码,现将 ...
- 离线服务器下docker的部署与应用
一分钟内形成docker的模糊概念 网上很多文章避免将docker与虚拟机混为一谈,但对于初学者来说,完全可以将docker当做一种虚拟机技术,只需要牢牢记住一点最重要的区别:docker依赖于物理机 ...
- 细说Mammut大数据系统测试环境Docker迁移之路
欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 最近几个月花了比较多精力在项目的测试环境Docker迁移上,从最初的docker"门外汉"到现在组里的同学(大部分测试及少 ...
- Openstack+Kubernetes+Docker微服务实践之路--RPC
重点来了,本文全面阐述一下我们的RPC是怎么实现并如何使用的,跟Kubernetes和Openstack怎么结合. 在选型一文中说到我们选定的RPC框架是Apache Thrift,它的用法是在Ma ...
随机推荐
- [Linux]常用命令之【cat/echo/iconv/vi/grep/find/head/tail】
cat cat [选项] [文件].. # 一次显示整个文件或从键盘创建一个文件或将几个文件合并成一个文件 cat -n file1 # 编号文件内容再输出 echo -n 输出后不换行 -e 遇到转 ...
- 四月六号java基础学习
四月六号 1.今天学习了JAVA语言特点,有以下几个特点: 1)简单易学:相对于C/c++语言,java语言省去了指针(pointer).联合体(Unions)以及结构体(struct) 2)面向对象 ...
- Vue修改单页面背景颜色
- 谈一谈Python中的装饰器
1.装饰器基础介绍 1.1 何为Python中的装饰器? Python中装饰器的定义以及用途: 装饰器是一种特殊的函数,它可以接受一个函数作为参数,并返回一个新的函数.装饰器可以用来修改或增强函数的行 ...
- RDIFramework.NET敏捷开发框架助力企业BPM业务流程系统的开发与落地
现如今,很多企事业单位集团都自己有一套独特严密的业务生产经营流程,各个环节紧密相连.前后对应,一旦某个环节疏忽,整个流程就会出现问题.如何保证业务流程的标准化和规范化运营.减少人为差错,这就需要用到B ...
- c/c++快乐算法第一天
c/c++感受算法乐趣(1) 开始时间2023-04-14 18:31:47 结束时间2023-04-14 22:06:02 前言:经过两天的学习,是不是发现编程也挺简单的.其实不然,学好算法同时也是 ...
- 深度学习基础5:交叉熵损失函数、MSE、CTC损失适用于字识别语音等序列问题、Balanced L1 Loss适用于目标检测
深度学习基础5:交叉熵损失函数.MSE.CTC损失适用于字识别语音等序列问题.Balanced L1 Loss适用于目标检测 1.交叉熵损失函数 在物理学中,"熵"被用来表示热力学 ...
- 宝塔ftp无法连接的解决方案
宝塔面板现在使用率非常的高.今天把自己的踩坑处理方法记录一下. 在配置号宝塔面板ftp后,使用vscode的sftp插件,发现一直链接不上.一度以为自己配置文件,配置的参数有问题.各种度娘后,花了好长 ...
- NLP入门1——李宏毅网课笔记
近日因为项目需要,开始恶补预习NLP的相关知识.以前也看过两本相关书籍,但是都十分浅显.这次准备详细的学一下并记录. 李宏毅老师的网课是 Deep Learning for Human Languag ...
- Eclipse中添加Shell脚本(如start.sh)
Eclipse中添加Shell脚本(如start.sh) 使用eclipse时,我们有时候会在自己的工程文件下添加一些脚本(比如将Qt代码在eclipse中运行生成moc文件时,或者要拷贝 ...