推送镜像到公有仓库

一、确认本地镜像

你现在有:

1
2
REPOSITORY   TAG    IMAGE ID
mariadb      10.6   eb40c69647cc

目标仓库:

1
crpi-7jaksta3zhkkymyt.cn-shenzhen.personal.cr.aliyuncs.com/common_imgage/im1

二、登录阿里云镜像仓库

执行:

1
docker login --username=AtticusWilde crpi-7jaksta3zhkkymyt.cn-shenzhen.personal.cr.aliyuncs.com

输入:

1
阿里云容器镜像服务密码

成功会看到:

1
Login Succeeded

三、给镜像打 Tag

将本地镜像打上阿里云仓库标签:

1
2
docker tag eb40c69647cc \
crpi-7jaksta3zhkkymyt.cn-shenzhen.personal.cr.aliyuncs.com/common_imgage/mariadb:10.6

或者直接:

1
2
docker tag mariadb:10.6 \
crpi-7jaksta3zhkkymyt.cn-shenzhen.personal.cr.aliyuncs.com/common_imgage/mariadb:10.6

查看:

1
docker images

会出现:

1
2
3
REPOSITORY                                                                 TAG
mariadb                                                                    10.6
crpi-7jaksta3zhkkymyt.cn-shenzhen.personal.cr.aliyuncs.com/common_imgage/mariadb   10.6

四、推送镜像

执行:

1
docker push crpi-7jaksta3zhkkymyt.cn-shenzhen.personal.cr.aliyuncs.com/common_imgage/mariadb:10.6

会看到:

1
2
Pushing layer...
Pushed

完成后镜像就存在 阿里云仓库


五、服务器拉取镜像

以后服务器就可以直接:

1
docker pull crpi-7jaksta3zhkkymyt.cn-shenzhen.personal.cr.aliyuncs.com/common_imgage/mariadb:10.6

不会再受 DockerHub 网络问题影响。


六、docker-compose 使用私有镜像

把 compose 改成:

1
2
db:
  image: crpi-7jaksta3zhkkymyt.cn-shenzhen.personal.cr.aliyuncs.com/common_imgage/mariadb:10.6

七、推荐镜像仓库结构(运维规范)

建议不要叫 im1 这种名字。

推荐:

1
2
3
4
5
6
7
common_image
 ├ nginx
 │   └ alpine
 ├ redis
 │   └ 7-alpine
 └ mariadb
     └ 10.6

推送示例:

1
2
3
4
docker tag nginx:alpine \
crpi-7jaksta3zhkkymyt.cn-shenzhen.personal.cr.aliyuncs.com/common_image/nginx:alpine

docker push crpi-7jaksta3zhkkymyt.cn-shenzhen.personal.cr.aliyuncs.com/common_image/nginx:alpine

八、运维常用批量推送脚本(推荐)

如果你本地有多个镜像:

1
docker images

例如:

1
2
3
nginx:alpine
redis:7-alpine
mariadb:10.6

可以写脚本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
vim push.sh
REG=crpi-7jaksta3zhkkymyt.cn-shenzhen.personal.cr.aliyuncs.com/common_imgage

docker tag nginx:alpine $REG/nginx:alpine
docker tag redis:7-alpine $REG/redis:7-alpine
docker tag mariadb:10.6 $REG/mariadb:10.6

docker push $REG/nginx:alpine
docker push $REG/redis:7-alpine
docker push $REG/mariadb:10.6

执行:

1
bash push.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
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
[root@192 ~]# cat push.sh
#!/bin/bash
# ==========================================
# DockerHub 镜像同步到阿里云私有仓库
# Author : AtticusWilde
# Date   : 2026-03-13
# ==========================================

set -e

# 私有仓库
REG="crpi-7jaksta3zhkkymyt.cn-shenzhen.personal.cr.aliyuncs.com/common_imgage"

# 最大重试次数
RETRY=3

# 镜像列表
IMAGES=(
    mariadb:10.11
    postgres:15-alpine
    postgres:16-alpine
    php:8.2-fpm
    php:8.3-fpm
    node:20-alpine
    node:18-alpine
    python:3.11-alpine
    mongo:7
    mysql:8.0
    memcached:alpine
    rabbitmq:3-management
    golang:1.22-alpine
    openjdk:17-jdk
    openjdk:21-jdk
    alpine:3.19

    portainer/portainer-ce:latest
    bitnami/kafka:latest
    minio/minio:latest
    jenkins/jenkins:lts
    gitlab/gitlab-ce:latest
    prom/prometheus:latest
    grafana/grafana:latest
    grafana/loki:latest

    docker.elastic.co/elasticsearch/elasticsearch:8.12.0
    docker.elastic.co/kibana/kibana:8.12.0

    fluent/fluentd:latest
    nicolaka/netshoot:latest

    joyqi/typecho:latest
    ghost:latest
)

echo "======================================"
echo "Docker 镜像同步脚本启动"
echo "目标仓库: $REG"
echo "======================================"

# 登录仓库
docker login --username=AtticusWilde crpi-7jaksta3zhkkymyt.cn-shenzhen.personal.cr.aliyuncs.com

sync_image(){

    IMG=$1

    echo ""
    echo "--------------------------------------"
    echo "处理镜像: $IMG"
    echo "--------------------------------------"

    # 获取tag
    TAG=$(echo $IMG | awk -F: '{print $2}')

    if [ -z "$TAG" ]; then
    TAG="latest"
    IMG="$IMG:$TAG"
    fi

    # 获取镜像名(去掉 registry)
    NAME=$(echo $IMG | awk -F/ '{print $NF}' | cut -d':' -f1)

    TARGET="$REG/$NAME:$TAG"

    echo "目标镜像: $TARGET"

    # pull 重试机制
    for ((i=1;i<=RETRY;i++))
    do
    echo "拉取镜像 (尝试 $i/$RETRY)..."

    if docker pull $IMG; then
    echo "Pull 成功"
    break
    fi

    if [ $i -eq $RETRY ]; then
    echo "Pull 失败,跳过 $IMG"
    return
    fi

    sleep 3
    done

    # 打 tag
    docker tag $IMG $TARGET

    # push 重试
    for ((i=1;i<=RETRY;i++))
    do
    echo "推送镜像 (尝试 $i/$RETRY)..."

    if docker push $TARGET; then
    echo "Push 成功"
    break
    fi

    if [ $i -eq $RETRY ]; then
    echo "Push 失败: $TARGET"
    return
    fi

    sleep 3
    done

    echo "镜像同步完成: $TARGET"
}

# 遍历镜像
for img in "${IMAGES[@]}"
do
sync_image $img
done

echo ""
echo "======================================"
echo "所有镜像同步完成"
echo "======================================"

清理已有 Docker 日志

如果日志已经很大:

查看:

1
du -sh /var/lib/docker/containers/*

清理:

1
truncate -s 0 /var/lib/docker/containers/*/*-json.log

不会影响容器运行。