docker - 需要帮助对 nginx 的自定义 docker 映像进行故障排除
问题描述
我想安装一个简单的 Web 服务来浏览内部服务器上的文件目录树并遵守公司政策,它需要使用 TLS(“https://...”)。
首先,我尝试了几个图像,包括 davralin/nginx-autoindex 并安装了我希望此服务共享的目录。它就像一个魅力,但它没有使用 TLS 连接。
为了让 TLS 能够工作,我从头开始并为 nginx 创建了自己的 default.conf 文件:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name localhost;
ssl_certificate /etc/ssl/certs/my-cert.crt;
ssl_certificate_key /etc/ssl/certs/server.key;
location / {
root /usr/share/nginx/html;
autoindex on;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
然后我创建了以下 Dockerfile:
FROM nginx:stable-alpine
MAINTAINER lsiden at gmail.com
COPY default.conf /etc/nginx/conf.d
COPY my-cert.crt /etc/ssl/certs/
COPY server.key /etc/ssl/certs/
然后我构建它:
docker build -t lsiden/nginx-autoindex-tls .
然后我运行它:
docker run -dt -v /var/www/data/files:/usr/share/nginx/html:ro -p 3453:80 lsiden/nginx-autoindex-tls
但是,即使从主机我也无法访问它。我试过了:
$ telnet localhost 3453
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
我试图阅读日志消息:
docker logs <container-id>
安静。
我已经确认 docker 代理正在监听端口:
tcp6 0 0 :::3453 :::* LISTEN 14828/docker-proxy
该端口显示在 tcp6 但不是“tcp”(ipv4),但我在这里读到netstat 将仅显示 ipv6 连接,即使它在两者上都可用。可以肯定的是,我验证了:
sudo sysctl net.ipv6.bindv6only
net.ipv6.bindv6only = 0
为了彻底,我已经在 iptables 中打开了这个端口,尽管如果我什至无法通过 localhost 从同一台机器访问它,iptables 就无法在这里发挥作用。
我希望有良好网络能力的人可以告诉我下一步该往哪里看。我无法弄清楚我错过了什么。
解决方案
如果您共享的配置已完成,则您根本不会在容器内的端口 80 上列出。
如果您想将端口 80 上的传入流量重定向到 443,请将您的配置更改为类似的内容:
server {
listen 80;
listen [::]:80;
location / {
return 301 https://$server_name$request_uri;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name localhost;
ssl_certificate /etc/ssl/certs/my-cert.crt;
ssl_certificate_key /etc/ssl/certs/server.key;
location / {
root /usr/share/nginx/html;
autoindex on;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
如果您不想这样做,只需更改您的docker run
命令:
docker run -dt -v /var/www/data/files:/usr/share/nginx/html:ro -p 3453:443 lsiden/nginx-autoindex-tls
推荐阅读
- xml - 架构检查错误:必须声明元素
- python - 如何在 Python 和 RobotFramework 之间传递在 Python 函数中创建的变量
- powershell - 可以通过 ExpandProperty 获取属性值,但不能通过直接访问
- c# - 当我将 Task.Run 包装在单独的 async/await 方法中时引发 TaskCanceledException
- linker - 与 macOS Mojave 上的框架链接
- git - 如何在同一目录中将 2 个 repos 分组
- shift-register - 移位寄存器中的 CLKCTRL
- angular - Get Tags Value click method in Angular
- java - Hibernate @GenericGenerator(name = "uuid2", strategy = "uuid2") 取出连字符 '-' 到 32 个长度的字符
- excel - VBS 打开 Excel 工作簿不显示