探索本地Docker桥接网络

本文讲的是探索本地Docker桥接网络,【编者的话】本文主要介绍了Docker的基础网络知识,作者通过容器与MongoDB实例的连接的小实验探索了Docker的网路知识以及其中的一些问题。

我正在写《Docker in Action》(译者注:此书的样章可以在这里查看)第五章,内容有关Docker的容器连接与网络配置。最近一直在关注Docker的其它几个部分,我也重新熟悉了容器连接并深入研究了网络。

本文不会赘述我们已经熟悉的网络桥接。但是我猜很多使用Docker的开发者仍然不熟悉这部分内容,接下来我将为你展示容器启动的时候如何创建网络。下面我将会做一个实验,从几个容器中操作MongoDB。

启动目标容器

在这个实验中我们的目标是MongoDB数据库。你可以安装并使用以下命令启动MongoDB容器。

docker run --name some-mongo -d mongo:latest

启动另一个容器

这个容器基于Ubuntu镜像构建,运行了一个Shell环境。你可以检查你的本地网络并从这个容器连接到Mongo实例。

docker run -it --rm ubuntu:latest /bin/bash
root@XXX:/#

在交互模式下启动镜像,这样就可以安装你所需要的工具或者做其它事情而不会扰乱你的主机系统的状态。

获取您的命令行工具

你需要的工具包括Mongo CLInmap(译者注:nmap是网络探测工具和安全/端口扫描器)。

root@XXX:/#apt-get -y install nmap
root@XXX:/#apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
root@XXX:/#echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
root@XXX:/#apt-get update
root@XXX:/#apt-get install -y mongodb-org-shell

既然你正在以root身份运行的容器,你不用担心标准的sudo命令前缀。一旦这些命令运行完成,你就可以准备开启实验。

扫描网络

找到你的容器的IP地址,这样你就可以猜出你的目标可能在哪。

root@XXX:/#MY_IP=`/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`

寻找在同一子网的监听端口为27017子网中的主机。执行此操作使用nmap进行子网的27017端口的扫描:

root@XXX:/#nmap -sS -p 27017 $MY_IP/24

在我的测试环境中的网络端口扫描的结果如下:

