webman Docker部署方案
webman Docker容器化部署方案
一. 方案优势
1. 方便 多平台的开发部署
2. 方便 修改 PHP 版本
3. 方便 修改 PHP 扩展
二. Dockerfile
1. 基于 CentOS:7 + PHP8.1
FROM centos:7
# install yum-utils
RUN yum -y install yum-utils
# install libevent
RUN yum -y install libevent libevent-devel
# install php8.1 libs
RUN yum -y install epel-release
RUN yum -y install https://mirrors.aliyun.com/remi/enterprise/remi-release-7.rpm
RUN yum-config-manager --enable remi-php81
RUN yum -y install php-cli php-event php-posix php-pcntl php-zip php-openssl php-devel php-gd php-mbstring php-curl php-xml php-simplexml php-fileinfo php-sodium php-pear php-bcmath php-json php-mysqlnd php-redis php-amqp php-imagick --skip-broken
# copy project
RUN mkdir /app
COPY ./ /app
RUN chmod -R 777 /app/public /app/runtime
# install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
RUN composer install --no-dev --working-dir=/app
# clean all
RUN yum clean all
ENTRYPOINT ["php", "/app/start.php", "start"]
2. 如何修改 PHP 版本:
修改 Dockerfile 中的 "RUN yum-config-manager --enable remi-php81" 行中的 "remi-php81" 即可。 该信息表示 PHP 的版本, 如 使用 PHP8.0, 将其修改 "remi-php80"。
3. 如何修改 PHP 扩展:
添加或删除 Dockerfile 中的 "RUN yum -y install php-cli..." 行中的 PHP 扩展即可。PHP 扩展格式为 php-扩展名, 如 添加 redis 扩展, 在该行增加 "php-redis"。(当前 Dockerfile 中已添加了该扩展)
4. 注意事项:
(1)按需安装扩展,若教程中的扩展您不需要,请删除
(2)按需安装 composer 及依赖,若您代码中已安装依赖,请删除或注释教程中 install composr 部分
(3)若安装过程中出现超时问题,请配置镜像加速,具体参见:https://www.runoob.com/docker/docker-mirror-acceleration.html
三. 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 18787:18787 developer/app:1.0
参数说明:
-d:后台方式运行
--restart=always:自启动
--name=app:容器服务名称
-p 18787:18787:映射端口(将外部端口映射到容器内部服务端口)
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
个评论
D:\wnmp\docker\webman-docker>docker build --rm -t developer/app:1.0 .
Sending build context to Docker daemon 17.27MB
Step 1/12 : FROM centos:7
---> eeb6ee3f44bd
Step 2/12 : RUN yum -y install yum-utils
---> Running in 448015c975e5
failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/bin/sh": stat /bin/sh: no such file or directory: unknown
第二步就报错了,告辞
这里没啥没有安装数据库mysql啊
composer也没有安装吧。我是把代码推送到远程,执行composer命令安装依赖包
将如下代码放在 # clean all 上面(上面教程已补充):
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
RUN composer install --no-dev --working-dir=/app
这个容器怎么访问外部的mysql,我mysql连不上。
需要在代码中连接mysql的配置处指定,非容器或Dockerfile处。
若通过内网连接mysql,将连接mysql的host换做内网地址(非127.0.0.1),win上使用ipconfig查看,centos上使用ifconfig查看;公网连接直接使用公网ip即可。
用install-php-extensions安装拓展可能会更好一些;
然后再结合一个docker-compose编排启动,可能会更简单
.env如下
nice~
docker中部署workerman服务的话,需要在docker中做官方推荐的linux内核调优吗?还是只在docker宿主机中作内核参数调优就行了
是需要做优化的,但是目前docker的系统镜像,有些内核参数是被移除了的,无法按照workman官方文档的内核优化配置去处理。具体可参见:https://www.workerman.net/q/4503。
若对性能有较高的要求,还是建议直接部署到宿主机上,使用supervisord统一管理。
好的,谢谢,推荐生产还是部署在宿主机上是吧。我再研究研究
如果想便于部署和做环境隔离,使用docker部署是不错的选择。目前已经在多个项目的生产环境中使用docker部署,线上没出过什么问题。但具体的使用,还是看你这边的业务场景。
我主要是看到官方文档上说:优化linux内核也是重中之重,以下优化每一项都非常非常重要,请务必按逐一完成。所以我就想着docker中怎么配置 ,查了一圈发现官方没有给什么好的解决方案,我在docker-compose.yml中使用了sysctl,但是net.core.netdev_max_backlog这个参数又报错。所以这块如果使用docker不进行内核调优,又担心会影响性能,挺纠结
当你开始纠结时,表示已经有了选择。所以不用纠结了,还是直接部署到宿主机上吧。哈哈 ~0,,0~
这个容器怎么访问外部的mysql,应该要改配置吧
可能build的时候要指定一下
或者在dockerfile里面写好配置
具体怎么弄呢?
需要在代码中连接mysql的配置处指定,非容器或Dockerfile处。
若通过内网连接mysql,将连接mysql的host换做内网地址(非127.0.0.1),win上使用ipconfig查看,centos上使用ifconfig查看;公网连接直接使用公网ip即可。
打包成docker 镜像,如何通过-e 参数读取外部输入的变量呢,
比如,webman 服务打包成docker镜像,使用阿里云mysql,将myqli 地址和密码 使用-e
这种方式在webman 打包的时候如何使用,谢谢
可以用过 php 的 getenv 方法获取环境变量:
https://www.workerman.net/a/1490
https://www.workerman.net/q/10927
getenv 有人说会获取失败
测试是可以的。"有人说" 的场景,和你的是不是一样的呢?
懂了,启动日期的时候 -e DB_NAME = db_name 指定参数,会把DB_NAME的值写入到docker 容器内部的环境变量里,$_ENV['DB_NAME'] 这样去取值就行了
大佬 我在使用这个方案部署的时候前面都成功 到了安装php扩展的时候 那些镜像返回的地址都是404
一个扩展也安装不上 最后报错退出了 你知道什么原因吗?我是macos系统
因为centos7已经不准备维护,所以很多软件源都取消了对centos的镜像支持。后续若有需要,我会出一个debian的。