对我来说,docker 还是有点复杂,可能是用的太少,或者使用的场景也偏简单,遇到复杂一点配置,就感觉心里没底。好在这两天通过看了几个 docker 官方镜像的使用文档,及 github 上的开源 docker composer 配置文件,有了一点感觉。
动手实践是理解 docker 的最佳方式,光看书是不行的,我在微信读书上翻了两本书,实在看不下去。讲的晦涩,例子也不实用,没有实践价值。公众号上好多 docker 的文章,也是人云亦云,看起来就跑不通的样子。远不如照着 github 上的开源 docker 配置在服务器上试试。(由于近期国内 docker 镜像站点纷纷被封,本机实践的难度骤升)
为何在 docker 中安装 composer
公司有一台旧的服务器,ubuntu 18.04,版本远远落后于最新的 ubuntu 24.04 LTS。但是上面有大量的系统,我也不太敢去迁移。但是由于上面跑的基本都是 golang 写的服务,所以系统版本再低也不是问题,毕竟 golang 的打包能力无敌。而部署 php 的项目就很头疼了,最新版本的 php 根本就无法在这个 18.04 的系统上安装,所以只能选择 docker 的方案。而主流的 php 项目,目前基本都是靠 composer 进行安装。例如 laravel 和 magento2 这种项目。
composer 是 PHP 的包管理工具。composer 只是安装三方 php 包。安装 composer 首先需要系统环境中有 PHP cli。所以,理所当然的 composer 需要安装到 php 的 docker 镜像中。
例如新建一个 laravel 项目,就可以直接通过 composer 命令:
composer create-project laravel/laravel:^10.0 example-app
docker-compose.yml
新建一个 docker compose 配置文件:
services:
phpfpm:
build: ./php8.3
ports:
- 9000:9000
volumes:
- /var/www/html:/var/www/html
Dockerfile
在 php8.3 目录下,新建一个 Dockerfile,这里使用 docker 官方的 php fpm 镜像。 在里面加上 composer 的安装命令。
FROM php:8.3-fpm
RUN curl -sS https://getcomposer.org/installer | \
php -- --version=2.7.7 --install-dir=/usr/local/bin --filename=composer
WORKDIR /var/www/html
注意,composer 的版本号需要精确到第三位,例如 2.7.7 不能写成 2.7。
否则在镜像 build 的时候,会报错:
The defined install version (2.7) does not match release pattern.
failed to solve: process "xxx" did not complete successfully: exit code: 1
composer 具体版本号在这里查找:
https://getcomposer.org/download/
查看 composer 版本
要确认 composer 安装成功,可以直接通过下面的命令查看 composer 的版本号。
$ docker compose exec phpfpm composer --version
Composer version 2.7.7 2024-06-10 22:11:12
PHP version 8.3.8 (/usr/local/bin/php)
Run the "diagnose" command to get more detailed diagnostics output.
这种用法,就类似使用 docker 安装 mysql 之后,通过 exec 使用 mysql client 命令一样:
$ docker compose exec mysql /bin/bash
创建个项目测试一下
例如,利用 composer 创建一个 magento2 项目 (社区开源版本):
$ docker compose exec phpfpm composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition <install-directory-name>
composer 会自动下载最新版本的 magento2, 如这里的 2.4.7-p1。
注意:
这里 install-directory-name 指的是 docker 容器内的目录地址,而非宿主机的目录名。
安装目录在哪里
我第一次使用 docker 中的 composer 安装 magento,安装之后,发现找不到安装目录在哪里。。。
虽然上面指定了 install-directory-name, 但是实践上,这是 docker 容器中的目录地址,而不是宿主机的地址。
真的反直觉。但是仔细想想这是合理的,毕竟 docker 中的 php 要访问的就是同一容器内的文件目录。
通过登录上 composer 所在的 docker 容器,就看看到这个目录:
docker compose exec phpfpm /bin/bash
只需要注意,这个目录最好通过 docker compose 映射到宿主机的目录上。因为我习惯在宿主机上安装 nginx,这样就可以使用 nginx 处理静态资源文件了。
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式