分类 DevOps 下的文章

由于众所周不知的原因,docker hub已经不能从国内正常访问。这时我们可以通过访问正常访问的docker hub镜像网站,实现正常拉取镜像。

本文介绍如何通过在Cloudflare中部署一个镜像页面,并合理配置服务器或者Windows/MacOS中的Docker引擎,实现曲线救国。

一、前提

二、GitHub CF-Workers-docker.io 项目

docker-hub-01.png

CF-Workers-docker.io 是一个 Docker 仓库镜像代理工具。官方描述为:

这个项目是一个基于 Cloudflare Workers 的 Docker 镜像代理工具。它能够中转对 Docker 官方镜像仓库的请求,解决一些访问限制和加速访问的问题。

仓库地址 https://github.com/cmliu/CF-Workers-docker.io 仓库说明中也包含了其他已经部署的镜像,如果不想自己部署Cloudflare,也可以直接跳过第三部分,直接拿来进入第四部分的配置进行操作。

注册登陆GitHub并进入该仓库后,Fork到自己的仓库。

三、在Cloudflare部署代理工具

  1. 登录Cloudflare
  2. 点击 Worker和Pages 再点 概述(Overview) 再点 新建(Create)
    docker-hub-02.png
  3. 新界面中切换到 Pages 页签,点击 连接到Git(Connect to Git)
    docker-hub-03.png
  4. 选择 GitHub 页签,并选择自己的github账户。注意:如果之前没有关联,可能需要通过添加账户(Add Account)先行添加。之后在下方选择之前fork到自己仓库的项目,名称应该为 CF-Workers-docker.io,最后点击右下角的开始设置(Begin Setup)按钮。
    docker-hub-04.png
  5. 确认页面不用修改,直接点击保存并部署(Save and Deploy),等待部署完成。
    docker-hub-05.png
  6. 点击继续处理项目(Continue to Process Project)
  7. 最后得到一个域名,类似cf-workers-docker-io-xxx.pages.dev。点击页面右上角的访问(Visit),打开就是docker hub的搜索页面。

四、设置docker守护进程配置中的 registry-mirrors 属性

  • 原理:通过设置docker守护进程配置docker-daemon.json文件中的registry-mirrors顶级属性,可以让Docker直接访问docker hub的镜像站点。与Ubuntu的镜像软件中心、Node.js npm的源地址、Python pipy的源地址等是一个道理。
  • 注意:编辑docker-daemon.json文件时,务必遵守JSON格式规则,否则会引起Docker崩溃。

Linxu 服务器上使用代理

  1. 使用ssh或者类似工具登陆服务器。修改 /etc/docker/daemon.json 文件,(如果没有则直接新建),添加registry-mirrors 顶级属性"registry-mirrors" : [ "https://刚刚得到的域名" ]。最后看起来应该类似:
{
  "debug": false,
  "registry-mirrors" : [ "https://cf-workers-docker-xxx.pages.dev" ]
}
  1. 重启启动docker服务(通过systemctl reload或者直接重启服务器),之后便可以使用

MacOSWindows 中使用代理

MacOSWindows 一般都使用Docker Desktop管理Docker,可以非常方便的配置Docker引擎

  1. 打开docker desktop,依次点击右上角⚙️(齿轮),设置界面中的Docker Engine, 并在左侧的json文本编辑器中添加registry-mirrors 顶级属性"registry-mirrors" : [ "https://刚刚得到的域名" ]。最后看起来类似:

    {
      "builder": {
     "gc": {
       "defaultKeepStorage": "20GB",
       "enabled": true
     }
      },
      "debug": true,
      "experimental": false,
      "registry-mirrors" : [ "https://cf-workers-docker-xxx.pages.dev" ]
    }

    docker-hub-06.png

  2. 点击右下角 应用并重启(Apply and Restart) 之后便可以使用代理拉取镜像!

延伸:更多的容器仓库需要镜像/代理怎么办?

使用国内开源镜像加速服务

比如南京大学镜像 官网南京大学开源镜像 GHCR

还是使用Cloudflare Worker进行路由转发:

可以使用GitHub上的cloudflare-docker-proxy这个项目来实现对 docker hub, gcr.io, ghcr.io, k8s.gcr.io, quay.io 等容器仓库的代理和流量转发。具体可以参考其主页文档。

什么是 Docker

Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新
Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

docker-on-linux.png

什么是 Docker 仓库

仓库(Repository)是集中存放镜像的地方。
一个容易混淆的概念是注册服务器(Registry)。实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对于仓库地址 docker.io/ubuntu 来说,docker.io 是注册服务器地址,ubuntu 是仓库名。
大部分时候,并不需要严格区分这两者的概念。

什么是 Docker 私有仓库(Registry)

一般情况下,我们可以通过Docker Hub在整个网络中下载或者分享Docker镜像。同时相比Docker Hub这样的公共仓库,用户可以创建私有仓库供私人使用。

官方提供了docker-registryDocker镜像用于构建私有的镜像仓库。目前是 v2.x 版本。

搭建Docker私有仓库的步骤

