65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2018年10月18日

CPOL

4分钟阅读

viewsIcon

12452

不要乱动 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日:初始版本
© . All rights reserved.