我使用的Linux版本是AlmaLinux,在AlmaLinux上安装Docker有点特别
确保系统上的所有包都是最新的

sudo dnf update -y

刷新缓存

sudo dnf makecache

将Docker的官方仓库文件docker-ce.repo添加到AlmaLinux系统中,文件保存在/etc/yum.repos.d/目录下,不需要时可手动删除。

sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo

现有仓库列表

dnf repolist all

在这里插入图片描述

查看已添加的Docker软件源

dnf list docker-ce

在这里插入图片描述

安装Docker引擎

sudo dnf install -y docker-ce --nobest

验证Docker是否正确安装

docker version

在这里插入图片描述

启动Docker服务,并设置为开机自动启动

sudo systemctl start docker
sudo systemctl enable docker

如果systemctl start docker无法启动docker,重启一下AlmaLinux即可

在这里插入图片描述

接着安装Docker Compose

在这里插入图片描述

这里以版本5.1.3为例

cd /
curl -L https://github.com/docker/compose/releases/download/v5.1.3/docker-compose-linux-aarch64 -o docker-compose

docker-compose移动到/usr/local/bin/目录下

mv docker-compose /usr/local/bin/

修改权限

chmod +x /usr/local/bin/docker-compose

查看

docker-compose --version

在这里插入图片描述

创建项目pnm

cd /
mkdir pnm

批量创建项目所需目录

cd pnm
mkdir -p ./{www,php,mysql/{data,conf},nginx/conf.d}

增加docker-compose.yml文件,内容如下

services:
  nginx:
    image: nginx:1.30.2
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./www:/var/www/html
    depends_on:
      - php
    networks:
      - lnmp-network

  php:
    build: ./php #使用该目录下的Dockerfile构建镜像
    image: php:8.4.22-fpm
    volumes:
      - ./www:/var/www/html
      - ./php/php.ini:/usr/local/etc/php/php.ini
      # - ./php/conf.d/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
    environment:
      PHP_OPCACHE_ENABLE: "1"
    networks:
      - lnmp-network

  mysql:
    image: mysql:8.0.46
    environment:
      MYSQL_ROOT_PASSWORD: 123456 # 自己替换
      MYSQL_DATABASE: testdb      # 自己替换
      MYSQL_USER: user            # 自己替换
      MYSQL_PASSWORD: 123456      # 自己替换
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/conf:/etc/mysql/conf.d
    ports:
      - "3306:3306"
    networks:
      - lnmp-network


networks:
  lnmp-network:
    driver: bridge

说明
nginx/conf.d:nginx站点配置
mysql/data:MySQL数据持久化
mysql/conf:MySQL自定义配置
www:项目代码目录

增加php/php.ini文件,内容如下

memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M

zend_extension=xdebug


[Date]
date.timezone = "Asia/Shanghai"

增加php/Dockerfile文件,内容如下

FROM php:8.4.22-fpm

# 安装 PHP 扩展
# RUN docker-php-ext-install pdo_mysql mysqli php-mbstring php-gd php-zip php-xdebug php-bcmath

增加nginx/conf.d/default.conf文件,内容如下

