请问docker里面怎么优化linux内核?

dignfei

docker官方php镜像中,既没有文件 /etc/sysctl.conf,也没有sysctl命令,
 
请问要在容器里面优化内核 ,还是在外部的物理机的linux上优化内核?

4206 4 3
4个回答

Caesar-Tang

在 docker 中尝试了一下午,结果已失败告终。

  1. 尝试使用 php-cli 官方镜像,在安装 event 时失败。通过 编译 和 pecl 安装,在最后 enable 后,通过 php -m|grep event,提示:Warning: PHP Startup: Unable to load dynamic library 'event'
  2. 尝试使用 centos,ubuntu 等 系统镜像,安装 event 成功,但在优化 linux 内核时失败
    (1)其中该配置会提示找不到:netdev_max_backlog: No such file or directory,国内国外搜索了一番,未找到解决方法,以下仅供参考:
    https://github.com/moby/moby/issues/30778
    (2)没有文件:/etc/sysctl.conf,该文件可以自己创建
    (3)启动时使用 --privileged,使其具备最高权限,可以在容器内使用 sysctl,否则会出现 Read-only file system
  3. 以下是未优化的 dockerfile 文件,仅供参考:

FROM centos:7

RUN yum -y install epel-release
RUN yum -y install https://mirrors.aliyun.com/remi/enterprise/remi-release-7.rpm
RUN yum -y install yum-utils

RUN yum-config-manager --enable remi-php73
RUN yum -y install php-cli php-posix php-event php-zip php-openssl php-devel php-gd php-mbstring php-curl php-xml php-pear php-bcmath php-json php-mysqlnd php-redis --skip-broken

RUN mkdir /app
COPY ./ /app
WORKDIR /app
RUN chmod -R 777 runtime

CMD ["php", "/app/start.php", "start"]

接下来准备使用阿里云的系统完成优化后,然后打包制作镜像。但也在犹豫这么做的意义,因为物理机是同样需要优化的。

  • 暂无评论
admin

使用Alpine linux + docker,非常方便安装event拓展

截图

apk search event

apk add php7-event
apk add libevent

截图

  • 暂无评论
Tinywan

推荐使用 Alpine linux,参考:https://github.com/Tinywan/docker-php-webman

  • 暂无评论
Caesar-Tang

首先,感谢上面两位大佬对于安装event的提出的方案。

关于内核优化的第2点问题,目前为止已经有了些头绪。

  1. 系统内核参数有的会被设置为命名空间内核参数(sysctls),但并非所有的系统内核参数都具有命名空间,目前 docker 官方已经对部分做了支持,文档如下:https://docs.docker.com/engine/reference/commandline/run/#/configure-namespaced-kernel-parameters-sysctls-at-runtime
    按照文档说明,系统以 net.* 的会被支持,但实际测试 net.core.netdev_max_backlog 仍然不行。
  2. 通过将容器的网络模式,设置为 --net host,问题得以解决,因为此方式,直接和宿主机共用一个Network Namespace,但产生的问题就是容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
  3. 该问题在 stackoverflow 也有广泛的讨论:https://stackoverflow.com/questions/26177059/refresh-net-core-somaxcomm-or-any-sysctl-property-for-docker-containers
    对于最高评论的方案做过测试,方案二是失败的。即使添加了 --privileged,也没有权限写入文件。并且也不建议这么做。

目前看来,通过将容器的网络模式设置为 --net host 是一个可行的方案。因为 webman 的服务,一般是独立的并且可以由开发者自定义端口,和 nginx 或 mysql 等服务有所不同。

  • 暂无评论
年代过于久远,无法发表回答
🔝