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

Pro*_*ter 8 docker

上下文

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

问题

我经常需要重新启动我的服务器,我需要一个能够以正确的顺序自动启动所有容器的解决方案.

我可以使用docker run paramater --restart=always让我的所有正在运行的容器在重启后自动启动,但是,我怎样才能确保我的反向代理容器首先在其他任何容器之前启动,并且在任何其他容器之前有一个短暂的延迟开始(以任何顺序).

理想情况下,我想要一个不会特定于发行版的解决方案,例如使用supervisord而不是编写upstart或systemd启动脚本,但我需要一种方法来在docker守护程序成功启动后挂钩到触发.

Ora*_*Tux 5

如果您使用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
Run Code Online (Sandbox Code Playgroud)

这里是Nginx的配置:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

172.17.0.7 api 165637cfd4ab yourproject_api_1

172.17.0.5 app dedf870dec53 yourproject_app_1

所以Nginx知道api和app容器.

当一个请求进入'localhost:80'时,Nginx将代理它http://app:80.在hosts解决了一个请求htt://app172.17.0.7,因此该请求被转发到该应用的容器.

$ docker-compose up你已经完成了所有容器的启动.