Docker图像自定义nginx.conf

Docker图像自定义nginx.conf,docker,nginx,kubernetes,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/READ

我是个新手,我不知道我的方向是否正确。我有一个自定义的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文件/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运行“图像id”运行,但它不能按预期运行。运行docker ps显示“端口80/tcp” 和“命令nginx-g守护进程…”

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


我假设我必须以某种方式公开nginx.conf中的端口。非常感谢您的帮助。

您必须在运行时发布端口,如下所示:
docker run-p 8000:8000图像id

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\u nginx:dockerfile

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

nginx在容器中侦听什么端口并不重要。如果库存nginx容器希望在标准HTTP端口80上侦听(并且它的
Dockerfile
似乎有一个
EXPOSE 80
指令),那么您可以在nginx配置中使用该指令并
listen 80
(通过TCP,而不是UDP)。然后,在Kubernetes部署中,您可以将其指定为容器端口,如果您想将其映射到其他对象,可以在包装此端口的服务中执行此操作。(在普通Docker中,如果希望主机端口8000避免与其他端口冲突,
Docker run-p8000:80

就最佳实践而言,我不鼓励直接将IP地址写入配置文件。如果它是集群外的持久服务器,您可以在网络中设置DNS服务器来解析其主机名,或者获得类似Amazon Route 53的云服务来为您解决此问题。如果在Kubernetes中,请使用服务的DNS名称,
backend.default.svc.cluster.local
。即使您确实只有一个IP地址,如果服务移动,创建一个IP地址也会对您有所帮助


假设您在ConfigMap中有配置文件,您的部署看起来非常像(它甚至运行一个
nginx:1.7.9
container publishing port 80)。

这不会处理用于反馈的udp thingtanks。我将尝试将配置文件放入配置映射中。使用该服务,我可以将端口80映射到8000,并将其指定为udp?是的,您可以将任意容器端口映射到任意服务端口,并指定TCP与udp。(UDP上的HTTP…很奇怪,如果您不提供HTTP服务,那么我可以看到您需要一个不同的端口,但也可能需要一个不同的代理服务。)谢谢,这让它运行起来了!