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

如何推送含多组件的PHP项目Docker镜像至Docker Hub?

问题描述

我开发了一个PHP应用,希望为其制作Docker镜像,应用运行依赖PHP-apache、MySQL和PhpMyAdmin组件。执行docker-compose up命令时所有组件运行正常,docker ps -a输出如下:

CONTAINER ID   IMAGE                            COMMAND                  CREATED         STATUS          PORTS                               NAMES
fa19aa03b658   docker2-php-apache-environment   "docker-php-entrypoi…"   9 minutes ago   Up 26 seconds   0.0.0.0:8000->80/tcp                php-apache
cd6a1d03c74c   phpmyadmin/phpmyadmin            "/docker-entrypoint.…"   9 minutes ago   Up 26 seconds   0.0.0.0:8080->80/tcp                docker2-phpmyadmin-1
ff13a69f0fde   mysql                            "docker-entrypoint.s…"   9 minutes ago   Up 27 seconds   33060/tcp, 0.0.0.0:9906->3306/tcp   db

我想将项目推送至Docker Hub,但单独推送docker2-php-apache-environment镜像后,其他机器拉取时会缺失MySQL和PhpMyAdmin组件。请问能否推送整个项目,让他人拉取后即可正常运行?

我的docker-compose.yml内容如下:

version: '3.8'
services:
    php-apache-environment:
        container_name: php-apache
        build:
            context: ./php
            dockerfile: Dockerfile
        depends_on:
            - db
        volumes:
            - ./php/src:/var/www/html/ 
        ports:
            - 8000:80
    db:
        container_name: db
        image: mysql
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: 12345
            MYSQL_DATABASE: turisticka_agencija
        ports:
            - "9906:3306"
    phpmyadmin:
      image: phpmyadmin/phpmyadmin
      ports:
          - '8080:80'
      restart: always
      environment:
          PMA_HOST: db
      depends_on:
          - db

Dockerfile内容如下:

FROM php:8.0-apache
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
RUN apt-get update && apt-get upgrade -y

# Install build dependencies and the OPcache extension
RUN apk add --no-cache $PHPIZE_DEPS \
    && docker-php-ext-install opcache \
    && apk del $PHPIZE_DEPS

# Copy the opcache.ini into your Docker image    
COPY opcache.ini /usr/local/etc/php/conf.d/opcache.ini

# Run your application
CMD php-fpm
解决方案

Docker Hub无法直接推送整个Docker Compose项目,但可以通过以下步骤实现让他人拉取后一键运行:

1. 推送自定义PHP-Apache镜像到Docker Hub

先把你构建的docker2-php-apache-environment镜像推送到Docker Hub:

  • 给镜像打标签(替换成你的Docker Hub用户名):
    docker tag docker2-php-apache-environment your-dockerhub-username/php-apache:v1
    
  • 推送镜像:
    docker push your-dockerhub-username/php-apache:v1
    

2. 修改docker-compose.yml,使用推送后的镜像

把原来的build配置替换成镜像引用,这样别人运行时会直接拉取你推送的镜像,无需重新构建:

version: '3.8'
services:
    php-apache-environment:
        container_name: php-apache
        # 替换成你推送的镜像地址
        image: your-dockerhub-username/php-apache:v1
        depends_on:
            - db
        volumes:
            - ./php/src:/var/www/html/ 
        ports:
            - 8000:80
    # 其他服务配置保持不变
    db:
        container_name: db
        image: mysql
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: 12345
            MYSQL_DATABASE: turisticka_agencija
        ports:
            - "9906:3306"
    phpmyadmin:
      image: phpmyadmin/phpmyadmin
      ports:
          - '8080:80'
      restart: always
      environment:
          PMA_HOST: db
      depends_on:
          - db

3. 分享项目文件

把以下文件打包或放到Git仓库中分享给他人:

  • 修改后的docker-compose.yml
  • php/src目录(你的PHP应用代码)
  • 若opcache.ini未打包进镜像,也需包含该文件

4. 他人运行项目的步骤

  1. 拉取你推送的自定义镜像(可选,docker-compose up会自动拉取):
    docker pull your-dockerhub-username/php-apache:v1
    
  2. 在项目目录下执行:
    docker-compose up -d
    
    此时MySQL和PhpMyAdmin会自动从官方Docker Hub仓库拉取镜像,所有组件会正常启动。

额外修正:Dockerfile中的错误

你的Dockerfile存在两处问题:

  1. php:8.0-apache基于Debian系统,却使用了Alpine的apk命令,会导致构建失败,需替换为apt相关命令
  2. CMD php-fpm会覆盖Apache默认启动命令,导致Apache无法正常运行,需改回默认的apache2-foreground

修正后的Dockerfile:

FROM php:8.0-apache
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
RUN apt-get update && apt-get upgrade -y

# Install build dependencies and the OPcache extension
RUN apt-get install -y --no-cache $PHPIZE_DEPS \
    && docker-php-ext-install opcache \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# Copy the opcache.ini into your Docker image    
COPY opcache.ini /usr/local/etc/php/conf.d/opcache.ini

# 使用Apache默认启动命令
CMD ["apache2-foreground"]

内容的提问来源于stack exchange,提问作者Uroš Milošević

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:25:34