├── .gitattributes ├── .gitignore ├── src ├── copy │ ├── .dockerignore │ ├── docker-compose.yml │ └── Dockerfile └── Install.php ├── config ├── php.ini └── supervisord.conf ├── docker-compose.yml ├── composer.json ├── Dockerfile └── README.md /.gitattributes: -------------------------------------------------------------------------------- 1 | /.github export-ignore -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | /.vscode 3 | /composer.lock 4 | /vendor 5 | /.env -------------------------------------------------------------------------------- /src/copy/.dockerignore: -------------------------------------------------------------------------------- 1 | /.git 2 | /.idea 3 | /.vscode 4 | /runtime/** 5 | !/runtime/.gitignore 6 | /vendor 7 | -------------------------------------------------------------------------------- /config/php.ini: -------------------------------------------------------------------------------- 1 | [php] 2 | #max_execution_time=1800 3 | 4 | [opcache] 5 | opcache.enable=0 6 | opcache.enable_cli=0 7 | -------------------------------------------------------------------------------- /src/copy/docker-compose.yml: -------------------------------------------------------------------------------- 1 | # 用于开发环境 2 | version: "3.7" 3 | 4 | services: 5 | webman: 6 | image: krisss/docker-webman:${DOCKER_WEBMAN_VERSION:-7.4-cli-alpine} 7 | ports: 8 | - "${DOCKER_WEBMAN_PORT:-8787}:8787" 9 | volumes: 10 | - .:/app 11 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.7" 2 | 3 | services: 4 | webman: 5 | image: "krisss/docker-webman:${PHP_CLI_VERSION}" 6 | build: 7 | context: "./" 8 | args: 9 | PHP_CLI_VERSION: ${PHP_CLI_VERSION} 10 | PHP_EXTENSION_INSTALL_VERSION: ${PHP_EXTENSION_INSTALL_VERSION} 11 | COMPOSER_VERSION: ${COMPOSER_VERSION} 12 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webman-tech/docker", 3 | "type": "library", 4 | "license": "MIT", 5 | "description": "docker for webman app", 6 | "require": {}, 7 | "autoload": { 8 | "psr-4": { 9 | "Kriss\\WebmanDocker\\": "src" 10 | } 11 | }, 12 | "config": { 13 | "github-actions-date": "2025-12-01T01:23:17.913Z" 14 | } 15 | } -------------------------------------------------------------------------------- /config/supervisord.conf: -------------------------------------------------------------------------------- 1 | [supervisord] 2 | nodaemon=true 3 | user=root 4 | logfile=/dev/stdout 5 | logfile_maxbytes=0 6 | 7 | [program:webman] 8 | command=php /app/start.php start 9 | stdout_logfile=/dev/stdout 10 | stdout_logfile_maxbytes=0 11 | stderr_logfile=/dev/stderr 12 | stderr_logfile_maxbytes=0 13 | autorestart=true 14 | startretries=10 15 | 16 | [include] 17 | files = /etc/supervisor/conf.d/*.conf 18 | -------------------------------------------------------------------------------- /src/copy/Dockerfile: -------------------------------------------------------------------------------- 1 | # 用于将项目构建成镜像 2 | ARG WEBMAN_DOCKER_VERSION=7.4-cli-alpine 3 | 4 | # https://github.com/krissss/docker-webman 5 | FROM krisss/docker-webman:$WEBMAN_DOCKER_VERSION 6 | 7 | # 增加额外的扩展 8 | #RUN apk add --no-cache git 9 | #RUN install-php-extensions imagick 10 | 11 | # 设置配置文件 12 | # 自定义 php 配置文件,如果需要的话 13 | # 覆盖镜像自带的 14 | #COPY environments/docker/php.ini "$PHP_INI_DIR/conf.d/app.ini" 15 | # 扩展额外的 16 | #COPY environments/docker/my_php.ini "$PHP_INI_DIR/conf.d/my_php.ini" 17 | # 自定义 supervisor 配置,如果需要的话 18 | # 覆盖镜像自带的 19 | #COPY environments/docker/supervisord.conf /etc/supervisor/supervisord.conf 20 | # 扩展额外的 21 | #COPY environments/docker/my_supervisord.conf /etc/supervisor/conf.d/my_supervisord.conf 22 | 23 | # 预先加载 Composer 包依赖,优化 Docker 构建镜像的速度 24 | COPY ./composer.json /app/ 25 | COPY ./composer.lock /app/ 26 | RUN composer install --no-interaction --no-dev --no-autoloader --no-scripts 27 | 28 | # 复制项目代码 29 | COPY . /app 30 | 31 | # 执行 Composer 自动加载和相关脚本 32 | RUN composer install --no-interaction --no-dev && composer dump-autoload 33 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # https://hub.docker.com/_/php 2 | ARG PHP_CLI_VERSION=7.4-cli-alpine 3 | # https://hub.docker.com/r/mlocati/php-extension-installer 4 | ARG PHP_EXTENSION_INSTALL_VERSION=latest 5 | # https://hub.docker.com/r/composer/composer 6 | ARG COMPOSER_VERSION=latest 7 | 8 | # install-php-extensions 9 | FROM mlocati/php-extension-installer:$PHP_EXTENSION_INSTALL_VERSION AS php-extension-installer 10 | # composer 11 | FROM composer/composer:$COMPOSER_VERSION AS composer 12 | 13 | # 开始构建 14 | FROM php:$PHP_CLI_VERSION 15 | 16 | # 系统依赖安装 17 | COPY --from=php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/ 18 | COPY --from=composer /usr/bin/composer /usr/bin/composer 19 | RUN apk add --no-cache supervisor unzip 20 | 21 | # PHP 扩展安装 22 | # https://github.com/mlocati/docker-php-extension-installer#supported-php-extensions 23 | RUN install-php-extensions \ 24 | bcmath \ 25 | event \ 26 | gd \ 27 | mysqli \ 28 | pdo_mysql \ 29 | opcache \ 30 | pcntl \ 31 | redis \ 32 | sockets \ 33 | zip 34 | 35 | # 设置配置文件 36 | # php 37 | RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" 38 | COPY config/php.ini "$PHP_INI_DIR/conf.d/app.ini" 39 | # supervisor 40 | COPY config/supervisord.conf /etc/supervisor/conf.d/supervisord.conf 41 | 42 | # 设置项目目录 43 | RUN mkdir -p /app 44 | WORKDIR /app 45 | 46 | # 暴露端口 47 | EXPOSE 8787 48 | 49 | # 启动脚本 50 | CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"] 51 | -------------------------------------------------------------------------------- /src/Install.php: -------------------------------------------------------------------------------- 1 | 'Dockerfile', 13 | 'copy/docker-compose.yml' => 'docker-compose.yml', 14 | 'copy/.dockerignore' => '.dockerignore', 15 | ); 16 | 17 | /** 18 | * Install 19 | * @return void 20 | */ 21 | public static function install() 22 | { 23 | static::installByRelation(); 24 | } 25 | 26 | /** 27 | * Uninstall 28 | * @return void 29 | */ 30 | public static function uninstall() 31 | { 32 | self::uninstallByRelation(); 33 | } 34 | 35 | /** 36 | * installByRelation 37 | * @return void 38 | */ 39 | public static function installByRelation() 40 | { 41 | foreach (static::$pathRelation as $source => $dest) { 42 | if ($pos = strrpos($dest, '/')) { 43 | $parent_dir = base_path().'/'.substr($dest, 0, $pos); 44 | if (!is_dir($parent_dir)) { 45 | mkdir($parent_dir, 0777, true); 46 | } 47 | } 48 | //symlink(__DIR__ . "/$source", base_path()."/$dest"); 49 | copy_dir(__DIR__ . "/$source", base_path()."/$dest"); 50 | echo "Create $dest 51 | "; 52 | } 53 | } 54 | 55 | /** 56 | * uninstallByRelation 57 | * @return void 58 | */ 59 | public static function uninstallByRelation() 60 | { 61 | foreach (static::$pathRelation as $source => $dest) { 62 | $path = base_path()."/$dest"; 63 | if (!is_dir($path) && !is_file($path)) { 64 | continue; 65 | } 66 | echo "Remove $dest 67 | "; 68 | if (is_file($path) || is_link($path)) { 69 | unlink($path); 70 | continue; 71 | } 72 | remove_dir($path); 73 | } 74 | } 75 | 76 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # webman docker 2 | 3 | ## 简介 4 | 5 | 将 docker 用于 webman 的开发和生产部署 6 | 7 | ### 镜像地址和 tag 8 | 9 | [docker hub](https://hub.docker.com/r/krisss/docker-webman) 10 | 11 | - krisss/docker-webman:7.4-cli-alpine 12 | - krisss/docker-webman:8.0-cli-alpine 13 | - krisss/docker-webman:8.1-cli-alpine 14 | - krisss/docker-webman:8.2-cli-alpine 15 | - krisss/docker-webman:8.3-cli-alpine 16 | 17 | > 此镜像会通过 github actions 动态更新 php 的小版本,镜像 tag 名不变 18 | 19 | > 2.3.0 之后增加类似 `7.4-cli-alpine-v2.3.0` 形式的镜像版本,用于固定一个在发布版本时当前镜像中的各个组件版本(求稳可以用这种版本的镜像) 20 | 21 | ### 镜像中的组件 22 | 23 | - [php](https://hub.docker.com/_/php): extension 包含:bcmath、event、gd、mysqli、pdo_mysql、opcache、pcntl、redis、sockets、zip 24 | - [composer](https://getcomposer.org/) 25 | - [install-php-extensions](https://github.com/mlocati/docker-php-extension-installer) 26 | - [supervisor](http://supervisord.org/) 27 | 28 | ## 安装 29 | 30 | ```bash 31 | composer require webman-tech/docker 32 | ``` 33 | 34 | 会在项目根目录下提供 `Dockerfile` 用于构建镜像,提供 `docker-compose.yml` 用于开发 35 | 36 | ## 使用 37 | 38 | ### 当开发环境使用:目前代码未建立 39 | 40 | 启动镜像 41 | 42 | ```bash 43 | docker run --rm --name webman \ 44 | -v /local/workspace:/app \ 45 | -p 8787:8787 \ 46 | -it \ 47 | --privileged -u root \ 48 | --entrypoint /bin/sh \ 49 | krisss/docker-webman:7.4-cli-alpine 50 | ``` 51 | 52 | 创建项目 53 | 54 | ```bash 55 | composer create-project workerman/webman 56 | ``` 57 | 58 | 启动项目 59 | 60 | ```bash 61 | cd webman 62 | php start.php start 63 | ``` 64 | 65 | 访问 http://localhost:8787 即可 66 | 67 | ### 当开发环境使用:已有 webman 代码 68 | 69 | 在项目下自建 `docker-compose.yml`,参考例子如下: 70 | 71 | ```yml 72 | version: "3.7" 73 | 74 | services: 75 | webman: 76 | image: krisss/docker-webman:${DOCKER_WEBMAN_VERSION:-7.4-cli-alpine} 77 | ports: 78 | - "${DOCKER_WEBMAN_PORT:-8787}:8787" 79 | volumes: 80 | - .:/app 81 | ``` 82 | 83 | 启动: 84 | 85 | ```bash 86 | docker-compose up 87 | ``` 88 | 89 | 访问 http://localhost:8787 即可 90 | 91 | 92 | ### 打包项目成镜像 93 | 94 | 在项目下自建 `Dockerfile`,参考例子如下: 95 | 96 | ```Dockerfile 97 | ARG WEBMAN_DOCKER_VERSION=7.4-cli-alpine 98 | 99 | # https://github.com/krissss/docker-webman 100 | FROM krisss/docker-webman:$WEBMAN_DOCKER_VERSION 101 | 102 | # 增加额外的扩展 103 | #RUN install-php-extensions imagick 104 | 105 | # 设置配置文件 106 | # 自定义 php 配置文件,如果需要的话 107 | # 覆盖镜像自带的 108 | #COPY environments/docker/php.ini "$PHP_INI_DIR/conf.d/app.ini" 109 | # 扩展额外的 110 | #COPY environments/docker/my_php.ini "$PHP_INI_DIR/conf.d/my_php.ini" 111 | # 自定义 supervisor 配置,如果需要的话 112 | # 覆盖镜像自带的 113 | #COPY environments/docker/supervisord.conf /etc/supervisor/supervisord.conf 114 | # 扩展额外的 115 | #COPY environments/docker/my_supervisord.conf /etc/supervisor/conf.d/my_supervisord.conf 116 | 117 | # 预先加载 Composer 包依赖,优化 Docker 构建镜像的速度 118 | COPY ./composer.json /app/ 119 | COPY ./composer.lock /app/ 120 | RUN composer install --no-interaction --no-dev --no-autoloader --no-scripts 121 | 122 | # 复制项目代码 123 | COPY . /app 124 | 125 | # 执行 Composer 自动加载和相关脚本 126 | RUN composer install --no-interaction --no-dev && composer dump-autoload 127 | 128 | ``` 129 | 130 | 编译: 131 | 132 | ```bash 133 | docker build -t {image-name} . 134 | ``` 135 | 136 | 运行: 137 | 138 | ```bash 139 | docker run --rm -p 8787:8787 {image-name} 140 | ``` 141 | 142 | 访问 http://localhost:8787 即可 143 | 144 | 145 | ## For Developer 146 | 147 | 修改 Dockerfile 后测试方式: 148 | 149 | 1. 新建 `.env` 文件,其中配置 `docker-compose.yml` 中的 env 变量 150 | 2. 执行build:`docker-compose build webman` 151 | 3. 本机测试:`docker run --rm -it {ImageName}:{ImageTag} /bin/sh` 152 | --------------------------------------------------------------------------------