如何通过Docker Hub拉取完整Docker Compose多服务配置并运行?
问题描述
我的docker-compose.yml配置如下:
version: "3.8" services: app: build: context: . dockerfile: Dockerfile image: darajava/audio-diary ports: - 80:3001 volumes: - .:/app - "/app/node_modules" depends_on: - db container_name: "soliloquy_express" db: image: mariadb:latest restart: always environment: - MYSQL_DATABASE=soliloquy - MYSQL_USER=soliloquy - MYSQL_PASSWORD=password - MYSQL_ROOT_PASSWORD=password volumes: - ../db_data:/var/lib/mysql container_name: "soliloquy_db"
我还计划在此基础上添加Nginx服务。
我用以下命令将镜像推送到Docker Hub:
docker-compose build
docker-compose push
之后在EC2实例上执行docker pull darajava/audio-diary:latest可以拉取镜像,但运行该镜像时只会启动app服务。
而执行docker-compose pull darajava/audio-diary:latest会报错,提示缺少docker-compose.yml文件。
我有两个问题:
- 能否仅通过Docker Hub拉取包含app、db及其他服务的完整Docker Compose配置,并在EC2实例上拉取运行?
- 我是不是误用了Docker Compose的使用场景?
解答
第一个问题:无法仅通过Docker Hub拉取完整Compose配置
Docker Hub就是个镜像仓库,只能存储Docker镜像,根本没法保存docker-compose.yml这类配置文件。你之前推送到Hub的只有darajava/audio-diary这一个镜像(也就是app服务的镜像),db服务用的是官方的mariadb:latest,本来就不需要你推送,官方已经把它放在Hub上了。
要在EC2上运行整套服务,必须把docker-compose.yml文件传到EC2实例里,然后在文件所在目录执行:
docker-compose up -d
这个命令会自动拉取所有需要的镜像(你的app镜像和官方mariadb镜像),然后启动所有服务。
第二个问题:你确实误解了Docker Compose的部分用法
docker-compose push只会推送Compose配置里设置了自定义镜像名称的服务镜像(也就是你的app服务),像db这种用公共镜像的服务,不会推送,因为这些镜像本身就在Docker Hub上。docker-compose pull必须在有docker-compose.yml的目录下执行,它的作用是拉取配置里所有服务对应的镜像,不是单独拉某个镜像。单独拉镜像用docker pull就行,但这样只能启动单个容器,没法启动整套服务。
推荐部署流程
- 把
docker-compose.yml传到EC2实例(用scp、Git或者其他你顺手的文件同步方式都可以) - 在EC2上进入该文件所在目录,执行
docker-compose up -d,Compose会自动搞定所有镜像拉取和服务启动 - 如果后续更新了app镜像,在EC2上执行
docker-compose pull app && docker-compose up -d app就能更新重启app服务
内容的提问来源于stack exchange,提问作者DaraJ
相关产品推荐
相关产品推荐

