一、skopeo镜像转存

skopeo 不依赖docker deamon的镜像搬运工具


  1. 安装 skopeo

    • ubuntu
      1
      2
      3
      sudo apt update
      sudo apt install -y skopeo
      skopeo --version
    • centos
      1
      2
      3
      sudo dnf install -y skopeo
      # sudo yum install -y epel-release
      # sudo yum install -y skopeo
    • arch linux
      1
      sudo pacman -S skopeo
  2. 借助代理安装,假设代理地址为: 192.168.23.177:8889

    1
    2
    # 切工作目录下带docker-compose.yaml or ocker-compose.yml
    skopeo.image.download.sh 192.168.23.177:8889
  3. 代理如何配置(此处暂略)

    • 在宿主机或者外网部署singbox保证能访问google
    • 配置一个反向代理 /opt/homebrew/bin/sing-box run
  4. 认证

    • 先 export 代理 export HTTPS_PROXY=代理 export HTTP_PROXY=代理
    • dockerhub: skopeo login –username “用户名” –password “密码” docker.io
    • register hub: skopeo login –username “用户名” –password “密码” 私有仓库地址
    • 不登陆指定账号方式: skopeo copy –src-creds “用户名:密码” docker://docker.io/austsxk/test:latest docker-archive:/tmp/test.tar

二、crane镜像转存

crane 是google开发的轻量容器镜像工具,不依赖docker daemon,实现镜像拉取

  1. 安装crane
    官网下载对应的环境 此处不多bibi
    Download:

  2. 下载compose依赖镜像

    crane.image.download.sh 192.168.23.177:8889

  3. 认证

    • dockerhub: crane auth login docker.io –username “用户名” –password “密码”
    • 私有仓库: crane auth login registry.example.com –username “用户名” –password “密码”

三、docker daemon配置代理

  1. 配置代理使用linux systemd
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    sudo mkdir -p /etc/systemd/system/docker.service.d
    sudo tee /etc/systemd/system/docker.service.d/proxy.conf <<'EOF'
    [Service]
    Environment="HTTP_PROXY=http://192.168.23.177:8889"
    Environment="HTTPS_PROXY=http://192.168.23.177:8889"
    Environment="NO_PROXY=localhost,127.0.0.1,::1"
    EOF

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    # 配置检查
    systemctl show docker --property=Environment
    # 拉镜像
    docker compose -f docker-compose.yaml pull

附录脚本

  1. skopeo.image.download.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #!/usr/bin/env bash
    set -euo pipefail

    proxy_ip="${1:-http://192.168.23.177:8889}"
    export HTTP_PROXY="$proxy_ip"
    export HTTPS_PROXY="$proxy_ip"

    docker compose config --images |
    awk '!seen[$0]++' |
    while read -r image; do
    file=$(echo "$image" | tr '/:' '__')
    archive="/tmp/${file}.tar"

    echo "checking image: $image"

    if docker image inspect "$image" >/dev/null 2>&1; then
    echo "image already exists, skip: $image"
    continue
    fi

    rm -rf ${archive} || true

    echo "downloading image: $image"
    skopeo copy "docker://$image" "docker-archive:${archive}:${image}"

    docker load -i "$archive"

    if ! docker image inspect "$image" >/dev/null 2>&1; then
    echo "ERROR: image tag not found after load: $image" >&2
    echo "Please recreate archive with the repository tag." >&2
    exit 1
    fi

    echo "loaded: $image"
    done

  1. crane.image.download.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/usr/bin/env bash
    set -euo pipefail

    proxy_ip="${1:-http://192.168.23.177:8889}"
    export HTTP_PROXY="$proxy_ip"
    export HTTPS_PROXY="$proxy_ip"

    docker compose config --images |
    awk '!seen[$0]++' |
    while read -r image; do
    file=$(echo "$image" |tr '/:' '__')
    rm -rf "/tmp/${file}.tar" || true
    echo "pulling $image ..."
    GODEBUG=http2client=0 crane pull "$image" "/tmp/${file}.tar"
    docker load -i "/tmp/${file}.tar"
    rm -f "/tmp/${file}.tar"
    done
  2. 实操流程
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    # 工作区目录
    # 以部署nsq消息队列为例
    .
    ├── crane.image.download.sh
    ├── docker-compose.yaml
    └── skopeo.image.download.sh

    # 直接安装 报错 此处略过

    # export环境变量
    export HTTP_PROXY=http://192.168.23.177:8889
    export HTTPS_PROXY=http://192.168.23.177:8889

    # 使用skopeo方式
    austsxk@master:~/services/nsq$ ./skopeo.image.download.sh
    checking image: nsqio/nsq:v1.3.0
    downloading image: nsqio/nsq:v1.3.0
    Getting image source signatures
    Copying blob 661ff4d9561e done
    Copying blob 5b5b92c83f42 done
    Copying blob 4f4fb700ef54 done
    Copying blob 2a394a2df2c8 done
    Copying blob aea96977eb49 done
    Copying config 728389d1c6 done
    Writing manifest to image destination
    Storing signatures
    5af4f8f59b76: Loading layer 7.667MB/7.667MB
    7158568d6d56: Loading layer 3.072kB/3.072kB
    5f70bf18a086: Loading layer 1.024kB/1.024kB
    a547a69c4ff0: Loading layer 54.25MB/54.25MB
    de81357bd4ce: Loading layer 10.75kB/10.75kB
    Loaded image: nsqio/nsq:v1.3.0
    loaded: nsqio/nsq:v1.3.0

    # 启动服务
    austsxk@master:~/services/nsq$ docker-compose up -d
    Creating network "nsq_nsq" with driver "bridge"
    Creating nsqlookupd ... done
    Creating nsqd ... done
    Creating nsqadmin ... done

特别说明,本文档中http://192.168.23.177:8889是本地测试的内网地址,需替换你本地真实可访问的代理地址