You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Docker Compose将多服务镜像推送至Docker Hub等镜像仓库?

如何用Docker Compose将服务镜像发布到Docker Hub

针对你的问题,直接给出结论:你确实需要为每个服务分别构建镜像,但完全可以把多个服务的镜像推送到Docker Hub(或同类容器镜像仓库)。下面是具体的操作步骤和最佳实践:

第一步:为每个服务配置镜像标签

Docker Hub的镜像命名规则是[Docker Hub用户名]/[镜像名]:[标签],你需要在docker-compose.staging.yml中给每个服务添加image字段,指定要推送的镜像路径。修改后的配置示例如下:

version: '3.7'
services:
  web:
    restart: always
    build: ./django
    # 替换成你的Docker Hub用户名,标签用staging对应你的环境
    image: your-dockerhub-username/django-web:staging
    expose:
      - "8000"
    volumes:
      - django-static:/usr/src/app/static
      - django-uploads:/usr/src/app/uploads
    environment:
      # 原有环境变量保持不变
      DJANGO_POSTGRES_REMOTE: 'True'
      DJANGO_POSTGRES_HOST: myservername.postgres.database.azure.com
      DJANGO_POSTGRES_PORT: '1234'
      DJANGO_POSTGRES_NAME: dbname
      DJANGO_POSTGRES_USER: dbuser
      DJANGO_POSTGRES_PASS: dbpassword
      DJANGO_SECRET_KEY:
      DJANGO_DEBUG: 1
      DJANGO_TESTING: 0
      DJANGO_WAVE_API_VERSION: '1'
      DJANGO_WAVE_SUPERUSER_USERNAME: ''
      DJANGO_WAVE_SUPERUSER_PASSWORD: ''
      DJANGO_WAVE_SUPERUSER_EMAIL: ''
      DJANGO_BUGSNAG_LOGGING_ENABLED: 0
      DJANGO_BUGSNAG_API_KEY: ''
      DJANGO_ROOT_DOMAIN: ''
      DJANGO_MEMCACHED_ON: 'False'
      VUE_ROOT_DOMAIN: ''
    command: /usr/src/app/wave.sh
  nginx:
    build:
      context: nginx
      dockerfile: Dockerfile
    # 同样配置nginx的镜像标签
    image: your-dockerhub-username/nginx-proxy:staging
    restart: on-failure
    ports:
      - 80:80
      - 443:443
    volumes:
      - ssl_data:/etc/resty-auto-ssl
    environment:
      ALLOWED_DOMAINS: "${STAGING_ALLOWED_DOMAINS}"
      SITES: "${STAGING_SITES}"
volumes:
  ssl_data:
  django-static:
  django-uploads:

第二步:登录Docker Hub

在终端执行登录命令,输入你的Docker Hub用户名和密码:

docker login

第三步:构建并推送镜像

方式一:一次性构建并推送所有服务镜像

先构建所有服务的镜像:

docker-compose -f docker-compose.staging.yml build

然后推送所有带image字段的服务镜像到Docker Hub:

docker-compose -f docker-compose.staging.yml push

方式二:单独构建推送单个服务

如果你只想处理某个服务(比如只更新了django代码,只推送web服务),可以单独操作:

# 构建web服务镜像
docker-compose -f docker-compose.staging.yml build web
# 推送web服务镜像
docker-compose -f docker-compose.staging.yml push web

# 同理处理nginx服务
docker-compose -f docker-compose.staging.yml build nginx
docker-compose -f docker-compose.staging.yml push nginx

额外的最佳实践

  • 灵活管理镜像标签:可以用环境变量来动态设置标签,比如把image字段改成your-dockerhub-username/django-web:${IMAGE_TAG:-staging},这样运行时可以通过IMAGE_TAG=v1.0 docker-compose build来指定版本标签,避免硬编码。
  • 简化命令:如果经常操作这个 staging 配置文件,可以设置环境变量export COMPOSE_FILE=docker-compose.staging.yml,之后直接用docker-compose build、docker-compose push即可,无需每次指定-f参数。
  • 配合docker-machine部署:推送镜像后,在你的docker-machine虚拟机上,只需执行docker-compose pull拉取最新镜像,再docker-compose up -d启动服务,不需要重新构建,大幅提升部署效率。
  • 仓库权限:如果是私有仓库,确保你的Docker Hub账号有对应的推送权限;如果是公开仓库,任何人都可以拉取你的镜像,根据项目需求选择合适的仓库类型。

内容的提问来源于stack exchange,提问作者Micheal J. Roberts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:50:58