webman Docker部署方案(Debian:10-slim + PHP8.1)
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
个评论
大佬,来个ubuntu的
若使用 ubuntu 镜像,仅需修改基础镜像及软件源即可,差别不大。
一会去试试
若使用中有问题,请反馈。
大佬,这样的话,代码相当于拷贝到容器的/app目录里了吧?这样的话,我们本地做开发,也就是本机的代码怎么更新进去呢?
在运行容器时,通过 -v 来将外部目录隐射到容器内部目录,如: -v 外部代码目录:/app。通过这种方式,在每次修改完外部代码后,直接重启容器即可。
不行 报错。。。
这样会报错
docker run -d --restart=always --name=app -p 8787:8787 -v 外部代码目录:/app -p 3306:3306 developer/app:1.0
我是按照你教程来的,就run这一步 我加-v就报错,
你前面那个copy和这个-v有冲突没
外部代码目录 是你外部代码的绝对路径,如: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" 查看具体错误。
推荐用dnmp环境,那个更方便一些,很多扩展是不能直接apt安装的,比如oci,kafka。
如果都是常用扩展,那下载静态php可执行文件,直接运行就行,也没必要这样部署安装了,想用什么版本php的换静态文件就行。
教程是单独为当前webman开发的服务打包运行环境的,不是说在当前镜像里还安装其他的服务组件,如mysql,nginx或kafka等。
如果是一次性交付的项目,同时需要多种服务组件,那交付时用docker-compose.yml配置就行,不在此教程讨论范围内。实际上大多数的业务,都是小公司的自研项目,服务组件单独部署,多个接口服务共用的场景。
访问服务组件的扩展的安装,如果是PHP支持的,都是可以通过apt或编译的方式安装的,这些在打包时都可以做到。使用docker的好处就是跨环境开发部署,服务隔离及版本管理等,至于使用静态php可执行文件如何能做到,不太了解。
你可以了解一下dnmp,这个就是基于docker-compose的
为什么不用PHP官方镜像?
https://www.workerman.net/a/1672 这个方案了解一下