webman Docker部署方案(CnetOS7 + PHP8.1)

CaesarTang

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
3626 11 12
11个评论

wash2018

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

第二步就报错了,告辞

  • CaesarTang 2023-04-24
    1. 在 centos7(Docker version 20.10.5, build 55c4c88)及 win10(Docker version 20.10.24, build 297e128) 测试打包均正常
    2. 第2步的命令,只是简单的运行 yum 命令安装组件,此命令和触犯的报错无实际关联
    3. 从错误提示看,可能是你那边下载的 centos:7 镜像的问题。你可以看下镜像的来源(docker.io/library/centos:7),并运行 docker inspect centos:7 看具体详情,在 Cmd 中查看是否支持上述的 /bin/sh 或 /bin/bash
leeseean

这里没啥没有安装数据库mysql啊

chaz6chez
FROM php:8.2-fpm-alpine

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
    curl -sSL https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions -o - | sh -s  \
    sockets pcntl zip ffi pdo_mysql gd event opcache redis uuid yaml apcu @composer

VOLUME /var/www
WORKDIR /var/www

用install-php-extensions安装拓展可能会更好一些;

version: "3.1"
services:
  php:
    restart: always
    container_name: php
    build:
      context: ./
    volumes:
      - ./:/var/www
    ports:
      - "8001:8001"
      - "8002:8002"
      - "8003:8003"
      - "8004:8004"
    environment:
      TZ: ${TIME_ZONE}
    logging:
      driver: json-file
      options:
        max-size: "20m"
        max-file: "10"
    tty: true
    networks:
      - backend

  redis:
    restart: always
    container_name: redis
    image: redis:7-alpine
    ports:
      - "6379:6379"
    environment:
      TZ: ${TIME_ZONE}
    networks:
      - backend

  mysql:
    restart: always
    container_name: mysql
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
      TZ: ${TIME_ZONE}
    volumes:
      - ./runtime/mysql:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - backend

networks:
  backend:
    driver: bridge

然后再结合一个docker-compose编排启动,可能会更简单

.env如下

TIME_ZONE=Asia/Shanghai
MYSQL_PASSWORD=123456
wentmac

docker中部署workerman服务的话,需要在docker中做官方推荐的linux内核调优吗?还是只在docker宿主机中作内核参数调优就行了

  • CaesarTang 2023-06-22

    是需要做优化的,但是目前docker的系统镜像,有些内核参数是被移除了的,无法按照workman官方文档的内核优化配置去处理。具体可参见:https://www.workerman.net/q/4503
    若对性能有较高的要求,还是建议直接部署到宿主机上,使用supervisord统一管理。

  • wentmac 2023-06-22

    好的,谢谢,推荐生产还是部署在宿主机上是吧。我再研究研究

  • CaesarTang 2023-06-22

    如果想便于部署和做环境隔离,使用docker部署是不错的选择。目前已经在多个项目的生产环境中使用docker部署,线上没出过什么问题。但具体的使用,还是看你这边的业务场景。

  • wentmac 2023-06-22

    我主要是看到官方文档上说:优化linux内核也是重中之重,以下优化每一项都非常非常重要,请务必按逐一完成。所以我就想着docker中怎么配置 ,查了一圈发现官方没有给什么好的解决方案,我在docker-compose.yml中使用了sysctl,但是net.core.netdev_max_backlog这个参数又报错。所以这块如果使用docker不进行内核调优,又担心会影响性能,挺纠结

  • CaesarTang 2023-06-22

    当你开始纠结时,表示已经有了选择。所以不用纠结了,还是直接部署到宿主机上吧。哈哈 ~0,,0~

leeseean

这个容器怎么访问外部的mysql,应该要改配置吧
可能build的时候要指定一下
或者在dockerfile里面写好配置
具体怎么弄呢?

  • CaesarTang 2023-06-26

    需要在代码中连接mysql的配置处指定,非容器或Dockerfile处。
    若通过内网连接mysql,将连接mysql的host换做内网地址(非127.0.0.1),win上使用ipconfig查看,centos上使用ifconfig查看;公网连接直接使用公网ip即可。

软饭工程师

打包成docker 镜像,如何通过-e 参数读取外部输入的变量呢,
比如,webman 服务打包成docker镜像,使用阿里云mysql,将myqli 地址和密码 使用-e

MYSQL_ROOT_PASSWORD=123456

这种方式在webman 打包的时候如何使用,谢谢

来者可追

大佬 我在使用这个方案部署的时候前面都成功 到了安装php扩展的时候 那些镜像返回的地址都是404
一个扩展也安装不上 最后报错退出了 你知道什么原因吗?我是macos系统

平头有杀气

谢谢,部署成功,但是我-v映射到/app却启动不了,我是想做个开发的容器,我还得再研究研究

  • CaesarTang 2023-11-07

    确保目录映射正确,如外部代码路径为:"/home/docker/app",则使用 "-v /home/docker/app:/app" 映射。
    若还是无法启动,可使用 "docker logs -f 容器名" 或 查看runtime下的workman日志 来定位具体问题,若始终无法解决,请反馈。

  • 平头有杀气 2023-11-15

    谢谢大佬的回复,找到问题了,是我的容器一直在重启,我改写了一下这个Dockerfile文件,抽空我也分享一下给新人一些便捷的方式

  • CaesarTang 2023-11-16

    好的。感谢您的分享。

964562398

大佬我是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"]

  • CaesarTang 2023-11-20

    未安装服务所需的php扩展(非composer安装的模块);在 执行 mv composer.phar /usr/local/bin/composer 后给 /usr/local/bin/composer 增加可执行权限。

  • 964562398 2023-11-20

    因为我的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

  • CaesarTang 2023-11-20
    1. php扩展安装慢:修改源(基于php的alpine镜像)
      RUN echo "http://mirrors.aliyun.com/alpine/v3.4/main/" > /etc/apk/repositories
    2. composer 自身下载慢:
      建议将composer文件下载到项目文件中,然后在Dockerfile里复制到容器内并增加可执行权限
    3. composer下载服务依赖慢:修改源
      RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
      RUN composer install --no-dev --working-dir=/app
    4. 访问 hub.docker.com 慢:挂代理
  • 964562398 2023-11-20

    谢谢解决了哈哈哈
    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

  • CaesarTang 2023-11-20

    棒~

liong

FROM centos:7
是centos7.0的版本还是7.9

这个image 打出来太大了 大约930多mb 是否可以优化的小一点 大约100-200mb的样子

CaesarTang

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