从外部访问 docker 实例的最佳实践是什么。
我计划部署多个docker实例(node.js、php、mysql),要么全部打包在一个实例中,要么通过容器之间的docker链接部署。
可以控制主机上每个 docker 实例的端口,但是从外部访问这些实例的最佳实践是什么?我宁愿只使用子域,并摆脱实例的转发端口。
例子:
user@server:~/sandbox/docker-nginx$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3fc7c57ed66c docker-wordpress-nginx:latest /bin/bash /start.sh 3 days ago Up 3 days 0.0.0.0:49153->80/tcp evil_poincare
预期行为: 请求wordpress.domain.com通过端口49153访问该docker实例里面的wordpress,但是浏览器不会用该端口重写Location。
我看了一下/尝试了几种方法,但没有一个能给我提供这种功能:
- 有弹性使用 routes.json 文件
- 反向代理主机中有 nginx,但重定向 URL 中仍有端口
- 空中码头听起来不错,但尚不支持多主机
- 管道看起来也不错,但是免责声明警告我们它应该很快由 docker 复杂场景提供。
如果您对该问题有任何想法,或者对最佳实践有任何建议,我将不胜感激,也许我只是遗漏了一些东西。
答案1
我为此使用了 nginx,它工作得很好(对我来说)。但是从你的评论来看,它似乎没有像你期望的那样工作……
下面是一个可以工作的简单配置。
/etc/nginx/sites-enabled/wordpress.domain.com
server {
server_name wordpress.domain.com;
location / {
proxy_redirect off;
proxy_set_header Host $host ;
proxy_set_header X-Real-IP $remote_addr ;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ;
proxy_pass http://localhost:49153;
}
}
答案2
最好的做法是避免在 Docker 容器中执行任何命令行任务,让你的 nginx 容器按照你预期的方式启动和运行的最佳方式是创建自定义映像并在映像的 Dockerfile 中添加你的配置文件。
您可以找到有关如何使用自定义配置创建自定义图像的详细说明这里。
答案3
我的回答有点晚了:为了以后参考,你应该看看https://github.com/jwilder/nginx-proxy。该工具自动生成适当的Nginx配置,以将传入的请求转发到Docker容器(基于子域)。
首先,启动 nginx-proxy:
docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
例如,如果你想重定向子域名.com对于特定的容器,只需设置虚拟主机容器环境变量为“子域名.com“:
docker run -e VIRTUAL_HOST=sub.domain.com ...
以下是我写的详细教程:http://blog.florianlopes.io/host-multiple-websites-on-single-host-docker。
它完全符合您预期的行为。