同一Docker宿主机不同容器部署站点的正确配置方法
Docker单宿主机多容器独立站点托管实现方案
你之前在容器内部配置HTTP重定向/重写规则不生效,核心原因是端口映射是Docker宿主机iptables层面实现的转发逻辑,容器内的服务默认收到的是转发后的流量,感知不到宿主机的端口、域名信息,不需要在容器内部做相关配置,按以下方案实现即可:
基础端口映射方案(匹配你给出的映射规则需求)
直接使用Docker原生端口映射功能就能实现,不需要额外组件:
- 启动container1(apache)命令:
docker run -d -p 8080:80 --name container1 -v /本地站点1根目录:/usr/local/apache2/htdocs httpd:latest
参数说明:-p 宿主机端口:容器端口表示将宿主机对应端口的所有请求转发到容器的对应端口,-v参数是将本地站点文件挂载到apache默认站点目录,你也可以替换成自己编译的apache镜像。 - 启动container2(apache)命令:
docker run -d -p 8081:80 --name container2 -v /本地站点2根目录:/usr/local/apache2/htdocs httpd:latest
配置完成后,访问http://example1.com:8080即可打开container1托管的站点,访问http://example2.com:8081即可打开container2托管的站点。
优化方案:无端口号访问
如果不想让用户访问时携带端口号,可以通过反向代理实现80端口统一入口,推荐用Nginx实现,步骤如下:
- 先创建独立的Docker网络,确保代理容器和业务容器网络互通:
docker network create web-network - 启动两个apache业务容器,不需要映射宿主机端口:
docker run -d --name container1 --network web-network -v /本地站点1根目录:/usr/local/apache2/htdocs httpd:latestdocker run -d --name container2 --network web-network -v /本地站点2根目录:/usr/local/apache2/htdocs httpd:latest - 启动Nginx代理容器,映射宿主机80端口:
docker run -d -p 80:80 --name nginx-proxy --network web-network -v /本地Nginx配置目录:/etc/nginx/conf.d nginx:latest - 在本地Nginx配置目录新增配置文件
proxy.conf,内容如下:
server { listen 80; server_name example1.com; location / { proxy_pass http://container1:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } server { listen 80; server_name example2.com; location / { proxy_pass http://container2:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
配置重载Nginx后,直接访问http://example1.com和http://example2.com即可分别访问对应站点,不需要携带端口号。
内容的提问来源于stack exchange,提问作者tfonias74
相关产品推荐
相关产品推荐

