首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将vhosts分配给Docker端口

将vhosts分配给Docker端口
EN

Stack Overflow用户
提问于 2013-08-29 04:27:18
回答 2查看 31.1K关注 0票数 84

我设置了一个通配符DNS,以便所有发送到自定义域(*.foo)的web请求都映射到Docker主机的IP地址。如果我有多个运行Apache (或Nginx)实例的容器,每个容器都会将Apache端口(80)映射到某个外部入站端口。

我想要做的是向container-1.foo发出一个请求,它已经通过我的自定义DNS服务器映射到正确的IP地址( Docker主机),但是将默认端口80请求代理到正确的Docker外部端口,以便来自指定容器的正确Apache实例能够基于自定义域进行响应。同样,container-2.foo将代理到第二个容器的apache,依此类推。

有没有预先构建的解决方案,我最好的选择是在Docker主机上运行Nginx代理,还是应该编写一个能够管理Docker容器的node.js代理(通过web启动/停止/重新启动),或者...?我有哪些选项可以让使用Docker容器更像一个自然事件,而不是使用无关的端口和容器变戏法?

EN

回答 2

Stack Overflow用户

发布于 2013-09-05 03:41:54

这里有两个可能的答案:(1)直接使用Docker设置端口,并使用Nginx/Apache代理vhosts,或者(2)使用Dokku为您管理端口和vhost(这是我学习如何做的方法1)。

方法1a (使用docker直接分配端口)

步骤1:在主机上设置nginx.conf或Apache,并分配所需的端口号。在主机上运行的此web服务器将执行vhost代理。关于Docker,这并没有什么特别之处--它是普通的vhost托管。在步骤2中,接下来是特殊部分,使Docker使用正确的主机端口号。

Step2:强制在Docker中分配端口号,使用-p设置Docker的端口映射,使用-e设置Docker内的自定义环境变量,如下所示:

代码语言:javascript
复制
port=12345 # <-- the vhost port setting used in nginx/apache
IMAGE=myapps/container-1
id=$(docker run -d -p :$port -e PORT=$port $IMAGE)
# -p :$port will establish a mapping of 12345->12345 from outside docker to
# inside of docker.
# Then, the application must observe the PORT environment variable
# to launch itself on that port; This is set by -e PORT=$port.

# Additional goodies:
echo $id # <-- the running id of your container
echo $id > /app/files/CONTAINER # <-- remember Docker id for this instance
docker ps # <-- check that the app is running
docker logs $id # <-- look at the output of the running instance
docker kill $id # <-- to kill the app

方法1b硬编码应用程序端口

...if你的应用程序使用一个硬编码的端口,例如端口5000 (也就是不能通过端口环境变量来配置,就像在方法1a中一样),然后它可以像这样通过Docker硬编码:

代码语言:javascript
复制
publicPort=12345
id=$(docker run -d -p $publicPort:5000 $IMAGE)
# -p $publicPort:5000 will map port 12345 outside of Docker to port 5000 inside
# of Docker. Therefore, nginx/apache must be configured to vhost proxy to 12345,
# and the application within Docker must be listening on 5000.

方法2(让Dokku找出端口)

目前,管理Docker vhosts的一个很好的选择是Dokku。一个即将到来的选择可能是使用Flynn,但到目前为止,Flynn才刚刚开始,还没有完全准备好。因此,我们现在使用Dokku :在遵循Dokku安装说明之后,对于单个域,通过创建"VHOST“文件来启用vhosts:

代码语言:javascript
复制
echo yourdomain.com > /home/git/VHOST
# in your case: echo foo > /home/git/VHOST

现在,当通过SSH将应用程序推送到Dokku时(请参阅Dokku文档了解如何操作),Dokku将查看VHOST文件,对于特定的推送应用程序(假设您推送的是"container-1"),它将生成以下文件:

代码语言:javascript
复制
/home/git/container-1/nginx.conf

它将包含以下内容:

代码语言:javascript
复制
upstream container-1 { server 127.0.0.1:49162; }
server {
  listen      80;
  server_name container-1.yourdomain.com;
  location    / {
    proxy_pass  http://container-1;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}

当服务器重新启动时,Dokku将确保Docker使用映射到其初始部署端口(此处为49162)的端口启动应用程序,而不是随机分配另一个端口。为了实现这种确定性分配,Dokku将最初分配的端口保存到/home/git/container-1/PORT中,并在下一次启动时将PORT环境设置为此值,并将Docker的端口分配映射为主机端和应用程序端的此端口。这与第一次发布相反,当时Dokku将设置PORT=5000,然后找出VPS端的Dokku映射到应用程序端的5000的任何随机端口。它到处都是(甚至在未来可能会改变),但它是有效的!

在幕后,VHOST的工作方式是:通过SSH对应用进行git推送时,Dokku将执行驻留在/var/lib/dokku/plugins/nginx-vhosts中的钩子。这些钩子也位于独岛源代码here中,负责使用正确的vhost设置写入nginx.conf文件。如果/var/lib/dokku下没有此目录,请尝试运行dokku plugins-install

票数 42
EN

Stack Overflow用户

发布于 2013-12-15 07:20:03

使用docker,您希望内部up保持正常(例如80),并弄清楚如何连接随机端口。

处理它们的一种方法是使用像hipache这样的反向代理。将您的dns指向它,然后您可以在容器上下浮动时重新配置代理。看看http://txt.fliglio.com/2013/09/protyping-web-stuff-with-docker/,看看它是如何工作的。

如果你正在寻找更健壮的东西,你可能想看看“服务发现”。(使用docker查看服务发现:http://txt.fliglio.com/2013/12/service-discovery-with-docker-docker-links-and-beyond/)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18497564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档