webman Docker部署方案(Debian:10-slim + PHP8.1)

Caesar-Tang

webman Docker容器化部署方案

一. 方案优势

1. 方便 多平台的开发部署
2. 方便 修改 PHP 版本
3. 方便 修改 PHP 扩展
4. 使用 Debian:10-slim,打包体积更小
5. 使用阿里云源,在打包时,下载包更快更稳定,避免出现超时或 404 问题
6. 在 Win10 及 CentOS7.9 上完美运行

二. Dockerfile

1. 基于 Debian:10-slim + PHP8.1
# Use Debian 10 as the base image
FROM debian:10-slim

# Change software source
RUN rm /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/debian/ buster main non-free contrib" > /etc/apt/sources.list && \
    echo "deb-src http://mirrors.aliyun.com/debian/ buster main non-free contrib" >> /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/debian-security buster/updates main" >> /etc/apt/sources.list && \
    echo "deb-src http://mirrors.aliyun.com/debian-security buster/updates main" >> /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib" >> /etc/apt/sources.list && \
    echo "deb-src http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib" >> /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib" >> /etc/apt/sources.list && \
    echo "deb-src http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib" >> /etc/apt/sources.list

# Update the system and install the required software and libraries
RUN apt-get update && apt-get install -y \
    wget \
    lsb-release \
    libevent-dev \
    openssl \
    curl \
    ca-certificates \
    gnupg2 \
    && rm -rf /var/lib/apt/lists/*

# Add PHP source
RUN wget https://packages.sury.org/php/apt.gpg \
    && apt-key add apt.gpg \
    && echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/php.list \
    && rm apt.gpg

# Update the system and install PHP 8.1 and its extensions
RUN apt-get update && apt-get install -y \
    php8.1-cli \
    php8.1-dev \
    php8.1-common \
    php8.1-curl \
    php8.1-xml \
    php8.1-bcmath \
    php8.1-mysql \
    php8.1-redis \
    php8.1-amqp \
    php8.1-imagick \
    php8.1-gd \
    && rm -rf /var/lib/apt/lists/*

# Install PHP's event, for more optimization, see: https://www.workerman.net/doc/workerman/appendices/kernel-optimization.html#Linux%E5%86%85%E6%A0%B8%E8%B0%83%E4%BC%98
RUN printf "\n\n\n\n\nno\n\n" | pecl install event \
    && echo "extension=event.so" >> /etc/php/8.1/cli/conf.d/event.ini

# Copy the project
COPY ./ /app
RUN chmod -R 777 /app/public /app/runtime

# Clean all
RUN apt clean all

EXPOSE 8787

CMD php /app/start.php start
2. 如何修改 PHP 版本:
修改 Dockerfile 中的 "8.1" 换成你想要的版本。
3. 如何修改 PHP 扩展:
添加或删除 Dockerfile 中的 "apt-get install -y php8.1-..." 行中的 PHP 扩展即可。PHP 扩展格式为 php8.1-扩展名, 如 添加 redis 扩展, 在该行增加 "php8.1-redis"。(当前 Dockerfile 中已添加了该扩展)
4. 注意事项:
(1)按需安装扩展,若教程中的扩展您不需要,请删除
(2)若安装过程中出现超时问题,请配置镜像加速,具体参见:https://www.runoob.com/docker/docker-mirror-acceleration.html
(3)已按照官方教程安装 event 扩展
(4)php 的 memory_limit 默认为 -1

三. Docker容器化部署

1. Docker 构建镜像:
1. 将 Dockerfile 放入应用跟目录

2. 运行制作镜像(镜像名称按 开发者/应用:版本):
docker build --rm -t developer/app:1.0 .
2. Docker 运行命令:
1. 使用镜像创建容器:
    docker run -d --restart=always --name=app -p 8787:8787 developer/app:1.0
    参数说明:
    -d:后台方式运行
    --restart=always:自启动
    --name=app:容器服务名称
    -p 8787:8787:映射端口(将外部端口映射到容器内部服务端口)
    developer/app:1.0:镜像名称

2. 容器服务操作
    (1) 查看容器状态
    docker ps -a
    (2) 进入容器
    docker exec -it app /bin/bash
    (3) 重启服务
    docker restart app
    (4) 关闭服务
    docker stop app
    (5) 容器状态
    docker stats
955 4 12
4个评论

smart

大佬,来个ubuntu的

  • Caesar-Tang 2023-11-16

    若使用 ubuntu 镜像,仅需修改基础镜像及软件源即可,差别不大。

swatyb

一会去试试

linkphp

大佬,这样的话,代码相当于拷贝到容器的/app目录里了吧?这样的话,我们本地做开发,也就是本机的代码怎么更新进去呢?

  • Caesar-Tang 2023-11-29

    在运行容器时,通过 -v 来将外部目录隐射到容器内部目录,如: -v 外部代码目录:/app。通过这种方式,在每次修改完外部代码后,直接重启容器即可。

  • linkphp 2023-11-29

    不行 报错。。。

  • linkphp 2023-11-29

    这样会报错
    docker run -d --restart=always --name=app -p 8787:8787 -v 外部代码目录:/app -p 3306:3306 developer/app:1.0

  • linkphp 2023-11-29

    我是按照你教程来的,就run这一步 我加-v就报错,

  • linkphp 2023-11-29

    你前面那个copy和这个-v有冲突没

  • Caesar-Tang 2023-11-30

    外部代码目录 是你外部代码的绝对路径,如:F:\Project\app,则运行命令是:docker run -d --restart=always --name=app -p 8787:8787 -v F:\Project\app:/app developer/app:1.0。
    若还是有问题,请贴出错误截图 或 执行 "docker logs -f app" 查看具体错误。

sunwenzheng

推荐用dnmp环境,那个更方便一些,很多扩展是不能直接apt安装的,比如oci,kafka。

如果都是常用扩展,那下载静态php可执行文件,直接运行就行,也没必要这样部署安装了,想用什么版本php的换静态文件就行。

  • Caesar-Tang 2024-01-16

    教程是单独为当前webman开发的服务打包运行环境的,不是说在当前镜像里还安装其他的服务组件,如mysql,nginx或kafka等。
    如果是一次性交付的项目,同时需要多种服务组件,那交付时用docker-compose.yml配置就行,不在此教程讨论范围内。实际上大多数的业务,都是小公司的自研项目,服务组件单独部署,多个接口服务共用的场景。
    访问服务组件的扩展的安装,如果是PHP支持的,都是可以通过apt或编译的方式安装的,这些在打包时都可以做到。使用docker的好处就是跨环境开发部署,服务隔离及版本管理等,至于使用静态php可执行文件如何能做到,不太了解。

  • sunwenzheng 2024-01-16

    你可以了解一下dnmp,这个就是基于docker-compose的

Caesar-Tang

650
积分
0
获赞数
0
粉丝数
2022-03-28 加入
🔝