如何在安全且复杂的网络中使用 Docker?





5.00/5 (2投票s)
不要乱动 Docker 网络,否则下面这篇关于 Docker 网络复杂性的文章将会有帮助!
概述
Docker 在开发中的应用
Docker 非常适合部署……但它的作用远不止于此。许多项目可以被容器化用于开发。这对于许多用例来说都是一个绝佳的解决方案(参见下面的示例)
- 您的项目必须运行在具有特定依赖项的环境中(例如 Node 6.0、JRE 1.8.0_171-b25 等)
- 您的项目需要多个可配置部分才能运行(例如 MongoDB & Node)
- 您希望您的项目通过一个简单的命令行
argument docker-compose up
来启动
但它无法实现!
如果您尝试过使用 Docker,很可能遇到过一些挑战。原因是您的工作空间存在相当大的网络复杂性,而不幸的是,目前这些复杂性并未从客户端设备中抽象出来。
虽然这种复杂性大部分是在您的设备分配给您之前配置好的,但它不会转移到容器化环境(如 Docker)中。这是一个根本性问题,阻止我们在不给每个镜像增加巨大复杂性的情况下使用 Docker。请记住,Docker 旨在简化开发,生成的镜像应该易于执行。
我该如何使用 Docker 来处理所有网络复杂性?
答案很简单,您不能——至少在与他人讨论这个问题后,这似乎是大家的共识。只要您的流量是通过公司网络传输的,就无法有效使用 Docker。网络必须既安全又透明(VPN 的工作方式就是这样)。
实验室里的许多人会选择在不连接 VPN 的情况下使用 Docker,这确实可行,但代价是无法访问存储库等必需资源。如果您按照下面的指南操作,应该能够兼顾两全其美。这并非理想方案,但直到我们的基础设施复杂性得到抽象化,我们只能在客户端处理这个问题。
教程
1. 设置准备
在我们开始之前,您需要在 VirtualBox 中运行一个 Linux 实例。为了本文档的方便,我将假设您已安装 VirtualBox 并安装了 Fedora/CentOS/RHEL7 机器。
2. 配置网络接口
- 如果您的虚拟机正在运行,请将其关闭
- 在 Virtualbox Manager 中右键单击您的虚拟机,然后导航到 `Settings -> Network`
- 启用 Adapter 1 并将其连接到 `NAT`
- 启用 Adapter 2 并将其连接到 `Bridged Adapter`
- 在 `Bridged Adapter` 下方,选择您用来连接互联网的网络接口
如上面的图示所示,这将为您的虚拟机配置两个网络接口。第一个接口(我们的 NAT)通过主机路由所有流量,因此也通过 VPN。第二个接口创建了一个桥接,直接连接到互联网。
3. 获取我们的网关地址
接下来,您需要获取两个接口的网关地址。默认情况下,我们的 NAT 网关地址是 10.0.2.2
,所以我们不必太担心。
要查找我们的桥接适配器的网关地址,您需要在终端中运行 ip route | grep default
。您应该会看到类似如下的内容
default via 10.0.2.2 dev enp0s3 proto dhcp metric 20100
default via 10.37.16.1 dev enp0s8 proto dhcp metric 20101
我们已经知道,NAT 的网关位于 10.0.2.2
,所以在这个例子中,桥接适配器的默认网关是 10.37.16.1
。
4. 配置路由
您需要将下面的脚本复制到一个名为 routing.sh
的文件中。此脚本将确保内部流量通过 NAT 路由,而外部流量通过网络桥接路由。
#!/bin/bash
NAT=10.0.2.2
BRIDGE=10.37.16.1 # Change to reflect your bridged adapter gateway
route add default gw $BRIDGE # * to ethernet bridge
ip route add 169.0.0.0/8 via $NAT # 168.* to NAT
ip route add 10.0.0.0/16 via $NAT # 10.* to NAT
ip route add 192.193.171.152 via $NAT # webproxy.wlb2.nam.nsroot.net (NPM) to NAT
之后,给脚本执行权限 chmod +x routing.sh
5. 配置 DNS
不幸的是,我还没有找到一个好的解决方案——任何建议都会非常有帮助!
目前,我选择使用 OpenDNS 作为默认名称服务器,并在 hosts 文件中指定了内部 DNS 条目(示例如下)。
127.0.0.1 localhost localhost.localdomain
192.193.215.65 anycast-65.nsroot.net
192.193.171.152 webproxy.wlb2.nam.nsroot.net
169.171.92.176 namicggtd01d-webapi.nam.nsroot.net
169.177.244.86 docker-icg-int-local.artifactrepository.pnajinnovations.com
docker-icg-dev-local.artifactrepository.pnajinnovations.com
docker-enterprise-prod-local.artifactrepository.pnajinnovations.com
169.177.217.177 cedt-icg-bitbucket.nam.nsroot.net
169.177.217.175 cedt-icg-bitbucketcli.nam.nsroot.net
168.72.217.161 www.artifactrepo-dev.nam.nsroot.net
169.177.217.86 cedt-icg-jira.nam.nsroot.net
您需要将任何额外的内部 DNS 条目添加到您的 /etc/hosts
文件中。
6. 运行路由脚本并进行测试
运行我们之前创建的路由脚本
./routing.sh
检查 WAN 访问(您应该会收到 301 响应)
curl -I http://amazon.com
7. 安装 Docker 和 Docker Compose
遵循 Docker 提供的文章
8. 最后,测试结果
如果一切顺利,您应该能够克隆并运行以下 存储库。
克隆存储库
git clone
https://cedt-icg-bitbucket.nam.nsroot.net/bitbucket/projects/TRADER-DESKTOP/repos/rfq-logging-api.git
导航到项目
cd rfq-logging-api
在 Docker 中启动
docker-compose up
如果一切按计划进行,您刚刚使用一个命令克隆了一个存储库并启动了项目。运行 docker ps
,您应该会看到两个正在运行的容器——MongoDB 和一个基于 Node.js 的 REST API 服务器(它们之间可以相互通信)。
结论
您完成了!希望您现在已经准备好利用 Docker 带来的巨大生产力、一致性和简单性提升。
如果您还没有这样做,我强烈建议您研究 Docker Compose 作为编排本地开发环境的工具!
免责声明
这绝非理想的解决方案,虽然我远非网络基础设施专家,但我认为最好的办法是重新审视如何为我们的开发人员提供最安全、最简单、最易于访问的网络环境。
历史
- 2018年10月18日:初始版本