Starting Nmap 6.40 ( http://nmap.org ) at 2014-12-09 15:52 UTC
Nmap scan report for 172.17.0.33
Host is up (0.000030s latency).
PORT STATE SERVICE
27017/tcp closed unknown
MAC Address: 02:42:AC:11:00:21 (Unknown)
Nmap scan report for 172.17.0.34
Host is up (0.000021s latency).
PORT STATE SERVICE
27017/tcp closed unknown
MAC Address: 02:42:AC:11:00:22 (Unknown)
Nmap scan report for 172.17.0.96
Host is up (-0.079s latency).
PORT STATE SERVICE
27017/tcp open unknown
MAC Address: 02:42:AC:11:00:60 (Unknown)
Nmap scan report for 172.17.0.131
Host is up (-0.084s latency).
PORT STATE SERVICE
27017/tcp closed unknown
MAC Address: 02:42:AC:11:00:83 (Unknown)
Nmap scan report for XXX (172.17.0.132)
Host is up (0.000055s latency).
PORT STATE SERVICE
27017/tcp closed unknown
Nmap done: 256 IP addresses (5 hosts up) scanned in 4.10 seconds

从以上的输出中你可以看到,我的测试环境中运行的5个容器(包括一个正在运行命令的)。五个其中之一的端口27017是开放的。开放此端口的IP地址是运行你的MongoDB实例容器的IP地址。这是有趣的并且某些情况下可能会是一个惊喜,一会儿我就来聊聊这些。首先,让我们先做完实验。

访问数据库

使用先前安装的mongo CLI,你应该能够访问在其它容器中运行的MongoDB实例。在你得意忘形之前,你要知道这并不是Docker的或者Linux内核的漏洞,服务的端口是开放的,所以你肯定能正常访问。

当你配合IP地址运行以下命令,你可以看到输出:

root@XXX:/#mongo --host 172.17.0.96 # replace the IP address
MongoDB shell version: 2.6.6
connecting to: 172.17.0.96:27017/test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
>_

就是这样。你可以在不同的容器内连接到MongoDB实例。获取对数据库的访问就是这么容易。惊讶吧?不应该。你正在运行一个没有身份验证要求的MongoDB实例。不要以为防火墙或网络拓扑会保护你的安全性差的服务。

Docker抽象化以及他们如何通信

此前在Docker的历险中,不知道为什么,我印象里网络是围绕着容器而构建。确实是这样。它们有分离接口的防火墙。不过我最初没有想到这些,即使是路由没有具体的链接。我认为,这是被Docker容器的链接增强了。

与其他人一样,当我学习如何访问其它容器的时候,首先使用的就是容器的连接。当你想连接另外一个已经存在的容器时,你可以在容器启动时通过参数指定(译者注:--link参数)。当你使用连接时,Docker会将IP和端口信息相关的环境变量放到新创建的容器。此外,其它的容器IP地址将会添加到/etc/hosts文件并对应容器的名称。(译者注:使用连接容器不需要公开端口,父容器可以直接访问子容器的公开端口,容器的端口不需要对宿主机公开,同时在容器中,会看到自动创建的一些环境变量,运行env命令试试。)

当我学习连接时,我停止了寻找其它的工具......至少一段时间。连接相当的方便,但他们只是提供了方便。他们告知你的新容器其他一些特定的容器的IP和端口信息。就是这样。桥接网络也没有什么花哨。

你可以访问其它容器的外部接口,就像他们是一个网络上的其它计算机。这应该是一件好事。我们知道该怎么做。

PS:别忘了停止并删除本实验中创建的容器。

docker kill some-mongo
docker rm -v some-mongo

原文链接:Exploring Local Docker Bridge Networks (翻译:田浩浩 审校:李颖杰)

===========================
译者介绍
田浩浩,悉尼大学USYD硕士研究生,目前在珠海从事Android应用开发工作。业余时间专注Docker的学习与研究,希望通过DockerOne把最新最优秀的译文贡献给大家,与读者一起畅游Docker的海洋。

原文发布时间为:2015-01-13

本文作者:田浩浩 

本文来自合作伙伴DockerOne,了解相关信息可以关注DockerOne。

原文标题:探索本地Docker桥接网络

时间: 2025-01-24 22:58:20

探索本地Docker桥接网络的相关文章

Centos7 下建立 Docker 桥接网络

centos7宿主机上建立Docker桥接物理网络过程 宿主机网卡信息: name:ens0 IP:192.168.184.99 GATEWAY:192.168.184.2 DNS:192.168.184.2 1. 停止Docker服务 ~#:service docker stop 2.删除docker0网卡 ~#:ip link set dev docker0 down ~#:brctl delbr docker0 3.新建桥接物理网络虚拟网卡br0 ~#:brctl addbr br0 ~#

更安全的本地Docker网络

本文讲的是更安全的本地Docker网络,[编者的话]本文主要是解决了上一篇探索本地Docker桥接网络提出的问题.我们可以在Docker启动时设置icc=false参数来禁止任意的跨容器通信. 上周我写了<探索本地Docker桥接网络>.在这篇文章中我介绍了如何使用nmap探索由同一桥接网络上的其它容器公开的服务,并展示了在这些服务没有映射到主机的公有接口的端口的情况下如何去访问这些服务.这是一个问题,因为大多数镜像的工具.数据库以及微服务都带有不安全的默认配置.较为变通的工程师或管理员可能会

理解Docker容器网络之Linux Network Namespace

更多深度文章,请关注:https://yq.aliyun.com/cloud 由于2016年年中调换工作的原因,对容器网络的研究中断过一段时间.随着当前项目对Kubernetes应用的深入,我感觉之前对于容器网络的粗浅理解已经不够了,容器网络成了摆在前面的"一道坎".继续深入理解K8s网络.容器网络已经势在必行.而这篇文章就算是一个重新开始,也是对之前浅表理解的一个补充. 我还是先从Docker容器网络入手,虽然Docker与Kubernetes采用了不同的网络模型:K8s是Conta

Linux系统云计算的KVM/QEMU桥接网络设置及kvm资料

  KVM/QEMU桥接网络设置 配置kvm的网络有2种方法.其一,默认方式为用户模式网络(Usermode Networking),数据包由NAT方式通过主机的接口进行传送.其二,使用桥接方式(Bridged Networking),外部的机器可以直接联通到虚拟机,就像联通到你的主机一样. 第一,用户模式 虚拟机可以使用网络服务,但局域网中其他机器包括宿主机无法连接它.比如,它可以浏览网页,但外部机器不能访问架设在它里面的web服务器. 默认的,虚拟机得到的ip空间为10.0.2.0/24,主

基础的 Docker 容器网络命令

各位好,今天我们将学习一些Docker容器的基础命令.Docker 是一个开源项目,提供了一个可以打包.装载和运行任何应用的轻量级容器的开放平台.它没有语言支持.框架和打包系统的限制,从小型的家用电脑到高端服务器,在何时何地都可以运行.它可以使部署和扩展web应用程序.数据库和后端服务像搭积木一样容易,而不依赖特定技术栈或提供商.Docker适用于网络环境,它正应用于数据中心.ISP和越来越多的网络服务. 因此,这里有一些你在管理Docker容器的时候会用到的一些命令. 1. 找到Docker接

Docker容器网络下UDP协议的一个问题

最近在工作中遇到一个 docker 容器下 UDP 协议网络不通的问题,困扰了很久,也比较有意思,所以想写下来和大家分享. 我们有个应用是 UDP 协议的,部署上去发现无法工作,但是换成 TCP 协议是可以的(应用同时支持 UDP.TCP 协议,切换成 TCP 模式发现一切正常).虽然换成 TCP 能解决问题,但是我们还是想知道到底 UDP 协议在网络模式下为什么会出现这个问题,以防止后面其他 UDP 应用会有异常. 这个问题抽象出来是这样的:如果有 UDP 服务运行在主机上(或者运行在网络模型

介绍配置KVM桥接网络的方法

下面介绍配置KVM桥接网络的方法: \\特别注意,大部分不能桥接http://www.aliyun.com/zixun/aggregation/32544.html">无线网卡...只能桥接PCI网卡.... 安装桥接工具: 代码: sudo apt-get install bridge-utils 安装创建TAP界面的工具: 代码: sudo apt-get install uml-utilities 网络界面配置文件 代码: sudo vi /etc/network/interface

经验-本地应用做网络爬图的显示方式

问题描述 本地应用做网络爬图的显示方式 目前在尝试做一个桌面爬图应用,方便浏览及搜集图站上的图片 第一次做,所以没啥经验... 我现在困惑的主要是浏览方式,主要想参考花瓣网的图片瀑布,但那种方式会加载大量的图片,倒不是担心内存不够,主要是感觉很浪费...毕竟图片的回顾我感觉保持在3-5页就够了,而花瓣网的方式感觉有可能加载百页...还是说,它有特殊的处理方法,只是我想多了? 还有内存管理方面...有的图片一张就20多M...没夸张... 所以想请有这方面经验的分享一下-- 怎样做才是比较好的方式

LFCS 系列第五讲:如何在 Linux 中挂载/卸载本地文件系统和网络文件系统(Samba 和 NF

LFCS 系列第五讲:如何在 Linux 中挂载/卸载本地文件系统和网络文件系统(Samba 和 NF Linux 基金会已经发起了一个全新的 LFCS(Linux 基金会认证系统管理员Linux Foundation Certified Sysadmin)认证,旨在让来自世界各地的人有机会参加到 LFCS 测试,获得关于有能力在 Linux 系统中执行中间系统管理任务的认证.该认证包括:维护正在运行的系统和服务的能力.全面监控和分析的能力以及何时向上游团队请求支持的决策能力. LFCS 系列第