几乎所有的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守护程序成功启动后挂钩到触发.
如果您使用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://app到172.17.0.7,因此该请求被转发到该应用的容器.
$ docker-compose up你已经完成了所有容器的启动.
| 归档时间: |
|
| 查看次数: |
4240 次 |
| 最近记录: |