探索本地Docker桥接网络

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 本文讲的是探索本地Docker桥接网络,【编者的话】本文主要介绍了Docker的基础网络知识,作者通过容器与MongoDB实例的连接的小实验探索了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 CLI nmap (译者注: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桥接网络
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
15天前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
2月前
|
Kubernetes Devops 持续交付
DevOps实践:使用Docker和Kubernetes实现持续集成和部署网络安全的守护盾:加密技术与安全意识的重要性
【8月更文挑战第27天】本文将引导读者理解并应用DevOps的核心理念,通过Docker和Kubernetes的实战案例,深入探讨如何在现代软件开发中实现自动化的持续集成和部署。文章不仅提供理论知识,还结合真实示例,旨在帮助开发者提升效率,优化工作流程。
|
2月前
|
应用服务中间件 nginx Docker
【与时俱进】网络工程师必备技能:Docker基础入门指南,助你轻松应对新时代挑战!
【8月更文挑战第22天】随着容器技术的发展,Docker已成为开发与运维的关键工具。本文简要介绍Docker——一种开源容器化平台,能让应用程序及依赖项被打包成轻量级容器,在任何Linux或Windows机器上运行。文中涵盖Docker的安装步骤、基础命令操作如启动服务、查看版本、拉取与运行容器等。并通过实例演示了如何运行Nginx服务器和基于Dockerfile构建Python Flask应用镜像的过程。这些基础知识将助力网络工程师理解Docker的核心功能,并为实际应用提供指导。
56 2
|
2月前
|
Ubuntu Shell 网络架构
网络工程师的秘密武器:为何他们必须掌握Docker的基础知识?
【8月更文挑战第20天】在IT领域,Docker作为主流容器化平台,简化了应用部署与管理。网络工程师虽不必精通Docker,但需了解其基本概念如镜像、容器等,及如何创建、运行容器,还需掌握Docker网络模式如bridge、overlay等。这有助于与开发团队协作,设计高效网络架构。例如,通过`docker pull ubuntu`和`docker run -it ubuntu /bin/bash`即可拉取并启动Ubuntu容器。了解这些基础知识能促进跨团队沟通,适应快速发展的IT行业需求。
29 0
|
1月前
|
Shell Linux Docker
自定义Docker网络
这篇文章介绍了如何使用Docker命令自定义网络,并通过创建和配置网络来实现容器间的通信。
30 6
自定义Docker网络
|
1月前
|
KVM 虚拟化
KVM虚拟机的桥接网络
文章主要介绍了KVM虚拟机的NAT和桥接网络类型的工作原理、配置方法以及如何进行网络模式的切换。
23 3
KVM虚拟机的桥接网络
|
1月前
|
NoSQL 应用服务中间件 Redis
Docker跨宿主机容器通信-通过网络跨宿主机互联
这篇文章介绍了Docker容器跨宿主机通信的实现方法,包括Docker的四种网络模式(host、none、container、bridge)以及如何通过修改网络配置和添加路由规则来实现不同宿主机上的容器之间的互联。
88 0
Docker跨宿主机容器通信-通过网络跨宿主机互联
|
25天前
|
Kubernetes 安全 Docker
|
4天前
|
网络协议 安全 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基础知识,包括网络驱动、端口映射和命名等核心概念,并深入探讨了 Bridge、Host、Overlay 和 Macvlan 四种网络类型的特点及应用场景。此外,还提供了创建、连接、查看和删除自定义网络的命令示例,以及高级网络配置方法,如网络命名空间、DNS 解析和安全通信配置,帮助开发者构建更健壮的容器化应用。
|
2月前
|
Kubernetes 网络安全 网络架构
Docker不同宿主机网络打通
【8月更文挑战第20天】在不同宿主机上打通Docker网络可通过多种方法:1) 使用Docker原生的Overlay或Macvlan网络驱动实现跨主机通信,如Overlay网络利用VXLAN技术连接多台宿主机,Macvlan则让容器直接接入物理网络;2) 利用第三方工具如Weave Net或Flannel构建虚拟网络,Weave Net简化网络配置,Flannel则适用于Kubernetes环境并通过UDP封装数据包实现通信。实施前需确保宿主机间网络畅通且防火墙设置适当。
下一篇
无影云桌面