这里有两个可能的答案:(1) 直接使用 Docker 设置端口并使用 Nginx/Apache 代理虚拟主机,或者 (2) 使用Dokku为您管理端口和虚拟主机(这是我学习方法 1 的方法)。
方法1a(直接用docker分配端口)
第 1 步:在主机上设置 nginx.conf 或 Apache,并分配所需的端口号。此 Web 服务器在主机上运行,将执行 vhost 代理。这对于 Docker 并没有什么特别之处——它是普通的虚拟主机托管。接下来是特殊部分,在第 2 步中,让 Docker 使用正确的主机端口号。
第二步:在 Docker 中强制端口号分配,“-p”设置 Docker 的端口映射,“-e”在 Docker 中设置自定义环境变量,如下:
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 硬编码应用程序端口
...如果您的应用程序使用硬编码端口,例如端口 5000(即无法通过 PORT 环境变量进行配置,如方法 1a 中所示),则可以通过 Docker 对其进行硬编码,如下所示:
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 虚拟主机的一个不错的选择是Dokku。一个即将到来的选项可能是使用Flynn,但目前 Flynn 才刚刚开始,还没有完全准备好。因此,我们现在使用 Dokku:按照 Dokku 安装说明,对于单个域,通过创建“VHOST”文件启用虚拟主机:
echo yourdomain.com > /home/git/VHOST
# in your case: echo foo > /home/git/VHOST
现在,当通过 SSH 将应用程序推送到 Dokku 时(请参阅 Dokku 文档了解如何执行此操作),Dokku 将查看 VHOST 文件,并且对于推送的特定应用程序(假设您推送了“container-1”),它将生成以下文件:
/home/git/container-1/nginx.conf
它将具有以下内容:
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
然后找出任何随机端口 Dokku 在 VPS 端映射到应用端的 5000。它是圆形的(甚至将来可能会改变),但它有效!
VHOST 的工作方式在底层是:通过 SSH 对应用程序进行 git push 后,Dokku 将执行存在于/var/lib/dokku/plugins/nginx-vhosts
. 这些钩子也位于此处的 Dokku 源代码中,并负责nginx.conf
使用正确的 vhost 设置编写文件。如果您在 下没有此目录/var/lib/dokku
,请尝试运行dokku plugins-install
.