docker的hyperf框架docker-compose一键安装

收藏一个hyperf框架的docker安装

几个重要的docker-compose文件,下载的 hyperf 文件(hyperf-skeleton-master.zip):https://github.com/hyperf/hyperf-skeleton

imageimage

 

 1. mysql文件夹:有数据库的初始数据init.sql

-- 创建数据库和用户
CREATE DATABASE IF NOT EXISTS hyperf CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 创建用户表示例
USE hyperf;

CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_username (username),
    INDEX idx_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

2.变量配置文件

# 数据库配置
DB_DRIVER=mysql
DB_HOST=hyperf-mysql
DB_PORT=3306
DB_DATABASE=hyperf
DB_USERNAME=hyperf
DB_PASSWORD=123456

# Redis 配置
REDIS_HOST=hyperf-redis
REDIS_PORT=6379
REDIS_AUTH=
REDIS_DB=0

# Hyperf 应用配置
APP_NAME=Hyperf
APP_ENV=dev
APP_KEY=

3.Dockerfile文件(hyperf镜像文件,可以使用 docker build -t hyperf-app . 验证创建镜像,它会自动用当前目录的Dockerfile创建镜像)

# Default Dockerfile
#
# @link     https://www.hyperf.io
# @document https://hyperf.wiki
# @contact  group@hyperf.io
# @license  https://github.com/hyperf/hyperf/blob/master/LICENSE

FROM hyperf/hyperf:8.3-alpine-v3.19-swoole

LABEL maintainer="Hyperf Developers <group@hyperf.io>" version="1.0" license="MIT" app.name="Hyperf"

##
# ---------- env settings ----------
##
# --build-arg timezone=Asia/Shanghai
ARG timezone

# 修复 SCAN_CACHEABLE 变量格式,移除多余括号
ENV TIMEZONE=${timezone:-"Asia/Shanghai"} \
    APP_ENV=prod \
    SCAN_CACHEABLE=true

# update
RUN set -ex \
    # show php version and extensions
    && php -v \
    && php -m \
    && php --ri swoole \
    #  ---------- some config ----------
    && cd /etc/php* \
    # - config PHP
    && { \
        echo "upload_max_filesize=128M"; \
        echo "post_max_size=128M"; \
        echo "memory_limit=1G"; \
        echo "date.timezone=${TIMEZONE}"; \
    } | tee conf.d/99_overrides.ini \
    # - config timezone
    && ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
    && echo "${TIMEZONE}" > /etc/timezone \
    # ---------- clear works ----------
    && rm -rf /var/cache/apk/* /tmp/* /usr/share/man \
    && echo -e "\033[42;37m Build Completed :).\033[0m\n"

WORKDIR /opt/www

# 安装 unzip(Alpine 镜像默认无 unzip 命令,无法解压 zip 包)
RUN apk add --no-cache unzip

# Composer Cache
# COPY ./composer.* /opt/www/
# RUN composer install --no-dev --no-scripts

COPY ./hyperf-skeleton-master.zip /opt/www

# 关键优化:1. 解压 2. 校验目录 3. 切换目录 4. 安装依赖 合并到同一个 RUN
RUN unzip hyperf-skeleton-master.zip \
    # 校验目录是否存在,不存在则终止构建并输出错误信息
    && if [ ! -d "hyperf-skeleton-master" ]; then \
        echo "Error: hyperf-skeleton-master directory not found after unzip!" && exit 1; \
    fi \
    # 切换到项目目录并执行 composer 安装依赖(同一 RUN 内目录切换有效)
    && cd hyperf-skeleton-master/ \
    && composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ \
    && composer install --no-dev --no-interaction -o \
    # 清理 composer 缓存,减小镜像体积
    && composer clear-cache


# 暴露 Hyperf 默认端口
EXPOSE 9501

# 容器运行时启动 Hyperf 应用
ENTRYPOINT ["php", "/opt/www/hyperf-skeleton-master/bin/hyperf.php", "start"]

4.docker-compose.yml文件, (多个镜像文件,使用 docker compose up -d --build 创建并运行容器)

version: '3.8'

services:
  mysql:
    image: mysql:5.7.43
    container_name: hyperf-mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: hyperf
      MYSQL_USER: hyperf
      MYSQL_PASSWORD: 123456
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      - hyperf-network
    command: --default-authentication-plugin=mysql_native_password

  redis:
    image: redis:6.2-alpine
    container_name: hyperf-redis
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    networks:
      - hyperf-network
    command: redis-server --appendonly yes

  hyperf:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        PHP_VERSION: "8.1"
        ALPINE_VERSION: "3.18"
        SPEC: "swoole"
        SW_VERSION: "v5.1.2"
    container_name: hyperf-app
    restart: always
    working_dir: /opt/www
#    volumes:
#      - ./hyperf/:/opt/www
#      - ./runtime:/opt/www/runtime
    ports:
      - "9501:9501"
    depends_on:
      - mysql
      - redis
    networks:
      - hyperf-network
    environment:
      DB_HOST: mysql
      DB_PORT: 3306
      DB_DATABASE: hyperf
      DB_USERNAME: hyperf
      DB_PASSWORD: 123456
      REDIS_HOST: redis
      REDIS_PORT: 6379
      REDIS_DB: 0
#    command: php bin/hyperf-skeleton-master/hyperf.php start

networks:
  hyperf-network:
    driver: bridge

volumes:
  mysql_data:
  redis_data:

 

上面docker-compose作为部署文件,那就不用 把容器目录映射出来,如果是开发环境,那把代码目录映射到容器的/opt/www也行.

#    volumes:
#      - ./hyperf/:/opt/www
#      - ./runtime:/opt/www/runtime

 

注意,1.如果是部署发布,目录的zip文件应是全部源代码,复制后解压,运行。

2.如果要搭建开发环境,可以不用zip文件,容器启动时的命令也不设置,主要把/opt/www文件挂载到本地,/opt/www是空目录,把代码复制到本地文件夹,这样容器相应文件也有代码了,再容器运行执行命令即可。

 

 

开发环境 :  https://www.cnblogs.com/fps2tao/p/19498963

 

posted @ 2026-01-17 16:43  与f  阅读(4)  评论(0)    收藏  举报