webman Docker部署方案(CnetOS7 + PHP8.1)
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
第二步就报错了,告辞
https://www.workerman.net/a/1672 可以试试这个
这里没啥没有安装数据库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的。
基于debian的教程已发,若有需要,参见:https://www.workerman.net/a/1577
感谢大佬
谢谢,部署成功,但是我-v映射到/app却启动不了,我是想做个开发的容器,我还得再研究研究
确保目录映射正确,如外部代码路径为:"/home/docker/app",则使用 "-v /home/docker/app:/app" 映射。
若还是无法启动,可使用 "docker logs -f 容器名" 或 查看runtime下的workman日志 来定位具体问题,若始终无法解决,请反馈。
谢谢大佬的回复,找到问题了,是我的容器一直在重启,我改写了一下这个Dockerfile文件,抽空我也分享一下给新人一些便捷的方式
好的。感谢您的分享。
大佬我是docker新手,目前本地可以跑起来了。
但是dockerfile不知道怎么配置。请帮我看看
看文档就是要php环境和compose,我是这样写的
FROM php:8.2-alpine
RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer
设置工作目录
WORKDIR /app
将当前目录的内容复制到容器的工作目录中
COPY . /app
暴露应用程序的端口
EXPOSE 3001
运行应用程序
CMD [ "php", "/app/start.php","start"]
未安装服务所需的php扩展(非composer安装的模块);在 执行 mv composer.phar /usr/local/bin/composer 后给 /usr/local/bin/composer 增加可执行权限。
因为我的tp源码有修改所以直接吧第三方插件复制进去了所以不用安装composer了,而且就是安装composer,非常非常慢,已经配置了阿里云的镜像加速还是慢,请问大佬有什么方法可以提速吗?还有就是hub.docker.com进不去了有些镜像都不知道怎么用,请问有可以代替的其他网站吗?
FROM php:8.2-alpine
RUN docker-php-ext-install pcntl
RUN docker-php-ext-install mysqlnd
RUN pecl install redis && docker-php-ext-enable redis
设置工作目录
WORKDIR /app
将当前目录的内容复制到容器的工作目录中
COPY . /app
暴露应用程序的端口
EXPOSE 8000
运行应用程序
CMD php webman start
RUN echo "http://mirrors.aliyun.com/alpine/v3.4/main/" > /etc/apk/repositories
建议将composer文件下载到项目文件中,然后在Dockerfile里复制到容器内并增加可执行权限
RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
RUN composer install --no-dev --working-dir=/app
谢谢解决了哈哈哈
FROM php:8.2-alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
安装依赖
RUN apk add gcc g++ autoconf make
安装Redis扩展
RUN pecl install igbinary lzf zstd \
&& docker-php-ext-enable igbinary lzf zstd \
&& pecl install redis \
&& docker-php-ext-enable redis
RUN docker-php-ext-install pdo pdo_mysql
RUN docker-php-ext-install pcntl
设置工作目录
WORKDIR /app
将当前目录的内容复制到容器的工作目录中
COPY . /app
暴露应用程序的端口
EXPOSE 8000
运行应用程序
CMD php webman start
棒~
FROM centos:7
是centos7.0的版本还是7.9
CentOS Linux release 7.9.2009 (Core)
这个image 打出来太大了 大约930多mb 是否可以优化的小一点 大约100-200mb的样子
https://www.workerman.net/a/1577