一般需要以下几个大致的步骤:

  1. 从Docker Hub拉取docker-registry镜像
  2. 创建docker-registry配置文件,并启动docker-registry
  3. 通过nginxdocker-registry发布到互联网。(内部使用可忽略此步骤)

搭建 Docker 私有仓库Web管理平台

使用docker-compose一次性完成所有搭建

参考

  1. Docker私有仓库搭建与界面化管理
  2. 私有仓库

云服务器中通过Docker镜像的方式使用Mysql数据库,数据安全考量定期备份数据库到阿里云OSS中

本文主要实现在阿里云ECS服务器中,通过脚本的方式实现将Docker中的Mysql数据库备份到阿里云OSS中。其他云服务商和其他环境的MySQL也可以使用类似的方式。具体方式不再赘述。

环境和工具

  1. 阿里云ECS服务器,安装Ubuntu或任何带有定时任务cron的Linux操作系统
  2. 阿里云OSS bucket和相应访问的账户
  3. 阿里云OSS命令行工具ossutil,可以到这里下载或查看详情
  4. MySQL镜像

具体步骤

开通OSS和相应子账号

  1. 进入阿里云OSS(对象存储)控制台,如果没有开通OSS服务可能会提示权限和开通确认。
  2. 创建bucket/存储桶,输入名字,比如xxxxbackup,记住这个名字以及界面中出现的Endpoint(地域节点),后续会用到。
    WX20220720-115411.png
  3. 创建一个有API的阿里云子账号,并赋予OSS读写权限。记住该账号的API和Secret,后续会用到。帮助文档
    WX20220720-115547.png

下载OSS命令行工具ossutil到本地系统

  1. 通过wget https://gosspublic.alicdn.com/ossutil/1.7.13/ossutil64下载到本地。这里是64位操作系统,32位可以去下载界面查看对应的下载地址。
  2. 增加运行权限:chmod +x ossutil64
  3. 移动到Path中:sudo mv ossutil64 /bin/

编写脚本

这里需要注意docker容器的名称,容器中应该有MYSQL用户名和密码的环境变量;示例中使用的是root作为用户名;另外备份临时文件夹也需要提前使用mkdir建好

脚本内容示例:

#!/bin/sh 

mysql_dump_path=备份文件临时目录,如/var/dbbackup/ 

#oss-config 
oss_endpoint="阿里云OSS Endpoint" 
oss_bucket="阿里云OSS bucket名称" 
oss_accesskeyid="子账号AccessKeyId" 
oss_accesskeysecret="子账号 AccessKey Secret" 
backup_name=`date +%Y%m%d%H%M%S`
cd ${mysql_dump_path} 

# 使用 mysqldump 备份整个数据库到临时文件夹中
# 注意docker修改docker镜像名称,这里是some-mysql
docker exec some-mysql sh -c 'mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --all-databases' > ${backup_name}.sql

# 打包/pack 
tar zcf ${backup_name}.tar.gz ${backup_name}.sql 
rm -f ${backup_name}.sql 

# 备份到OSS
ossutil64 cp ${backup_name}.tar.gz oss://${oss_bucket}/mysql/backup/${backup_name}.tar.gz -f -e ${oss_endpoint} -i ${oss_accesskeyid} -k ${oss_accesskeysecret} 
rm -f ${backup_name}.tar.gz 
echo "备份完成"

将脚本保存至任意一个不错的位置,比如/var/backup/dbbackup.sh,赋予可执行权限:sudo chmod +x /var/backup/dbbackup.sh

试着运行一下脚本文件sudo /var/backup/dbbackup.sh,再去oss控制台该bucket下-文件管理处查看是否有备份文件存入。如果一切没有问题,则就可以加入cron了。

加入cron计划任务

注:如果脚本位置和临时备份文件夹位置是当前用户无法直接编辑的,则应使用一下方法,在系统级别运行计划任务;用户级别会因为权限问题出错

使用你喜欢的编辑器打开/etc/crontab文件,并在文件末尾加上这行:

23 2 * * * root /var/backup/dbbackup.sh

这表示在每天的02:23:00运行我们的备份脚本。

重新启动cron计划任务:sudo service cron reload

在次日2:23分之后检查OSS控制台后台,即可发现整个数据库已经备份到阿里云OSS。

参考

  1. 使用ossutil定时备份自建mysql数据库到阿里云OSS
  2. Cron介绍
  3. docker hub: mysql

问题和原因

jupyter notebook通过nbconvert调用Latex导出PDF,由于nvconvert中转换模版中并不包含中文支持的package申明,导致Latex渲染时无法识别中文字符和对应的字体。出现类似:

LaTeX Error: Unicode character 正 (U+6B63) not set up for use with LaTeX.

的报错。导出的PDF文件中,所有中文字符都显示为空白。

解决方案

有两种方法可以解决:

  1. 先从Notebook导出为Latex,再使用如TexShop等工具打开Latex文件并添加中文支持,之后导出
  2. 修改nbconvert的模版,直接添加中文支持,这样即可直接导出PDF

这里说第二种办法:

