标签 Docker 下的文章

由于众所周不知的原因,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 等容器仓库的代理和流量转发。具体可以参考其主页文档。

目录

  1. 安装和配置Jenkins
  2. 构建和发布Docker镜像

安装和配置Jenkins

  1. 准备一个操作系统,并安装Docker,具体可以参考Docker文档

    • 若是Linux操作系统,应增加docker用户组并将当前作业用户添加进组,否则必须使用sudo升权执行

      sudo groupadd docker
      sudo usermod -aG docker ${USER}

      退出登陆或重启系统后即可直接运行docker

  2. 拉取Jenkins相关Docker镜像并运行

    • 拉取并运行blueocean版本的Jenkins镜像:

      docker run -p 8080:8080 -p 50000:50000 -v jenkins_data:/var/jenkins_home jenkinsci/blueocean
    • 为了支持SSH操作,拉取并运行jenkins/ssh-agent镜像:

      cat pub.key | docker run jenkins/ssh-agent

      * pub.key配置相关证书密钥中Jenkins容器的公钥

  3. 配置Jenkins:

    • 浏览器打开Jenkins镜像宿主机IP地址所在8080端口,如:http://localhost:8080
    • 使用上一步启动Jenkins获得的初始密码进入系统并创建用户
    • 进入Manage Jenkins -> Manage Plugins添加Maven Integration pluginGitLab PluginSSH pluginDocker Pipeline这些插件
    • 进入Manage Jenkins -> Global Tool Configuration配置JDK、Git、Maven、Docker
      jenkins-jdk.png
      Jenkins- Git.png
      Jenkins- Maven.png
      Jenkins-Docker.png
  4. 配置相关证书密钥和用户名密码,为连接GitHub、Gitlab,Docker私服、远程服务器做准备:

    • 配置Jenkins自身的证书:进入Jenkins所在容器,创建SSH密钥/证书,并添加进Jenkins系统中(用来从Github/Gitlab下载源码)

      # 进入jenkins容器,假设容器ID为abc
      docker exec -it abc /bin/bash
      # 生成证书,默认在/var/jenkins_home/.ssh/下有id_rsa和id_rsa.pub两个密钥和公钥
      ssh-keygen -t rsa
    • 将公钥作为Deploy Key添加进对应的Github或者Gitlab项目中
    • Manage Jenkins -> Credentials中添加此密钥(Jenkins自身密钥)
    • 继续添加Docker私服的用户名密码
    • 继续添加远程服务器SSH登陆的用户名密码
  5. 创建Jenkins构建脚本

    • 若是Maven项目,可以选择Maven项目构建;若是纯Docker构建,直接选择Freestyle
    • 配置source为Git,输入repo地址(git@开头),并选择Jenkins自身密钥作为凭证(Credentials)
    • 添加构建步骤,选择Docker构建和发布,输入Dockerfile所在文件夹,若就在根目录则不必输入
    • 选择使用Docker构建,设置镜像名称为Docker私服地址/用户/镜像名,勾选发布镜像,并选择Docker私服的凭证
    • 在触发条件出选择push event,将对应的Webhook填写到GitHub/Gitlab对应项目的Webhook设置中去
  6. 测试构建脚本(略)
  7. 在远程服务器上线
    通过布置一个脚本,进行远程登录+拉取并运行docker镜像,即可实现在远程服务器上上线的操作。

参考

  1. 高效部署Springboot的三种方式,知乎