我开始学习Docker并设置Nginx和PHP。我看了一些例子,看到下面的例子:https://github.com/aschmelyun/lc-the-docker-tutorial/blob/main/nginx.dockerfile
有两个dockerfile,一个用于NGINX(nginx.dockerfile
):
FROM nginx:stable-alpine
ENV NGINXUSER=laravel
ENV NGINXGROUP=laravel
RUN mkdir -p /var/www/html/public
ADD nginx/default.conf /etc/nginx/conf.d/default.conf
RUN sed -i "s/user www-data/user ${NGINXUSER}/g" /etc/nginx/nginx.conf
RUN adduser -g ${NGINXGROUP} -s /bin/sh -D ${NGINXUSER}
PHP(php.dockerfile
):
FROM php:8-fpm-alpine
ENV PHPGROUP=laravel
ENV PHPUSER=laravel
RUN adduser -g ${PHPGROUP} -s /bin/sh -D ${PHPUSER}
RUN sed -i "s/user = www-data/user = ${PHPUSER}/g" /usr/local/etc/php-fpm.d/www.conf
RUN sed -i "s/group = www-data/group = ${PHPGROUP}/g" /usr/local/etc/php-fpm.d/www.conf
RUN mkdir -p /var/www/html/public
RUN docker-php-ext-install pdo pdo_mysql
CMD ["php-fpm", "-y", "/usr/local/etc/php-fpm.conf", "-R"]
在这两种情况下,都会创建新的用户和组(用户laravel
分配给组laravel
),然后使用sed
命令修改配置文件:
- 对于NGINX,它将用户
/etc/nginx/nginx.conf
中所有出现的www-data
替换为laravel
; - 对于PHP,它做了类似的事情:它将用户和组
www-data
替换为laravel
。
3个相互关联的问题:
**问题1:**这是否意味着NGINX和PHP(我猜只有FPM,CLI不会在那里,因为它从Docker Hub拉php:8-fpm-alpine
基础镜像,其中不包括CLI,对吗?)将作为laravel
用户在容器中运行?(如果是,请看问题3)。
**问题2:**是否有任何实际的理由来更改NGINX和PHP-FPM的默认用户,如上面的示例中所示?
Question 3:php.dockerfile
的末尾有这样一条命令:
CMD ["php-fpm", "-y", "/usr/local/etc/php-fpm.conf", "-R"]
我在Stackoverflow上搜索了这个-R
的意思,我找到了以下答案:https://stackoverflow.com/a/49178410/4437206如果我理解正确,这意味着PHP-FPM将作为root
运行?如果是这样,那么它将不会以我们添加的laravel
用户的身份运行,因此,添加laravel
用户有什么意义呢?
2条答案
按热度按时间ua4mk5z41#
1.是的
1.在容器中以root身份运行东西仍然是不好的,因为root可以并且确实有能力利用漏洞来逃离容器。对于非root用户来说,这几乎是不可能的。
-R
只是阻止FPM抱怨它,它实际上并没有改变谁在执行它。gajydyqb2#
如果你要从一个在非特权模式下运行的orchestrator(比如kubernetes或openshift)运行你的镜像,你不允许以某些用户uid的身份运行进程。港口也是如此。
Nginx的根进程总是需要以root用户的身份启动,而它会以您提供的用户身份生成子进程。这就是为什么有
unprivileged nginx
图像来解决这个问题。Php-fpm不是这样工作的,它只是按照Dockerfile中的用户声明或orchestrator的声明启动。而且作为root在映像中运行进程通常是一个不好的做法,因为主机的内核在容器中可用。如果有人访问了运行映像的shell,他们就可以访问内核,基本上可以访问整个主机。
端口也是如此,端口1到1000上的每个监听器都需要根绑定。从1001到65535的所有其他端口都没有。这就是为什么你经常在8080和8443端口上看到nginx端口配置。
为了回答最后一个问题,
php-fpm -R
用于允许子进程以root身份运行,而不是以root身份启动。