Docker login、push、pull 详解
认证流程
docker login → docker 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
最佳实践
- CI 中使用非交互式登录:
--password-stdin避免密码泄露 - 使用 Credential Helpers:避免明文存储凭据
- 推拉同时使用不可变引用:
@sha256:确保内容一致性 - 定期
docker logout:临时环境使用后登出 - 最小化推送次数:批量打标签,一次推送
掌握 login/push/pull 的细节是高效管理 Docker 镜像的基础。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容