这里有两个可能的答案:(1)直接使用Docker设置端口并使用Nginx / Apache代理虚拟主机,或(2)使用Dokku为您管理端口和虚拟主机(这是我学会的方法1)。
方法1a(使用docker直接分配端口)
步骤1:在主机上设置nginx.conf或Apache,并分配所需的端口号。在主机上运行的此Web服务器将执行vhost代理。关于Docker,这没有什么特别的-它是正常的vhost托管。接下来是特殊部分,即步骤2,使Docker使用正确的主机端口号。
第2步:使用以下命令强制在Docker中分配端口号:“ -p”设置Docker的端口映射,“-e”设置Docker中的自定义环境变量,如下所示:
port=12345
IMAGE=myapps/container-1
id=$(docker run -d -p :$port -e PORT=$port $IMAGE)
echo $id
echo $id > /app/files/CONTAINER
docker ps
docker logs $id
docker kill $id
方法1b硬编码的应用程序端口
...如果您的应用程序使用硬编码端口,例如端口5000(即无法通过PORT环境变量配置,如方法1a),则可以通过Docker进行硬编码,如下所示:
publicPort=12345
id=$(docker run -d -p $publicPort:5000 $IMAGE)
方法2(让Dokku找出端口)
目前,Dokku是管理Docker虚拟主机的一个不错的选择。即将出现的选择可能是使用Flynn,但是截至目前,Flynn才刚刚起步,还没有准备好。因此,我们现在开始使用Dokku:在遵循Dokku安装说明之后,对于单个域,通过创建“ VHOST”文件来启用虚拟主机:
echo yourdomain.com > /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
,然后找出在VPS侧上Dokku映射到应用程序侧5000的任何随机端口。它是可以解决的(将来甚至可能会改变),但是可以!
在后台,VHOST的工作方式是:通过SSH对应用程序进行git push时,Dokku将执行live中的钩子/var/lib/dokku/plugins/nginx-vhosts
。这些挂钩也位于此处的Dokku源代码中,它们负责nginx.conf
使用正确的vhost设置写入文件。如果您没有此目录/var/lib/dokku
,请尝试运行dokku plugins-install
。