docker - 如何为 2 个单独的 VM 创建 2 个 docker-compose 文件?
问题描述
我有一个需要与服务器 B 通信的服务器 A。服务器 A 和服务器 B 将部署在 2 台不同的机器上。
serverA 的 docker-compose.yml,用于运行映像并创建网络。docker-compose.yml 供 serverB 运行镜像并加入网络。
我遇到的问题是我的服务器 A 中的 nginx 提示错误,这阻止了我在不同的 VM 中测试网络的创建。
nginx:在 /etc/nginx/conf.d/nginx.conf 的上游“ServerB”中找不到 [emerg] 主机
version: "3.9"
services:
ServerA:
image: servera
ports:
- "3443:443"
networks:
- myNet
networks:
myNet:
name: custom_network
ipam:
driver: default
config:
- subnet: 172.18.0.0/24
version: "3.9"
services:
ServerB:
image: serverb
ports:
- "4443:443"
networks:
- my-proxy-net
networks:
my-proxy-net:
external:
name: custom_network
server{
listen 80;
listen 443 ssl;
ssl_certificate /etc/ssl/public.crt;
ssl_certificate_key /etc/ssl/privatekey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri $uri/ /index.html;
}
location /TestPath {
proxy_pass https://ServerB/TestPath/;
}
}
我如何进行更改,以使服务器 A 在启动时能够连接到服务器 B。
解决方案
Docker“桥”网络在创建它们的主机上是本地的。如果两个容器不在同一主机(或同一虚拟机)上,则它们不能共享网络或以这种方式通信。您可能能够独立于 Docker 的 Swarm 容器编排器配置覆盖网络,但这是一个复杂的设置。
更简单的方法是确保每个容器都发布ports:
到其主机 (VM),然后使用其他主机 (VM) 的 IP 地址作为连接的目标。
# docker-compose.a.yaml, on 10.0.10.10
version: 3.8
services:
ServerA:
image: servera
ports:
- "3443:443"
environment:
- SERVER_B_URL=https://10.0.10.20:4443/TestPath/
# use the Compose-provided default: network with default settings
# docker-compose.b.yaml, on 10.0.10.20
version: 3.8
services:
ServerB:
image: serverb
ports:
- "4443:443"
您将无法在 TLS 证书中获取有效名称,如果您有此要求,您可能会发现运行每主机 HTTPS 反向代理很有用。
在中等规模,像 Consul 这样的服务发现系统可以帮助您记住哪些服务放置在哪个节点上。在更大范围内,像 Kubernetes 这样的专用容器集群系统将帮助您部署和复制这些容器,而无需手动放置它们。
推荐阅读
- scala - Spark scala在数据框中加入数据框
- javascript - 覆盖 UTM 参数
- jms - Mule 4在最大等待时间后发布消费组件响应jms body null
- r - 阅读所有excel文件表并执行for循环
- ios - React Native iOS Release 构建停留在旧代码上,但 Debug 构建工作正常
- python - 使用另一个数据框在数据框中创建子列
- java - 共享库位于 AOSP 的什么位置?
- javascript - Redux 中的订阅 Redux 中订阅的奇怪行为
- arrays - 在 Swift 中将 NSArray 转换为数组会产生 nil 到数组值
- postgresql - 气流 initdb slot_pool 不存在