背景
我的大部分Docker容器都是运行在80端口上的Web应用程序。为了让它们都运行在单个主机上,我允许Docker分配一个随机未使用的端口,并使用 jwilder/nginx-proxy
(参考链接) 作为反向代理。这需要在容器启动之前先运行jwilder/nginx-proxy,在构建完成后运行容器的bash脚本中很容易实现:
...
#######################
# ensure that we are running the frontend proxy
# which allows us to run multiple web containers
RESULT=`docker ps | grep jwilder | wc -l`
if [ $RESULT -gt 0 ];then
echo "found frontend proxy."
else
echo "Deploying frontend proxy"
docker run -d \
-p 80:80 \
-v /var/run/docker.sock:/tmp/docker.sock \
-t jwilder/nginx-proxy
fi
#######################
# Now start the container.
docker run -d \
-e VIRTUAL_HOST=$VIRTUAL_HOST \
-p 80 \
-p 443 \
--name="$PROJECT_NAME" \
$CONTAINER_IMAGE
问题
我经常需要重新启动我的服务器,我需要一个解决方案,可以自动并按正确顺序启动所有容器。
我可以使用docker run参数--restart=always
,在重启后使所有正在运行的容器自动启动,但是,如何确保我的反向代理容器首先启动,然后在任何其他容器启动之前有短暂的延迟(以任何顺序)。
理想情况下,我希望有一个解决方案,不依赖于特定的发行版,例如使用supervisord而不是编写upstart或systemd启动脚本,但我需要一种方法来连接到在docker守护程序成功启动后触发的方式。
restart=always
。由于某种原因,我的一些容器在启动时无法启动 apache,因此我将研究在容器内使用 supervisord 以确保 apache 正在运行。 - Programster