Docker 自动化 Nginx 反向代理

自动化 Nginx 反向代理 Docker

标签(空格分隔): Docker Nginx Automated


本文作者是 jwilder,原文地址是 Automated Nginx Reverse Proxy for Docker

为什么 Docker 要使用反向代理

Docker 容器被分配随机 IP 和端口,这使得从客户端角度来寻址它们是非常复杂的。默认,IP 和端口是专用于主机的,并且不能被外部访问除非它们被绑定到主机上。

绑定容器到主机端口可以防止多个容器在同一个主机上运行。比如,在同一时间仅仅只有一个容器可以被绑定到 80 端口。这也使得新版本的容器无停机的推出复杂化了,因为老版本必须在新版本启动之前先停止。

一个反向代理可以帮助处理这些问题,同时通过减轻零停机部署的困难来提升可用性。

生成反向代理配置文件

当一个容器被启动和停止的时候,设置一个反向代理配置可能是复杂的。通常的配置需要手动更新,这容易出错并且费时。

幸运的是,Docker 提供了一个远程 API 来 inspect containers 和访问他们的 IP,端口和其他配置元数据。另外,它也提供一个实时事件 API可以被用于通知什么时候容器被启动和停止。这些 API 可以被用于自动地生成一个反向代理配置。

docker-gen 是一个使用这些 API 的小工具,并导出容器的元数据到模板中。模板被渲染以及一个可选的通知命令可以被运行来重起服务。

使用 docker-gen,我们可以自动的生成 Nginx 的配置并重载 Nginx当它们改变的时候。同样的方法可被用于 Docker 日志管理。

Nginx 反向代理 Docker

这个例子 Nginx 模板可以被用于生成一个 Docker 容器使用虚拟主机路由的反向代理配置文件。这个模板是使用 golang text/template package 实现的。它使用一个通用的 groupBy 模板函数通过它们的 VIRTUAL_HOST 环境变量来分组运行的容器。这简化了遍历容器来生成一个负载均衡后端以及使得零停机部署可行。

{{ range $host, $containers := groupBy $ "Env.VIRTUAL_HOST" }}
upstream {{ $host }} {

{{ range $index, $value := $containers }}
    {{ with $address := index $value.Addresses 0 }}
    server {{ $address.IP }}:{{ $address.Port }};
    {{ end }}
{{ end }}

}

server {
    #ssl_certificate /etc/nginx/certs/demo.pem;
    #ssl_certificate_key /etc/nginx/certs/demo.key;

    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    server_name {{ $host }};

    location / {
        proxy_pass http://{{ $host }};
        include /etc/nginx/proxy_params;
    }
}
{{ end }}

这个模板可以使用 docker-gen 来运行:

docker-gen -only-exposed -watch -notify "/etc/init.d/nginx reload" templates/nginx.tmpl /etc/nginx/sites-enabled/default
  • -only-exposed - 仅仅使用容器已经暴露的端口。
  • -watch - 启动之后,监控 docker 容器事件和重新生成模板。
  • -notify "/etc/init.d/nginx reload" - 在模板生成后重载 nginx 配置。
  • templates/nginx.tmpl - nginx 模板。
  • /etc/nginx/sites-enabled/default - 目标文件。

这是两个容器配置了 VIRTUAL_HOST=demo1.localhostVIRTUAL_HOST=demo2.localhost 的渲染模板。

upstream demo1.localhost {
    server 172.17.0.4:5000;
    server 172.17.0.3:5000;
}

server {
    #ssl_certificate /etc/nginx/certs/demo.pem;
    #ssl_certificate_key /etc/nginx/certs/demo.key;

    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    server_name demo1.localhost;

    location / {
        proxy_pass http://demo.localhost;
        include /etc/nginx/proxy_params;
    }
}

upstream demo2.localhost {
    server 172.17.0.5:5000;
}

server {
    #ssl_certificate /etc/nginx/certs/demo.pem;
    #ssl_certificate_key /etc/nginx/certs/demo.key;

    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    server_name demo2.localhost;

    location / {
        proxy_pass http://demo2.localhost;
        include /etc/nginx/proxy_params;
    }
}

试验

我使用这个设置创建了一个可信任的构建来使得它非常容易试验。

运行 nginx-proxy 容器:

$ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock -t jwilder/nginx-proxy

使用一个 VIRTUAL_HOST 环境变量启动你的容器:

docker run -e VIRTUAL_HOST=foo.bar.com -t ...

总结

为 docker 容器生成 nginx 反向代理配置可以通过使用 Docker APIs 和一些基础的模板自动化,这可以简化部署同时提升可用性。

虽然这非常适用于单台主机上运行的容器,为远程主机生成配置需要自动发现。看一下 Docker 自动发现 对这个问题的解决。

