无需修改hosts文件,如何通过URL访问Docker容器内多站点?
解决方案
方案1:用本地DNS自动解析.docker后缀域名
在Windows上部署轻量DNS服务器,让所有.docker结尾的域名自动指向127.0.0.1,新增站点时只需配置Apache虚拟主机,无需修改hosts:
- 推荐工具:Acrylic DNS Proxy(Windows平台专用,配置简单)
- 下载安装Acrylic后,打开配置文件
AcrylicHosts.txt - 添加一行:
127.0.0.1 *.docker - 重启Acrylic服务,将Windows网络适配器的IPv4 DNS服务器设置为
127.0.0.1
- 下载安装Acrylic后,打开配置文件
- 或用dnsmasq(通过WSL2运行,适合熟悉Linux的用户):
- 在WSL2中安装dnsmasq,添加配置
address=/docker/127.0.0.1 - 将Windows的DNS指向WSL2的IP(可通过
wsl hostname -I获取)
- 在WSL2中安装dnsmasq,添加配置
方案2:用Traefik反向代理(结合Docker Compose)
Traefik能自动发现Docker容器的路由规则,无需手动修改hosts或重复配置Apache虚拟主机:
- 编写
docker-compose.yml,配置Traefik作为流量入口:
version: '3.8' services: traefik: image: traefik:v2.10 command: - "--api.insecure=true" # 开发环境开启控制台,生产环境请关闭 - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--entrypoints.web.address=:80" ports: - "80:80" - "8080:8080" # Traefik控制台端口 volumes: - "/var/run/docker.sock:/var/run/docker.sock" # 让Traefik访问Docker API apache-php: image: your-apache-php-image # 替换为你的Apache-PHP镜像 labels: - "traefik.enable=true" - "traefik.http.routers.site1.rule=Host(`site1.docker`)" - "traefik.http.routers.site1.entrypoints=web" - "traefik.http.routers.site2.rule=Host(`site2.docker`)" - "traefik.http.routers.site2.entrypoints=web" volumes: - ./site1:/var/www/site1 # 挂载站点目录 - ./site2:/var/www/site2 - ./apache-config:/etc/apache2/sites-available # 挂载自定义Apache配置(可选)
- 启动服务:
docker-compose up -d - 新增站点时,只需在
apache-php服务的labels中添加对应路由规则即可,配合方案1的DNS解析实现自动访问。
方案3:自动化管理hosts文件(次优)
如果不想用DNS或反向代理,可通过脚本自动更新hosts:
- 编写PowerShell脚本,检测并追加新增域名到hosts文件:
$hostsPath = "C:\Windows\System32\drivers\etc\hosts" $newDomains = @("site3.docker", "site4.docker") # 替换为新增的域名 $content = Get-Content $hostsPath -Raw foreach ($domain in $newDomains) { if ($content -notmatch "127\.0\.0\.1.*$domain") { Add-Content $hostsPath "`n127.0.0.1 $domain" } }
- 需以管理员身份运行脚本,避免权限问题。
内容的提问来源于stack exchange,提问作者Pianoman
相关产品推荐
相关产品推荐

