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

时间:2015-06-12 09:46:31

标签: docker

上下文

我的几乎所有docker容器都是在端口80上运行的Web应用程序。为了允许它们在单个主机上运行,​​我允许docker分配一个随机的未使用端口,并使用jwilder/nginx-proxy({{ 3}})作为反向代理。 这需要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 paramater --restart=always让我的所有正在运行的容器在重启后自动启动,但是,我怎样才能确保我的反向代理容器首先在其他任何东西之前启动,并且有一个在任何其他容器启动之前的短暂延迟(按任何顺序)。

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

1 个答案:

答案 0 :(得分:5)

如果您使用网络应用程序在所有容器上expose端口80,则可以link将它们发送到您的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的配置:

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文件并添加如下所示的行:

  

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:80hosts解析了对htt://app172.17.0.7的请求,因此此请求会转发到应用容器。

使用$ docker-compose up启动所有容器并完成。