更新:这有一些类似观点和变种的其他文章值得一看:

  • Using Nginx, Confd, and Docker for Zero-Downtime Web Update - Brian Ketelsen
  • Docker Events - Michael Crosby
  • Haproxy As A Static Reverse Proxy for Docker Containers - Oskar Hane
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,关于docker nginx反向代理的实现,我们可以按照以下步骤进行操作: 1. 首先,我们需要安装dockerdocker-compose,这里不再赘述。 2. 在本地创建一个文件夹,例如:/home/user/nginx-proxy,并在该文件夹下创建两个文件:docker-compose.yml和nginx.conf。 3. 在docker-compose.yml中添加以下内容: ``` version: '3' services: nginx-proxy: image: nginx restart: always ports: - "80:80" - "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf - /etc/nginx/certs - /etc/nginx/vhost.d - /usr/share/nginx/html - /var/run/docker.sock:/tmp/docker.sock:ro networks: - proxy labels: com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true" nginx-letsencrypt: image: jrcs/letsencrypt-nginx-proxy-companion restart: always volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./certs:/etc/nginx/certs:rw - /etc/nginx/vhost.d - /usr/share/nginx/html depends_on: - nginx-proxy networks: - proxy networks: proxy: ``` 4. 在nginx.conf中添加以下内容: ``` worker_processes 4; pid /run/nginx.pid; events { worker_connections 1024; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; gzip on; gzip_disable "msie6"; upstream app { server app:5000; } server { listen 80; server_name example.com; location / { proxy_pass http://app; } } include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } ``` 上述配置文件中,我们创建了两个服务:nginx-proxy和nginx-letsencrypt,其中nginx-proxy是反向代理服务器,用于将请求转发到后端服务;nginx-letsencrypt则是证书管理器,用于自动获取SSL证书。 5. 最后,执行以下命令启动docker容器: ``` cd /home/user/nginx-proxy docker-compose up -d ``` 至此,我们已经成功搭建了docker nginx反向代理。需要注意的是,上述配置文件中的example.com需要替换为你自己的域名。同时,需要将后端服务的域名修改为对应的服务名,例如上述配置文件中的upstream app对应的后端服务名为app。 ### 回答2: Docker是一种容器化技术,可以将应用程序和其所有依赖项打包到一个可移植的容器中,实现快速部署和可扩展性。而Nginx是一种高性能的反向代理服务器,可以将客户端请求转发给后端服务器。 使用Docker部署Nginx反向代理可以带来以下好处: 1. 灵活性:通过将Nginx作为容器运行,可以轻松地在不同主机和环境中部署和迁移。 2. 高度可扩展:使用Docker Swarm或Kubernetes等容器编排工具,可以方便地实现Nginx反向代理的横向扩展,以适应高流量和高并发的情况。 3. 隔离性:通过将Nginx容器与其他容器分离,可以实现应用程序和Nginx之间的隔离性,从而确保应用程序的稳定性和安全性。 具体实现步骤如下: 1. 创建一个Docker镜像,该镜像包含了Nginx的安装和配置文件。 2. 创建Nginx配置文件,配置反向代理规则。可以通过编辑nginx.conf文件来定义代理规则和监听端口。 3. 构建Docker镜像,使用Dockerfile定义生成镜像的步骤和依赖项。在构建镜像时,可以将Nginx配置文件复制到镜像中。 4. 运行Docker容器,使用docker run命令来运行Nginx容器。可以指定Nginx容器所监听的端口和要代理的后端服务器地址。 5. 验证反向代理是否生效,通过访问Nginx容器所监听的端口,观察是否能够成功访问后端服务器。 总之,使用Docker部署Nginx反向代理可以实现快速部署、横向扩展和隔离应用程序与Nginx容器的优势。这种方式可以提高应用程序的可靠性和可伸缩性,同时简化了配置和管理的过程。 ### 回答3: Docker是一种轻量级的容器化技术,而Nginx是一种高性能的Web服务器和反向代理服务器。将两者结合起来可以实现Docker中的Nginx反向代理。 在使用Docker中的Nginx反向代理时,首先需要创建一个Nginx的容器。可以使用Docker命令创建一个Nginx容器,例如: docker run --name my-nginx -d -p 80:80 nginx 这个命令将创建一个名为my-nginx的容器,并将宿主机的80端口映射到Nginx容器的80端口。此时,可通过访问宿主机的IP地址来访问Nginx容器。 接下来,我们需要配置Nginx容器进行反向代理。可以通过进入容器来修改Nginx的配置文件。例如: docker exec -it my-nginx /bin/bash 通过上述命令进入容器的命令行界面后,可以编辑Nginx的配置文件,在容器中的路径为`/etc/nginx/nginx.conf`。可以使用vim等编辑器进行编辑。找到配置文件中的`server`块,将`location`块配置为反向代理的配置,例如: location / { proxy_pass http://backend-server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } 其中,`backend-server`为实际后端服务器的地址。可以根据需求进行修改。 完成配置后,保存退出容器,并重启Nginx容器以使配置生效: docker restart my-nginx 此时,通过访问宿主机的IP地址,Nginx容器将根据反向代理配置将请求转发至后端服务器,并将响应返回给客户端。 综上所述,使用Docker中的Nginx反向代理可以方便地实现将客户端请求代理到后端服务器,提高应用的性能和可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值