首先通过jupyter --paths获得Jupyter相关路径,

% jupyter --paths

输出类似:

config:
    /Users/xxx/.jupyter
    /Users/xxx/custom_path/venv/etc/jupyter
    /usr/local/etc/jupyter
    /etc/jupyter
data:
    /Users/xxx/Library/Jupyter
    /Users/xxx/custom_path/venv/share/jupyter
    /usr/local/share/jupyter
    /usr/share/jupyter
runtime:
    /Users/xxx/Library/Jupyter/runtime

找到...share/jupyter文件夹所在位置,并定位到...share/jupyter/nbconvert/templates/latex文件夹,里面有nbconvert转换LaTex模版,
nvconvert-latex.png
通过修改base.tex.j2模版文件,添加xeCJK包申明和相关字体即可影响所有相关模版:

    \usepackage{xeCJK}
    \setCJKmainfont{STSong}

添加完成后,模版文件应类似:

((*- block header -*))
    ((* block docclass *))\documentclass[11pt]{article}((* endblock docclass *))

    ((* block packages *))
    \usepackage{xeCJK}
    \setCJKmainfont{STSong}
    \usepackage{iftex}
    ...

注意,字体部分可以通过Mac的字体书(Font Book)找到合适的中文字体名称,不一定非得使用宋体(STSong)。另外除了主要字体,也可以定义其他情况的字体,若加粗和倾斜时应用的字体。

相关文章

github:jupyter/nbconvert
Mac环境下jupyter notebook导出PDF显示中文的解决方案 (nbconvert 6, python 3.9)
convert notebook (contains Chinese words) to PDF successfully but those Chinese words are missing

总体步骤

类似把大象关进冰箱分为3步:

  1. 把冰箱门打开
  2. 把大象放到冰箱里
  3. 把冰箱门关上

将物理机迁移至ESXi 7.0虚拟机也需要3步:

  1. VMware vCenter Converter Standalone Client将物理机打包成VMware Workstation兼容的vmdk文件;
  2. 将vmdk文件上传至ESXi系统存储,并通过vmkfstools转换其为ESXi7.0兼容的格式;
  3. 用上一步转换而来的虚拟硬盘文件创建虚拟机。

1 打包物理机

  1. WMware官网下载VMware vCenter Converter Standalone Client,可能需要注册一个账号
  2. 在需要打包的物理机上安装并运行VMware vCenter Converter Standalone Client
  3. 点击Convert machine,弹窗中选择source typeThis local machine进入下一步:
    WX20220106-103415-1.png
  4. 在目标系统中按照以下界面选择,建议存储位置这里可以通过插入一个移动硬盘并选择这个盘,以方便后续上传到ESXi:
    WX20220106-103534-2.png
  5. 在选项/Options步骤,编辑Data copy type,只选择需要的打包的分区,比如引导分区、系统盘等
    WX20220106-104151-3.png
  6. 继续点击Next/Finish直到完成转换,稍候片刻,即可获得导出的VMware Workstation兼容的vmdk文件

2 上传vmdk,使用vmkfstools转换格式

由于打包的vmdk是兼容VMware Workstation的版本,是不兼容ESXi的。如果不转换格式的话,会出现类似报错:

无法打开磁盘 scsi0:m: 磁盘类型 n 不受支持或无效。请确保磁盘已导入。
  1. 进入ESXi Web终端,通过存储 -> 数据存储浏览器进入并打开/创建相关文件夹,并上传上一步打包出来的vmdk文件:
    迁移1.png
  2. 找到数据存储所在位置:
    迁移2.png
  3. 主机 -> 管理 -> 服务 中打开SSH服务,详见启用对 ESXi Shell 的访问
  4. 通过终端SSH连接到ESXi服务器
  5. cd到第2步存储所在的文件夹,再进一步cd到上传的vmdk文件所在的文件夹
  6. 执行vmkfstools转换格式命令,记得最后要使用-d thin来使用精简置备模式,以节省空间

    # 进入导入vmdk文件所在的文件夹
    cd /vmfs/volumes/xxxxx248-xxxx75d-07eb-xxxxd6c0/xxxx
    # 转换格式,假定原文件名为orginal.vmdk,转换后的文件名为dest.vmdk
    vmkfstools -i orginal.vmdk dest.vmdk -d thin
  7. 等待片刻,即可享用转换出来的vmdk文件

3 创建虚拟机

创建一个新的虚拟机,添加上一步转换出来的vmdk文件为新的硬盘

  1. 进入ESXi终端,通过虚拟机 -> 新建虚拟机 -> 创建新虚拟机
    迁移3.png
  2. 自定义设置,硬盘选择那里添加一个现有硬盘,选择刚才创建的vmdk文件(dest.vmdk
    迁移4.png
  3. 安装常规步骤创建好虚拟机
  4. 理论上你可以运行你的虚拟机了

参考

LEDE的vmdk在esxi下提示scsi0:0的磁盘类型不受支持或无效_Jian Sun_的博客-程序员宝宝
WorkStation 虚拟机迁移到 ESXi的后续处理. 转载