重新启动后,按特定顺序启动Docker容器

上下文

几乎所有的Docker容器都是在端口80上运行的Web应用程序。为了允许它们全部在单个主机上运行,​​我允许jwilder/nginx-proxy分配一个随机的未使用端口,并使用jwilder/nginx-proxy ( reference )作为反向代理。 这需要jwilder / nginx-proxy在容器启动之前运行,这在运行创build容器后的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 

问题

通常我需要重新启动我的服务器,我需要一个解决scheme,将自动启动所有容器,并以正确的顺序。

我可以使用docker运行参数--restart=always让我所有的运行容器在重新启动后自动启动,但是,我怎样才能确保我的反向代理容器先于其他任何东西启动,并且之前有一个短暂的延迟任何其他容器都以任何顺序启动。

理想情况下,我想要一个解决scheme, 不是特定于发行版的,比如使用supervisord,而不是写一个暴发户或者systemd启动脚本,但是我需要一个方法在docker守护进程成功启动后挂钩触发。

如果您使用Web应用程序在所有容器上展示端口80,则可以将它们链接到您的Nginx容器。

这里是一个小样本docker-compose.yml

 app: build: app/ expose: - "80" api: build: api/ expose: - "80" webserver: image: nginx ports: - "80:80" volumes: - default.conf:/etc/nginx/conf.d/default.conf links: - app - api 

这里是Nginx的configuration:

 server { listen 80; server_name localhost; location / { proxy_pass http://app; } location /api { proxy_pass http://api; } } upstream app { server app:80; } upstream api { server api:80; } 

当你将一个容器链接到另一个容器(在本例中是Nginx)时,Docker会更改/etc/hosts文件并添加如下所示的行:

您的项目_api_1 172.17.0.7 api 165637cfd4ab

172.17.0.5 app dedf870dec53 yourproject_app_1

所以Nginx知道api和app容器。

当一个请求进入'localhost:80'时,Nginx会将它代理到http://app:80hosts将请求parsing为htt://app172.17.0.7 ,所以这个请求被转发到应用程序容器。

$ docker-compose up启动所有的容器,然后就完成了。