是的,虽然这是可以做到的,但是仅仅靠docker是很难做到的。kubernetes将使这一切变得非常简单,像dns、服务映射都是开箱即用的。我将包括docker和kubernetes方法:
Docker方法:
初稿如下,在
nginx
服务器名称并用模式设置docker容器名称。为不同的容器创建/etc/hosts条目,如:
172.16.0.1 v1.docker.container版本
172.16.0.2 v2.docker.container版本
nginx服务器配置如下:
server {
listen 80;
server_name "~^(?<ns>[a-z]+.+)\.myapp\.io";
resolver 127.0.0.1:53 valid=30s;
# make sure $ns.docker.container is resolved to container IP
set $proxyserver "$ns.docker.container";
location / {
try_files $uri @clusterproxy;
}
location @clusterproxy {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-IP $clientip;
proxy_set_header X-Forwarded-For $clientip;
proxy_set_header X-Real-IP $clientip;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-FORWARDED-PROTO 80;
proxy_pass http://$proxyserver:80;
}
}
Kubernetes方法:
为命名空间中的不同版本创建不同的服务和部署。假设命名空间是“app namespace”。服务名称不言而喻:
应用版本v1:v1应用服务
应用版本v2:v2应用服务
为了使NGiNX更灵活,可以将服务名称添加到命名空间到
$proxyserver
Nginx规则:
server {
listen 80;
server_name "~^(?<version>[a-z]+.+)\.myapp\.io";
# you can replace this with kubernetes dns server IP
resolver 127.0.0.1:53 valid=30s;
# make sure $ns.docker.container is resolved to container IP
set $proxyserver "$version.app-namespace.svc.kubernetes";
location / {
try_files $uri @clusterproxy;
}
location @clusterproxy {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-IP $clientip;
proxy_set_header X-Forwarded-For $clientip;
proxy_set_header X-Real-IP $clientip;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-FORWARDED-PROTO 80;
proxy_pass http://$proxyserver:80;
}
}