如何推送含多组件的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. 他人运行项目的步骤
- 拉取你推送的自定义镜像(可选,
docker-compose up会自动拉取):docker pull your-dockerhub-username/php-apache:v1 - 在项目目录下执行:
此时MySQL和PhpMyAdmin会自动从官方Docker Hub仓库拉取镜像,所有组件会正常启动。docker-compose up -d
额外修正:Dockerfile中的错误
你的Dockerfile存在两处问题:
php:8.0-apache基于Debian系统,却使用了Alpine的apk命令,会导致构建失败,需替换为apt相关命令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ć
相关产品推荐
相关产品推荐

