多Docker应用互联问题:独立站点与SSO服务通信配置需求
解决多Docker容器栈间SSO互通问题(无需手动配置host)
我太懂你现在的麻烦了:多个独立站点容器栈和SSO栈之间没法直接互通,每次都得手动改host映射IP,不仅麻烦,容器重启后IP一变又得重新改,完全不省心。其实用Docker的自定义网络+内置DNS就能完美解决这个问题,步骤超清晰:
1. 创建全局共享Docker网络
首先我们需要一个所有容器栈都能加入的共享网络,Docker会自动为这个网络提供DNS解析服务,让容器之间能通过服务名直接互相访问,再也不用记IP:
docker network create sso_shared_network
2. 修改SSO栈的docker-compose.yml
把SSO的所有核心服务(Nginx、PHP、MySQL)都加入这个共享网络,还可以给Nginx服务加个专属别名,方便站点调用时更直观:
version: "3" services: nginx: image: nginx:1.10.3 ports: - "8080:80" - "8443:443" volumes: - ./projects:/var/www - ./.docker/nginx/sites-enabled/site.conf:/etc/nginx/conf.d/site.conf # 你的其他卷配置... networks: - default - sso_shared_network # 给SSO的Nginx加个好记的别名,避免和其他站点的Nginx重名 networks: sso_shared_network: aliases: - sso-server php: image: php:7.4-fpm # 换成你实际使用的PHP版本 volumes: - ./projects:/var/www # 你的其他卷配置... networks: - default - sso_shared_network mysql: image: mysql:5.7 # 换成你实际使用的MySQL版本 environment: MYSQL_ROOT_PASSWORD: your_root_password # 替换成你的数据库密码 networks: - default - sso_shared_network networks: sso_shared_network: external: true # 声明这个网络是我们之前手动创建的外部网络
3. 修改每个站点(site1-site4)的docker-compose.yml
同样把每个站点的Nginx和PHP服务加入共享网络,这样它们就能直接通过SSO的别名发起请求了:
version: "3" services: nginx: image: nginx:1.10.3 ports: - "8081:80" # site1用8081端口,其他站点换成不同端口即可 volumes: - ./projects:/var/www - ./.docker/nginx/sites-enabled/site1.conf:/etc/nginx/conf.d/site.conf networks: - default - sso_shared_network php: image: php:7.4-fpm volumes: - ./projects:/var/www networks: - default - sso_shared_network # 重点!现在你的PHP代码里的curl调用可以直接用别名了,不用写死IP # 比如原来的 curl('http://192.168.x.x:8080/sso/login') # 改成 curl('http://sso-server:80/sso/login') 就搞定了! networks: sso_shared_network: external: true
为什么这招管用?
Docker的自定义网络自带DNS解析服务,同一个网络里的容器可以通过服务名或者别名直接解析到对应的容器IP,完全不用手动维护host文件。就算容器重启IP变了,DNS也会自动更新,稳定性拉满。
额外注意事项
- 确保所有栈的服务名在共享网络里不会冲突,给SSO加别名就是为了避免这个问题
- 容器内部调用时用容器的内部端口(比如80,不是宿主机映射的8080)
- 改完配置后重启所有容器栈让设置生效:
docker-compose down && docker-compose up -d
内容的提问来源于stack exchange,提问作者anthropos9
相关产品推荐
相关产品推荐

