1. Docker Hub 用户注册

到官网注册账号:https://hub.docker.com/

2. 在本地服务器登录docker

docker login
#Log in with your Docker ID or email address to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com/ to create one.
#You can log in with your password or a Personal Access Token (PAT). Using a limited-scope PAT grants better security and is required for organizations using SSO. Learn more at https://docs.docker.com/go/access-tokens/

Username: xxx  (你的用户名)
Password:      (你的用户密码)
#WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
#Configure a credential helper to remove this warning. See
#https://docs.docker.com/engine/reference/commandline/login/#credentials-store

#Login Succeeded

4. 查看容器

docker ps

5. 将容器commit成镜像

# 用法
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

# CONTAINER 是你想要转换的容器的 ID 或名称。
# REPOSITORY 是你为新创建的镜像设定的仓库名称。
# TAG 是镜像的标签,通常用于版本控制,默认为 latest。
docker commit -m 'wp_mysql 备份 20240423' wp_mysql bluebro/wp_mysql:v1

# 返回结果为: sha256:c3509fccab34ddcc0cf2c812a8fca533547d5501f771ad27373c69dbdf381db9

6. tag为镜像创建新的标签

# 用法
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

# SOURCE_IMAGE 是源镜像的名称。
# TAG 是可选的,如果不指定,默认为 latest。
# TARGET_IMAGE 是目标镜像的名称,可以是同一个镜像的不同标签,或是推送到不同仓库的名称。
# TAG 在目标镜像中也是可选的,同样默认为 latest。

7. 查看镜像

docker images

8. push到Docker Hub

# 用法
docker push username/nginxrepo:v1

9. Docker Hub效果

10. 定期推送脚本

如果想将容器定期推送到 Docker Hub,防失联的话,参考以下代码

#!/bin/bash

# 配置变量
USERNAME="xxx"
REPOSITORY="xxx_repository"
DATE_TAG=$(date +%Y%m%d)

# 定义要处理的容器和对应的镜像名
declare -A containers
containers=(["nginx"]="nginx" ["mysql"]="mysql" ["wordpress"]="wordpress")

# 登录 Docker Hub
echo "Logging into Docker Hub..."
docker login # 确保事先配置好了 Docker 的认证信息,或在这里提供用户名和密码

# 循环遍历容器,处理镜像
for container in "${!containers[@]}"; do
    image_base="$USERNAME/$REPOSITORY:${containers[$container]}"
    image_latest="${image_base}-latest"
    image_date_tag="${image_base}-$DATE_TAG"

    echo "Processing container: $container..."
    # 获取本地镜像ID
    image_id=$(docker images -q $image_latest)

    # 检查是否获取到镜像ID
    if [ ! -z "$image_id" ]; then
        echo "Removing local image: $image_latest"
        docker rmi $image_latest
    else
        echo "No local image to remove: $image_latest"
    fi

    # 从 Docker Hub 拉取最新的镜像
    if docker pull $image_latest; then
        echo "Retagging $image_latest to $image_date_tag"
        docker tag $image_latest $image_date_tag
        docker push $image_date_tag
        docker rmi $image_latest $image_date_tag # 清理拉取和重标记的镜像
    fi

    # 提交容器为最新镜像并推送
    echo "Committing container $container to $image_latest"
    docker commit $container $image_latest
    docker push $image_latest

done

echo "Images processing complete."