访问docker实例 – 最佳实践

从外部访问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。

我看了一下/尝试了几种方法,但没有给我的function:

  • 有线路由.json文件
  • 在主机中使用nginx 反向代理 ,但仍然在redirect的url中有端口
  • skydock听起来不错,但没有多主机支持
  • pipe道工程看起来也不错,但免责声明警告我们很快应该由docker工程师提供。

对这个问题的任何想法,以及对最佳做法的任何build议将不胜感激,也许我只是失去了一些东西。

最好的做法是避免在Docker容器中执行任何命令行任务,让你的nginx容器正常运行的最好方法就是创build一个自定义镜像并将你的configuration文件添加到镜像的Dockerfile中。

您可以在这里find关于如何使用自定义configuration创build自定义图像的详细说明。

我为此使用nginx,它工作得很好(对我来说)。 从你的评论听起来像它不工作,但你的期望,然而…

下面是一个简单的configuration。

/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; } } 

我的答案有点晚了:为了将来的参考,你应该看看https://github.com/jwilder/nginx-proxy 。 这个工具会自动生成合适的Nginxconfiguration,将传入的请求转发到Docker容器(基于子域)。

首先,启动nginx-proxy:

 docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy 

例如,如果要将sub.domain.comredirect到特定的容器,只需将VIRTUAL_HOST容器环境variables设置为“ sub.domain.com ”:

 docker run -e VIRTUAL_HOST=sub.domain.com ... 

这里是我写的一个详细的教程: http : //blog.florianlopes.io/host-multiple-websites-on-single-host-docker 。

它完美匹配您的预期行为。