server {
    listen 80;
    index index.php index.html;
    server_name localhost;
    #error_log  /var/log/nginx/error.log;
    #access_log /var/log/nginx/access.log;
    root /var/www/html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000; # 注意这里的端口号是 PHP 容器的默认端口号(9000)
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

增加www/index.php文件,内容如下

<?php
echo date('Y-m-d H:i:s') . '</br>';

echo 'hello docker-compose';

phpinfo();
?>

运行docker-compose up -d

需要注意的是安装PHP扩展需要用到PIE
PIE是一个新的PHP扩展安装器,即将完全取代PECL,这里使用PIE来安装扩展。
确保AlmaLinux已安装好了PIE

curl -fL --output /tmp/pie.phar https://github.com/php/pie/releases/latest/download/pie.phar \
  && sudo mv /tmp/pie.phar /usr/local/bin/pie \
  && sudo chmod +x /usr/local/bin/pie

上面是以安装xdebug扩展为例子

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

出现如下错误说明无法访问docker官方镜像仓库docker.io

在这里插入图片描述

解决办法:使用第三方提供的docker镜像加速,可以配置多个地址,Docker会自动按顺序尝试,直到成功

vi /etc/docker/daemon.json

加入如下内容

{
  "registry-mirrors": [
    "https://docker.xuanyuan.me",
    "https://docker.1ms.run",
    "https://docker.m.daocloud.io"
  ]
}

重载配置并重启 Docker:

systemctl daemon-reload
systemctl restart docker

查看所有容器

docker-compose ps -a

检查是否安装好PHP扩展

# 进入`PHP`容器
docker-compose exec php bash  #此处的php是在docker-compose.yml定义为'php'的服务名

# 查看php版本
php -v
# 查看php扩展
php -m

退出PHP容器

exit

清除缓存

docker-compose build --no-cache

这个命令会重新下载基础镜像(如果需要的话),并且不使用任何缓存来构建你的服务镜像。
这对于确保你的应用是基于最新的依赖和环境配置非常重要,尤其是在依赖项或基础镜像更新后。

需要注意的是官方 PHP 镜像(php:8.4.22-fpm)默认基于Debian/Ubuntu系统,使用的是apt-get包管理器,所以不能使用dnfyum命令。

所以你要在两者之间做出选择
方案一:以 almalinux:10.2 为基础,手动安装 PHP(推荐用于 AlmaLinux)

如果你确实需要使用 AlmaLinux,就以此为基础镜像,然后手动安装 PHP 和所有需要的扩展。

FROM almalinux:10.2

# 安装开发工具
RUN dnf -y update && \
    dnf -y groupinstall "Development Tools" && \
    dnf clean all

# 安装 PHP 8.4 及相关包(AlmaLinux 10.2 官方源已包含)
RUN dnf -y install \
    php \
    php-cli \
    php-fpm \
    php-devel \
    php-mysqlnd \
    php-gd \
    php-xml \
    php-mbstring \
    && dnf clean all

# 复制 PIE 并安装 Xdebug
COPY bin/pie.phar /usr/bin/pie
RUN chmod +x /usr/bin/pie

RUN pie install xdebug/xdebug

# 配置 Xdebug
RUN echo "xdebug.mode=debug" >> /etc/php.d/99-xdebug.ini && \
    echo "xdebug.client_host=host.docker.internal" >> /etc/php.d/99-xdebug.ini

# 启动 PHP-FPM
CMD ["php-fpm"]

方案二:以 php:8.4.22-fpm 为基础,改用 apt-get(推荐用于官方 PHP 镜像)

如果你喜欢官方 PHP 镜像的稳定性和预配置,就用它作为基础,但包管理器要改用apt-get

FROM php:8.4.22-fpm

# 安装编译依赖(Debian 方式)
RUN apt-get update && \
    apt-get install -y \
    gcc g++ make autoconf automake \
    libc-dev pkg-config git unzip curl wget \
    && rm -rf /var/lib/apt/lists/*

# 复制 PIE 并安装 Xdebug
COPY bin/pie.phar /usr/bin/pie
RUN chmod +x /usr/bin/pie

RUN pie --version || (echo "❌ PIE installation failed" && exit 2)
RUN pie install xdebug/xdebug

# 配置 Xdebug
RUN echo "xdebug.mode=debug" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini && \
    echo "xdebug.client_host=host.docker.internal" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

CMD ["php-fpm"]

方案三:使用多阶段构建(不推荐,过于复杂)
如果你想保留 AlmaLinux 作为最终镜像,但利用 PHP 官方镜像的某些文件,可以使用多阶段构建:

# 阶段1:从官方 PHP 镜像获取 PHP 二进制文件
FROM php:8.4.22-fpm AS php-source

# 阶段2:AlmaLinux 作为最终镜像
FROM almalinux:10.2

# 从 PHP 官方镜像复制 PHP 二进制文件到 AlmaLinux
COPY --from=php-source /usr/local/ /usr/local/
COPY --from=php-source /etc/ /etc/

# 安装 PHP 运行所需依赖
RUN dnf -y update && \
    dnf -y install \
    libxml2 \
    libcurl \
    libssl \
    libsqlite3 \
    libpq \
    && dnf clean all

# 现在安装 PIE 和 Xdebug
COPY bin/pie.phar /usr/bin/pie
RUN chmod +x /usr/bin/pie
RUN pie install xdebug/xdebug

CMD ["php-fpm"]

⚠️ 不推荐方案三,因为 PHP 官方镜像中的二进制文件依赖于 Debian 的库(如 libc6),在 AlmaLinux(使用 glibc)上可能存在兼容性问题。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