Docker login、push、pull 详解

Docker login、push、pull 详解

认证流程

docker logindocker push / docker pull 构成了 Docker 镜像推送和拉取的完整流程。

docker login

登录 Docker Hub

# 交互式登录
docker login
# Username: myusername
# Password: mypassword

# 非交互式登录
echo "mypassword" | docker login --username myusername --password-stdin

# 使用环境变量
echo "$DOCKER_PASSWORD" | docker login --username "$DOCKER_USERNAME" --password-stdin

登录私有仓库

# 登录私有仓库
docker login myregistry.example.com:5000

# 带证书的私有仓库
docker login https://myregistry.example.com:443

# 不安全的仓库(需要配置 daemon.json)
docker login 192.168.1.100:5000

登录信息存储

# 默认存储位置
cat ~/.docker/config.json
# {
#   "auths": {
#     "https://index.docker.io/v1/": {
#       "auth": "base64_encoded_credentials"
#     }
#   }
# }

# 登出
docker logout
docker logout myregistry.example.com:5000

使用凭据助手

# macOS 钥匙串
docker-credential-osxkeychain

# 密码管理器
docker-credential-pass

# 配置凭据助手
echo '{"credsStore": "osxkeychain"}' >> ~/.docker/config.json

docker push

基本推送

# 先打标签
docker tag myapp:1.0.0 myusername/myapp:1.0.0

# 推送
docker push myusername/myapp:1.0.0

# 推送所有标签
docker push --all-tags myusername/myapp

推送流程解析

# 推送过程
docker push myusername/myapp:1.0.0

# 实际执行:
# 1. 获取镜像层列表
# 2. 检查哪些层已在仓库中存在
# 3. 上传不存在的层(并行)
# 4. 上传清单文件

# 输出示例
The push refers to repository [docker.io/myusername/myapp]
abc123: Pushed
def456: Layer already exists   # 层共享
789ghi: Pushed
1.0.0: digest: sha256:xyz... size: 1234

推送多个标签

# 方法一:多次 tag + push
docker tag myapp:1.0.0 myusername/myapp:latest
docker tag myapp:1.0.0 myusername/myapp:1
docker tag myapp:1.0.0 myusername/myapp:1.0

docker push myusername/myapp:latest
docker push myusername/myapp:1
docker push myusername/myapp:1.0

# 方法二:一次 push 多个标签(Compose v2)
docker push myusername/myapp --all-tags

推送失败处理

# 认证失败
docker login  # 重新登录

# 镜像过大,超时
DOCKER_CLI_EXPERIMENTAL=enabled
docker buildx build --push --platform linux/amd64 -t myusername/myapp:latest .

# 存储空间不足
docker system prune -a  # 清理本地缓存

# 非 TLS 仓库
echo '{ "insecure-registries": ["192.168.1.100:5000"] }' > /etc/docker/daemon.json
systemctl restart docker

docker pull

基本拉取

# 拉取最新标签
docker pull nginx:latest

# 拉取特定版本
docker pull nginx:1.24-alpine

# 拉取所有标签
docker pull --all-tags nginx

# 同时拉取多平台
docker pull --platform linux/arm64 nginx

拉取流程

# 拉取过程
docker pull nginx:latest

# 实际执行:
# 1. 连接仓库
# 2. 下载清单文件
# 3. 检查本地缓存中哪些层已存在
# 4. 下载不存在的层(并行)
# 5. 解压层到本地存储

使用镜像摘要

# 获取镜像摘要
docker pull nginx:alpine
docker images --digests nginx

# 使用摘要拉取(不可变引用)
docker pull nginx@sha256:abc123def456...

# 推送时获取摘要
docker push myusername/myapp:latest
# latest: digest: sha256:xyz... size: 1234

# 使用摘要拉取
docker pull myusername/myapp@sha256:xyz...

CI/CD 中的认证

GitHub Actions

- name: Login to Docker Hub
  uses: docker/login-action@v2
  with:
    username: ${{ secrets.DOCKER_USERNAME }}
    password: ${{ secrets.DOCKER_PASSWORD }}

- name: Build and push
  uses: docker/build-push-action@v4
  with:
    push: true
    tags: myusername/myapp:${{ github.sha }}

GitLab CI

build:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

Jenkins

stage('Push Image') {
    steps {
        withDockerRegistry([credentialsId: 'docker-hub', url: '']) {
            sh """
                docker tag myapp:latest myusername/myapp:${env.BUILD_NUMBER}
                docker push myusername/myapp:${env.BUILD_NUMBER}
            """
        }
    }
}

日常使用技巧

# 查看本地镜像
docker images

# 检查远程镜像是否存在
docker pull --platform linux/amd64 alpine &> /dev/null && echo "exists"

# 查看镜像层
docker history myapp:latest

# 查看镜像大小
docker images myapp:latest --format "{{.Size}}"

# 清除未使用镜像
docker image prune -a

最佳实践

  1. CI 中使用非交互式登录--password-stdin 避免密码泄露
  2. 使用 Credential Helpers:避免明文存储凭据
  3. 推拉同时使用不可变引用@sha256: 确保内容一致性
  4. 定期 docker logout:临时环境使用后登出
  5. 最小化推送次数:批量打标签,一次推送

掌握 login/push/pull 的细节是高效管理 Docker 镜像的基础。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容