我的Nginx不在泊坞窗图片中。我的应用程序是在docker镜像中。他们都住在同一台服务器上。
我不希望在Docker镜像中使用Nginx,因为我配置起来看起来非常复杂。但我的应用程序正在一个docker容器中运行。
如何配置Nginx以使用运行我的应用程序的docker镜像?
这是我的Nginx配置文件:
server {
listen 80;
server_name my.domain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name www.nicolasxu.space nicolasxu.space;
# add Strict-Transport-Security to prevent man in the middle attacks
add_header Strict-Transport-Security "max-age=31536000";
ssl_certificate /root/.ssh/nicolasxu.space.cert;
ssl_certificate_key /root/nicolasxu.space.key;
[....]
}
答案 0 :(得分:2)
要在dockerized webapp前面轻松设置nginx(在docker主机中)作为反向代理,您只需--publish
webapp的端口并将流量路由到此端口:
使用--publish
参数运行docker容器,将主机端口与容器的webapp端口绑定,例如使用jenkins容器,我会这样做:
docker run --publish 127.0.0.1:8080:8080 --name jenkins jenkins
这将容器的端口8080绑定到主机的localhost的127.0.0.1
上的端口80(如果您不使用任何防火墙,这将避免向任何人打开端口8080)。 Docker User Guide详细解释了如何在Docker中操作端口。
将所有传入的流量转发为reverse proxy到您的端口的本地容器(在我的示例中为8080)
server {
...
listen 443 ssl;
server_name www.nicolasxu.space nicolasxu.space;
...
ssl_certificate ...
location / {
# forward all the trafic to docker container's published port
proxy_pass http://localhost:8080;
}
}
在nginx上设置SSL并将交通路由作为HTTP路由到dockerized webapp是一个很好的做法,它将像魅力一样工作。
修改
为了获得最佳性能,您还可以使用:
docker run --network=host ...
使用--network=host
时,docker会指示容器使用主机网络堆栈。您不必拥有主机上的--publish
端口,因为它是相同的网络堆栈,并且Web应用程序将在其本地端口上可用。