我的几乎所有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守护程序成功启动后触发。
答案 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:80
。 hosts
解析了对htt://app
到172.17.0.7
的请求,因此此请求会转发到应用容器。
使用$ docker-compose up
启动所有容器并完成。