Alpine 容器不再有 nginx 监听 80、443,但是为什么呢?

Alpine 容器不再有 nginx 监听 80、443,但是为什么呢?

我认为,这更多的是一个 Docker 问题,而不是其他问题,但请允许我先描述一下情况。

我们将基础镜像升级到我们的一个容器中php:7.3.28-fpm-alpine3.13php:7.3.28-fpm-alpine3.14。图像中发生变化的项目包括:

  • Alpine Linux:从版本 3.13.5 到 3.14.0(根据cat /etc/os-release
  • Nginx:从 1/18.0 到 nginx/1.20.2

nginx 配置文件和用于生成最终镜像的 Dockerfile 在构建期间均未发生改变。然而,网络状态-tulpn有一个完全不同的故事要讲。

使用旧镜像构建的容器显示:

# netstat -tupln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      51/nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      51/nginx
tcp        0      0 127.0.0.11:36625        0.0.0.0:*               LISTEN      -
tcp        0      0 :::9000                 :::*                    LISTEN      52/php-fpm.conf)
udp        0      0 127.0.0.11:57860        0.0.0.0:*                           -

最新报道显示:

# netstat -tupln

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.11:40511        0.0.0.0:*               LISTEN      -
tcp        0      0 :::9000                 :::*                    LISTEN      49/php-fpm.conf)
udp        0      0 127.0.0.11:49917        0.0.0.0:*                           -

所以我不知道哪个组件升级导致突然拒绝监听端口 80 或端口 443。

我想我得再次处理类似的情况,所以我对诊断和隔离此类问题的方法非常感兴趣。我仔细阅读了所有相关组件的发行说明,但没有发现任何会关闭端口访问的更改。

思考nginx 最有可能是罪魁祸首,但我无法确定。它的主要配置文件看起来不错:

# cat /etc/nginx/conf.d/default.conf
server {
    listen 80 default_server;
    include ssl.conf;

    server_name my_server.test;

    root /var/www/html/my_server;
    index index.php;
    location / {
        try_files $uri $uri/ =404;
    }

    rewrite ^/v1/(.*) /api.php/$1 break;

    location ~ [^/]\.php(/|$) {
        include php-fpm.conf;
    }
}

这是一个已知问题(但记录不全)吗?我还可以检查什么?

答案1

我有过类似的经历,这是由于当 docker 以非 root 用户身份运行时,nginx 试图打开一个特权端口(低于 1024)。

相关内容