Docker映像自定义nginx.conf

时间:2018-07-27 13:54:30

标签: docker nginx kubernetes

我对此还很陌生,我不知道我是否朝着正确的方向前进。我有一个自定义的nginx.conf,可以正常工作,我现在正尝试用它构建一个docker映像,以便可以在kuberentes中将其作为容器运行。

这是我的nginx.conf

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}


stream {
    #define the various upstreams
    upstream app_1 {
        server 192.168.122.206:5678;
    }

    upstream app_2 {
        server 192.168.122.206:9000;
    }   
    #map source port to upstream
    map $remote_port $backend_svr {
        1234 "app_1";
        1235 "app_2";
    }
    #all udp traffic received on 8000, depending on source it will be redirected
    server {
        listen 8000 udp;
        proxy_pass $backend_svr;
    }

}

在我的虚拟机上,我有/ home / asvilla / docker-files / nginx-udp / Dockerfile,其中包含

FROM nginx
RUN chmod +w /etc/nginx/nginx.conf
COPY nginx.conf /etc/nginx/nginx.conf
RUN cat /etc/nginx/nginx.conf

我使用

构建它
docker build -t "custom_nginx:dockerfile" .

nginx容器应根据udp数据包的来源将在端口8000上传入的udp流量重定向到端口5678或端口9000。

我使用docker run'image-id'运行,但是它没有按预期运行。运行docker ps显示“ PORTS 80 / tcp” 和“ ...的COMMAND nginx-g守护程序”

关于这些含义的任何指针。默认情况下,nginx将tcp绑定到端口80,但我更改了nginx.conf,我运行的cat命令显示文件已更新。

我假设我必须以某种方式公开nginx.conf中的端口。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

您必须像这样在运行时发布端口: docker run -p 8000:8000 image-id

答案 1 :(得分:1)

如果您的最终目标是在Kubernetes中运行它,那么最简单的方法是将该配置文件放入ConfigMap中,然后只需配置Deployment即可运行标准的nginx映像。 (在普通Docker中,您可以使用docker run -v在运行时将配置文件注入容器中,以达到类似效果。)

nginx在容器内监听哪个端口并不重要。如果常规的nginx容器希望在标准的HTTP端口80上侦听(并且看起来其Dockerfile具有EXPOSE 80指令),则可以在nginx配置中将其和listen 80包含在其中(通过TCP,而不是UDP)。然后在Kubernetes部署中,可以将其指定为容器端口,如果要将其映射到其他端口,则可以在包装此端口的Service中进行。 (在普通Docker中,如果希望主机端口8000避免与其他事物冲突,docker run -p8000:80。)

就最佳做法而言,我不鼓励直接将IP地址写入配置文件。如果它是集群外部的持久服务器,则可以在网络中设置DNS服务器来解析其主机名,或者获取诸如Amazon Route 53之类的云服务来为您执行此操作。如果它在Kubernetes中,请使用服务的DNS名称backend.default.svc.cluster.local。即使您实际上只有一个IP地址,如果服务移动,创建一个ExternalName service也将为您提供帮助。

假设您在ConfigMap中有配置文件,那么您的Deployment看起来很像the sample Deployment in the Kubernetes documentation(它甚至运行着nginx:1.7.9容器发布端口80)。

答案 2 :(得分:-1)

您需要在Dockerfile中添加EXPOSE

FROM nginx
RUN chmod +w /etc/nginx/nginx.conf
COPY nginx.conf /etc/nginx/nginx.conf
RUN cat /etc/nginx/nginx.conf

EXPOSE 8000

然后在您运行它时执行:docker run -p 8000:8000 custom_nginx:dockerfile