标签 网络 下的文章

bmon 是类 Unix 系统中一个基于文本,简单但非常强大的 网络监视和调试工具,它能抓取网络相关统计信息并把它们以用户友好的格式展现出来。它是一个可靠高效的带宽监视和网速估测工具。

它能使用各种输入模块读取输入,并以各种输出模式显示输出,包括交互式文本用户界面和用于脚本编写的可编程文本输出。

推荐阅读: 一大波你可能不知道的 Linux 网络工具

在 Linux 上安装 bmon 带宽监视工具

几乎所有 Linux 发行版的默认仓库中都有 bmon 软件包,可以从默认包管理器中轻松安装,但可用的版本可能比较旧。

$ sudo yum install bmon      [On RHEL/CentOS/Fedora]
$ sudo dnf install bmon      [On Fedora 22+]
$ sudo apt-get install bmon  [On Debian/Ubuntu/Mint]

另外,你也可以从 https://pkgs.org/download/bmon 获取对应你 Linux 发行版的 .rpm.deb 软件包。

如果你想要最新版本(例如版本 4.0)的 bmon,你需要通过下面的命令从源码构建。

在 CentOS、RHEL 和 Fedora 中

$ git clone https://github.com/tgraf/bmon.git
$ cd bmon
$ sudo yum install make libconfuse-devel libnl3-devel libnl-route3-devel ncurses-devel
$ sudo ./autogen.sh
$ sudo./configure
$ sudo make
$ sudo make install

在 Debian、Ubuntu 和 Linux Mint 中

$ git clone https://github.com/tgraf/bmon.git
$ cd bmon
$ sudo apt-get install build-essential make libconfuse-dev libnl-3-dev libnl-route-3-dev libncurses-dev pkg-config dh-autoreconf
$ sudo ./autogen.sh
$ sudo ./configure
$ sudo make
$ sudo make install

如何在 Linux 中使用 bmon 带宽监视工具

通过以下命令运行它(初学者说明:RX 表示每秒接收数据,TX 表示每秒发送数据):

$ bmon

bmon - Linux 带宽监视

d 键可以查看更详细的带宽使用情况的图形化统计信息,参考下面的截图。

bmon - Detailed Bandwidth Statistics

Shift + ? 可以查看快速指南。再次按 Shift + ? 可以退出(指南)界面。

bmon - 快速指南

bmon – 快速指南

通过 UpDown 箭头键可以查看特定网卡的统计信息。但是,要监视一个特定的网卡,你也可以像下面这样作为命令行参数指定。

推荐阅读: 监控 Linux 性能的 13 个工具

选项 -p 指定了要显示的网卡,在下面的例子中,我们会监视网卡 enp1s0

$ bmon -p enp1s0

bmon - 监控以太网带宽

bmon – 监控以太网带宽

要查看每秒位数而不是每秒字节数,可以像下面这样使用 -b 选项:

$ bmon -bp enp1s0

我们也可以像下面这样按秒指定刷新间隔时间:

$ bmon -r 5 -p enp1s0

如何使用 bmon 的输入模块

bmon 有很多能提供网卡统计数据的输入模块,其中包括:

  1. netlink - 使用 Netlink 协议从内核中收集网卡和流量控制统计信息。这是默认的输入模块。
  2. proc - 从 /proc/net/dev 文件读取网卡统计信息。它被认为是传统界面,且提供了向后兼容性。它是 Netlink 接口不可用时的备用模块。
  3. dummy - 这是用于调试和测试的可编程输入模块。
  4. null - 停用数据收集。

要查看关于某个模块的其余信息,可以像下面这样使用 help 选项调用它:

$ bmon -i netlink:help

下面的命令将启用 proc 输入模块运行 bmon:

$ bmon -i proc -p enp1s0

如何使用 bmon 输出模块

bmon 也使用输出模块显示或者导出上面输入模块收集的统计数据,输出模块包括:

  1. curses - 这是一个交互式的文本用户界面,它提供实时的网上估计以及每个属性的图形化表示。这是默认的输出模块。
  2. ascii - 这是用于用户查看的简单可编程文本输出。它能显示网卡列表、详细计数以及图形到控制台。当 curses 库不可用时这是默认的备选输出模块。
  3. format - 这是完全脚本化的输出模式,供其它程序使用 - 意味着我们可以在后面的脚本和程序中使用它的输出值进行分析。
  4. null - 停用输出。

像下面这样通过 help 选项获取更多的模块信息。

$ bmon -o curses:help

下面的命令会用 ascii 输出模式运行 bmon:

$ bmon -p enp1s0 -o ascii  

bmon - Ascii 输出模式

bmon – Ascii 输出模式

我们也可以用 format 输出模式,然后在脚本或者其它程序中使用获取的值:

$ bmon -p enp1s0 -o format

bmon - Format 输出模式

bmon – Format 输出模式

想要其它的使用信息、选项和事例,可以阅读 bmon 的 man 手册:

$ man bmon 

访问 bmon 的 Github 仓库:https://github.com/tgraf/bmon

就是这些,在不同场景下尝试 bmon 的多个功能吧,别忘了在下面的评论部分和我们分享你的想法。


作者简介:

Aaron Kili 是一个 Linux 和 F.O.S.S 爱好者、Linux 系统管理员、网络开发人员,现在也是 TecMint 的内容创作者,他喜欢和电脑一起工作,坚信共享知识。


via: http://www.tecmint.com/bmon-network-bandwidth-monitoring-debugging-linux/

作者:Aaron Kili 译者:ictlyh 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

有如此之多的各种新的云计算技术、工具和技术需要我们跟进,到底从哪里开始学习是一个艰难的决定。这一系列下一代云计算技术的文章旨在让你快速了解新兴和快速变化领域的重大项目和产品,比如软件定义网络(SDN)、容器,以及其交叉领域:容器网络。

对于企业容器部署,容器和网络之间的关系仍然是一个挑战。容器需要网络功能来连接分布式应用程序。根据一篇最新的企业网络星球的文章,一部分的挑战是“以隔离的方式部署容器,在提供隔离自己容器内数据的所需功能的同时,保持有效的连接性”。

流行的容器平台 Docker,使用了软件定义虚拟网络来连接容器与本地网络。此外,它使用 Linux 的桥接功能和虚拟可扩展局域网(VXLAN)技术,可以在同一 Swarm 或容器集群内互相沟通。Docker 的插件架构也支持其他网络管理工具来管理容器网络,比如下面的提到的工具。

容器网络上的创新使得容器可以跨主机连接到其他容器上。这使开发人员可以在开发环境中,在一个主机上部署一个容器来运行一个应用,然后可以过渡到测试环境中,进而到生产环境中,使应用可以持续集成,敏捷开发,快速部署。

容器网络工具有助于实现容器网络的可扩展性,主要是通过:

  1. 使复杂的,多主机系统能够跨多个容器主机进行分发。
  2. 允许构建跨越多个公有云和私有云平台上的大量主机的容器系统。

John Willis speaking 在 Open Networking Summit 2016.

要获取更多信息,查看 Docker 网络教程,是由 Brent Salisbury 和 John Willis 在最近的 Open Networking Summit (ONS)讲演的。更多关于 ONS 的演讲内容可以在这里找到。

你应该知道的容器网络工具和项目包括下述:

  • Calico -- Calico 项目(源自 Metaswitch)利用边界网关协议(BGP)和集成的云编排系统来保证虚拟机和容器之间的 IP 通信安全。
  • Flannel -- Flannel (之前叫 rudder) 源自 CoreOS,它提供了一个覆盖网络,可以作为一个现有的 SDN 解决方案的替代品。
  • Weaveworks -- Weaveworks 项目管理容器的工具包括 Weave Net、Weave Scope、Weave Flux。Weave Net 是一种用于构建和部署 Docker 容器的网络工具。
  • Canal -- 就在本周,CoreOS 和 Tigera 宣布了新的开源项目 Canal 的信息。据其声明,Canal 项目旨在结合部分 Calico 和 Flannel,“构造网络安全策略到网络架构和云管理平台之中”。

你可以通过 Linux 基金会的免费“云基础设施技术”课程来了解更多关于容器管理、软件定义网络和其他下一代云技术,这是一个在 edX 上提供的大规模公开在线课程。课程注册目前已经开放,课程内容于 6 月开放。


via: https://www.linux.com/news/4-container-networking-tools-know

作者:AMBER ANKERHOLZ 译者:Bestony 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

摘要:有抱负的 Linux 系统管理员和 Linux 狂热者必须知道的、最重要的、而且基础的 Linux 网络命令合集。

在 It’s FOSS 我们并非每天都谈论 Linux 的“命令行方面”。基本上,我更专注于 Linux 的桌面端。但你们读者中的一些人在内部调查(仅面向 It's FOSS newsletter 订阅者)中指出,你们也想学些命令行技巧。速查表也受大部分读者所喜欢和支持。

为此,我编辑了一个 Linux 中基础网络命令的列表。它并不是一个教你如何使用这些命令的教程,而是一个命令合集和他们的简短解释。所以,如果你已经使用过这些命令,你可以用它来快速记住命令。

你可以把这个网页添加为书签以便快速查阅,或输出一个 PDF 版本以便离线使用。

当我还是通信系统工程专业的学生的时候我就有这个 Linux 网络命令的列表了。它帮助我在计算机网络课程获得了高分。希望它也能以同样的方式帮助你。

Linux 基础网络命令列表

我在计算机网络课程上使用 FreeBSD,不过这些 UNIX 命令应该也能在 Linux 上同样工作。

连通性

  • ping <host>:发送 ICMP echo 消息(一个包)到主机。这可能会不停地发送直到你按下 Control-C。Ping 的通意味着一个包从你的机器通过 ICMP 发送出去,并在 IP 层回显。Ping 告诉你另一个主机是否在运行。
  • telnet <host> [port]:与主机在指定的端口通信。默认的 telnet 端口是 23。按 Control-] 以退出 telnet。其它一些常用的端口是:

    • 7 —— echo 端口
    • 25 —— SMTP,用于发送邮件
    • 79 —— Finger (LCTT 译注:维基百科 - Finger protocal,不过举例 Finger 恐怕不合时宜,倒不如试试 80?),提供该网络下其它用户的信息。

ARP

ARP 用于将 IP 地址转换为以太网地址。root 用户可以添加和删除 ARP 记录。当 ARP 记录被污染或者错误时,删除它们会有用。root 显式添加的 ARP 记录是永久的 —— 代理设置的也是。ARP 表保存在内核中,动态地被操作。ARP 记录会被缓存,通常在 20 分钟后失效并被删除。

  • arp -a:打印 ARP 表。
  • arp -s <ip_address> <mac_address> [pub]:添加一条记录到表中。
  • arp -a -d:删除 ARP 表中的所有记录。

路由

  • netstat -r:打印路由表。路由表保存在内核中,用于 IP 层把包路由到非本地网络。
  • route add:route 命令用于向路由表添加静态(手动指定而非动态)路由路径。所有从该 PC 到那个 IP/子网的流量都会经由指定的网关 IP。它也可以用来设置一个默认路由。例如,在 IP/子网处使用 0.0.0.0,就可以发送所有包到特定的网关。
  • routed:控制动态路由的 BSD 守护程序。开机时启动。它运行 RIP 路由协议。只有 root 用户可用。没有 root 权限你不能运行它。
  • gated:gated 是另一个使用 RIP 协议的路由守护进程。它同时支持 OSPF、EGP 和 RIP 协议。只有 root 用户可用。
  • traceroute:用于跟踪 IP 包的路由。它每次发送包时都把跳数加 1,从而使得从源地址到目的地之间的所有网关都会返回消息。
  • netstat -rnf inet:显示 IPv4 的路由表。
  • sysctl net.inet.ip.forwarding=1:启用包转发(把主机变为路由器)。
  • route add|delete [-net|-host] <destination> <gateway>:(如 route add 192.168.20.0/24 192.168.30.4)添加一条路由。
  • route flush:删除所有路由。
  • route add -net 0.0.0.0 192.168.10.2:添加一条默认路由。
  • routed -Pripv2 -Pno_rdisc -d [-s|-q]:运行 routed 守护进程,使用 RIPv2 协议,不启用 ICMP 自动发现,在前台运行,供给模式或安静模式。
  • route add 224.0.0.0/4 127.0.0.1:为本地地址定义多播路由。(LCTT 译注:原文存疑)
  • rtquery -n <host>(LCTT 译注:增加了 host 参数):查询指定主机上的 RIP 守护进程(手动更新路由表)。

其它

  • nslookup:向 DNS 服务器查询,将 IP 转为名称,或反之。例如,nslookup facebook.com 会给出 facebook.com 的 IP。
  • ftp <host> [port](LCTT 译注:原文中 water 应是笔误):传输文件到指定主机。通常可以使用 登录名 "anonymous" , 密码 "guest" 来登录。
  • rlogin -l <host>(LCTT 译注:添加了 host 参数):使用类似 telnet 的虚拟终端登录到主机。

重要文件

  • /etc/hosts:域名到 IP 地址的映射。
  • /etc/networks:网络名称到 IP 地址的映射。
  • /etc/protocols:协议名称到协议编号的映射。
  • /etc/services:TCP/UDP 服务名称到端口号的映射。

工具和网络性能分析

  • ifconfig <interface> <address> [up]:启动接口。
  • ifconfig <interface> [down|delete]:停止接口。
  • ethereal &:在后台打开 ethereal 而非前台。
  • tcpdump -i -vvv:抓取和分析包的工具。
  • netstat -w [seconds] -I [interface]:显示网络设置和统计信息。
  • udpmt -p [port] -s [bytes] target_host:发送 UDP 流量。
  • udptarget -p [port]:接收 UDP 流量。
  • tcpmt -p [port] -s [bytes] target_host:发送 TCP 流量。
  • tcptarget -p [port]:接收 TCP 流量。

交换机

  • ifconfig sl0 srcIP dstIP:配置一个串行接口(在此前先执行 slattach -l /dev/ttyd0,此后执行 sysctl net.inet.ip.forwarding=1
  • telnet 192.168.0.254:从子网中的一台主机访问交换机。
  • sh rushow running-configuration:查看当前配置。
  • configure terminal:进入配置模式。
  • exit:退出当前模式。(LCTT 译注:原文存疑)

VLAN

  • vlan n:创建一个 ID 为 n 的 VLAN。
  • no vlan N:删除 ID 为 n 的 VLAN。
  • untagged Y:添加端口 Y 到 VLAN n。
  • ifconfig vlan0 create:创建 vlan0 接口。
  • ifconfig vlan0 vlan_ID vlandev em0:把 em0 加入到 vlan0 接口(LCTT 译注:原文存疑),并设置标记为 ID。
  • ifconfig vlan0 [up]:启用虚拟接口。
  • tagged Y:为当前 VLAN 的端口 Y 添加标记帧支持。

UDP/TCP

  • socklab udp:使用 UDP 协议运行 socklab
  • sock:创建一个 UDP 套接字,等效于输入 sock udpbind
  • sendto <Socket ID> <hostname> <port #>:发送数据包。
  • recvfrom <Socket ID> <byte #>:从套接字接收数据。
  • socklab tcp:使用 TCP 协议运行 socklab
  • passive:创建一个被动模式的套接字,等效于 socklabsock tcpbindlisten
  • accept:接受进来的连接(可以在发起进来的连接之前或之后执行)。
  • connect <hostname> <port #>:等效于 socklabsock tcpbindconnect
  • close:关闭连接。
  • read <byte #>:从套接字中读取 n 字节。
  • write:(例如,write ciaowrite #10)向套接字写入 "ciao" 或 10 个字节。

NAT/防火墙

  • rm /etc/resolv.conf:禁止地址解析,保证你的过滤和防火墙规则正确工作。
  • ipnat -f file_name:将过滤规则写入文件。
  • ipnat -l:显示活动的规则列表。
  • ipnat -C -F:重新初始化规则表。
  • map em0 192.168.1.0/24 -> 195.221.227.57/32 em0:将 IP 地址映射到接口。
  • map em0 192.168.1.0/24 -> 195.221.227.57/32 portmap tcp/udp 20000:50000:带端口号的映射。
  • ipf -f file_name:将过滤规则写入文件。
  • ipf -F -a:重置规则表。
  • ipfstat -I:当与 -s 选项合用时列出活动的状态条目(LCTT 译注:原文存疑)。

希望这份基础的 Linux 网络命令合集对你有用。欢迎各种问题和建议。


via: https://itsfoss.com/basic-linux-networking-commands

作者:Abhishek Prakash 译者:bianjp 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在 Linux 世界里,对 systemd 的采用一直是激烈争论的主题,它的支持者和反对者之间的战火仍然在燃烧。到了今天,大部分主流 Linux 发行版都已经采用了 systemd 作为默认的 初始化 init 系统。

正如其作者所说,作为一个 “从未完成、从未完善、但一直追随技术进步” 的系统,systemd 已经不只是一个初始化进程,它被设计为一个更广泛的系统以及服务管理平台,这个平台是一个包含了不断增长的核心系统进程、库和工具的生态系统。

systemd 的其中一部分是 systemd-networkd,它负责 systemd 生态中的网络配置。使用 systemd-networkd,你可以为网络设备配置基础的 DHCP/静态 IP 网络。它还可以配置虚拟网络功能,例如网桥、隧道和 VLAN。systemd-networkd 目前还不能直接支持无线网络,但你可以使用 wpa\_supplicant 服务配置无线适配器,然后把它和 systemd-networkd 联系起来。

在很多 Linux 发行版中,NetworkManager 仍然作为默认的网络配置管理器。和 NetworkManager 相比,systemd-networkd 仍处于积极的开发状态,还缺少一些功能。例如,它还不能像 NetworkManager 那样能让你的计算机在任何时候通过多种接口保持连接。它还没有为更高层面的脚本编程提供 ifup/ifdown 钩子函数。但是,systemd-networkd 和其它 systemd 组件(例如用于域名解析的 resolved、NTP 的timesyncd,用于命名的 udevd)结合的非常好。随着时间增长,systemd-networkd只会在 systemd 环境中扮演越来越重要的角色。

如果你对 systemd-networkd 的进步感到高兴,从 NetworkManager 切换到 systemd-networkd 是值得你考虑的一件事。如果你强烈反对 systemd,对 NetworkManager 或基础网络服务感到很满意,那也很好。

但对于那些想尝试 systemd-networkd 的人,可以继续看下去,在这篇指南中学会在 Linux 中怎么从 NetworkManager 切换到 systemd-networkd。

需求

systemd 210 及其更高版本提供了 systemd-networkd。因此诸如 Debian 8 "Jessie" (systemd 215)、 Fedora 21 (systemd 217)、 Ubuntu 15.04 (systemd 219) 或更高版本的 Linux 发行版和 systemd-networkd 兼容。

对于其它发行版,在开始下一步之前先检查一下你的 systemd 版本。

$ systemctl --version

从 NetworkManager 切换到 Systemd-networkd

从 NetworkManager 切换到 systemd-networkd 其实非常简答(反过来也一样)。

首先,按照下面这样先停用 NetworkManager 服务,然后启用 systemd-networkd。

$ sudo systemctl disable NetworkManager
$ sudo systemctl enable systemd-networkd

你还要启用 systemd-resolved 服务,systemd-networkd用它来进行域名解析。该服务还实现了一个缓存式 DNS 服务器。

$ sudo systemctl enable systemd-resolved
$ sudo systemctl start systemd-resolved

当启动后,systemd-resolved 就会在 /run/systemd 目录下某个地方创建它自己的 resolv.conf。但是,把 DNS 解析信息存放在 /etc/resolv.conf 是更普遍的做法,很多应用程序也会依赖于 /etc/resolv.conf。因此为了兼容性,按照下面的方式创建一个到 /etc/resolv.conf 的符号链接。

$ sudo rm /etc/resolv.conf
$ sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

用 systemd-networkd 配置网络连接

要用 systemd-networkd 配置网络服务,你必须指定带.network 扩展名的配置信息文本文件。这些网络配置文件保存到 /etc/systemd/network 并从这里加载。当有多个文件时,systemd-networkd 会按照字母顺序一个个加载并处理。

首先创建 /etc/systemd/network 目录。

$ sudo mkdir /etc/systemd/network

DHCP 网络

首先来配置 DHCP 网络。对于此,先要创建下面的配置文件。文件名可以任意,但记住文件是按照字母顺序处理的。

$ sudo vi /etc/systemd/network/20-dhcp.network

[Match]
Name=enp3*

[Network]
DHCP=yes

正如你上面看到的,每个网络配置文件包括了一个或多个 “sections”,每个 “section”都用 [XXX] 开头。每个 section 包括了一个或多个键值对。[Match] 部分决定这个配置文件配置哪个(些)网络设备。例如,这个文件匹配所有名称以 ens3 开头的网络设备(例如 enp3s0、 enp3s1、 enp3s2 等等)对于匹配的接口,然后启用 [Network] 部分指定的 DHCP 网络配置。

静态 IP 网络

如果你想给网络设备分配一个静态 IP 地址,那就新建下面的配置文件。

$ sudo vi /etc/systemd/network/10-static-enp3s0.network

[Match]
Name=enp3s0

[Network]
Address=192.168.10.50/24
Gateway=192.168.10.1
DNS=8.8.8.8

正如你猜测的, enp3s0 接口地址会被指定为 192.168.10.50/24,默认网关是 192.168.10.1, DNS 服务器是 8.8.8.8。这里微妙的一点是,接口名 enp3s0 事实上也匹配了之前 DHCP 配置中定义的模式规则。但是,根据词汇顺序,文件 "10-static-enp3s0.network" 在 "20-dhcp.network" 之前被处理,对于 enp3s0 接口静态配置比 DHCP 配置有更高的优先级。

一旦你完成了创建配置文件,重启 systemd-networkd 服务或者重启机器。

$ sudo systemctl restart systemd-networkd

运行以下命令检查服务状态:

$ systemctl status systemd-networkd
$ systemctl status systemd-resolved

用 systemd-networkd 配置虚拟网络设备

systemd-networkd 同样允许你配置虚拟网络设备,例如网桥、VLAN、隧道、VXLAN、绑定等。你必须在用 .netdev 作为扩展名的文件中配置这些虚拟设备。

这里我展示了如何配置一个桥接接口。

Linux 网桥

如果你想创建一个 Linux 网桥(br0) 并把物理接口(eth1) 添加到网桥,你可以新建下面的配置。

$ sudo vi /etc/systemd/network/bridge-br0.netdev

[NetDev]
Name=br0
Kind=bridge

然后按照下面这样用 .network 文件配置网桥接口 br0 和从接口 eth1。

$ sudo vi /etc/systemd/network/bridge-br0-slave.network

[Match]
Name=eth1

[Network]
Bridge=br0

$ sudo vi /etc/systemd/network/bridge-br0.network

[Match]
Name=br0

[Network]
Address=192.168.10.100/24
Gateway=192.168.10.1
DNS=8.8.8.8

最后,重启 systemd-networkd。

$ sudo systemctl restart systemd-networkd

你可以用 brctl 工具 来验证是否创建好了网桥 br0。

总结

当 systemd 誓言成为 Linux 的系统管理器时,有类似 systemd-networkd 的东西来管理网络配置也就不足为奇。但是在现阶段,systemd-networkd 看起来更适合于网络配置相对稳定的服务器环境。对于桌面/笔记本环境,它们有多种临时有线/无线接口,NetworkManager 仍然是比较好的选择。

对于想进一步了解 systemd-networkd 的人,可以参考官方man 手册了解完整的支持列表和关键点。


via: http://xmodulo.com/switch-from-networkmanager-to-systemd-networkd.html

作者:Dan Nanni 译者:ictlyh 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

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

因此,这里有一些你在管理Docker容器的时候会用到的一些命令。

1. 找到Docker接口

Docker默认会创建一个名为docker0的网桥接口作为连接外部世界的基础。运行中的docker容器直接连接到网桥接口docker0。默认上,docker会分配172.17.42.1/16给docker0,它是所有运行中的容器ip地址的子网。找到Docker接口的ip地址非常简单。要找出docker0网桥接口和连接到网桥上的docker容器,我们可以在安装了docker的终端或者shell中运行ip命令。

# ip a

Docker Interface

2. 得到Docker容器的ip地址

如我们上面读到的,docker在宿主机中创建了一个叫docker0的网桥接口。在我们创建一个新的docker容器时,它自动被默认分配了一个在该子网范围内的ip地址。因此,要检测运行中的Docker容器的ip地址,我们需要进入一个正在运行的容器并用下面的命令检查ip地址。首先,我们运行一个新的容器并进入其中。如果你已经有一个正在运行的容器,你可以跳过这个步骤。

# docker run -it ubuntu

现在,我们可以运行ip a来得到容器的ip地址了。

# ip a

Docker Container IP

3. 映射暴露的端口

要映射配置在Dockerfile的暴露端口到宿主机的高位端口,我们只需用下面带上-P标志的命令。这会打开docker容器的随机端口并映射到Dockerfile中定义的端口。下面是使用-P来打开/暴露定义的端口的例子。

# docker run -itd -P httpd

Mapping Expose Port

上面的命令会映射容器的端口到 httpd 容器的 Dockerfile 中定义的80端口上。我们用下面的命令来查看正在运行的容器暴露的端口。

# docker ps

并且可以用下面的curl命令来检查。

# curl http://localhost:49153

Curl Exposed Port

4. 映射到特定的端口上

我们也可以映射暴露端口或者docker容器端口到我们指定的端口上。要实现这个,我们用-p标志来定义我们所需的端口。这里是我们的一个例子。

# docker run -itd -p 8080:80 httpd

上面的命令会映射(宿主机的)8080端口到(容器的)80上。我们可以运行curl来检查这点。

# curl http://localhost:8080

Mapping Specific Port

5. 创建自己的网桥

要给容器创建一个自定义的IP地址,在本篇中我们会创建一个名为br0的新网桥。要分配需要的ip地址,我们需要在运行docker的宿主机中运行下面的命令。

# stop docker.io
# ip link add br0 type bridge
# ip addr add 172.30.1.1/20 dev br0
# ip link set br0 up
# docker -d -b br0

Creating Bridge Interface

创建完docker网桥之后,我们要让docker的守护进程知道它。

# echo 'DOCKER_OPTS="-b=br0"' >> /etc/default/docker
# service docker.io start

Adding Interface to Docker

到这里,桥接后的接口将会分配给容器在桥接子网内的新ip地址。

6. 链接到另外一个容器上

我们可以用Docker将一个容器连接到另外一个上。我们可以在不同的容器上运行不同的程序,并且相互连接或链接。链接允许容器间相互连接并从一个容器上安全地传输信息给另一个容器。要做到这个,我们可以使用--link标志。首先,我们使用--name标志来标示training/postgres镜像。

# docker run -d --name db training/postgres

Running db Container

完成之后,我们将容器db与training/webapp链接来形成新的叫web的容器。

# docker run -d -P --name web --link db:db training/webapp python app.py

linking two containers

总结

Docker网络很神奇也好玩,我们可以对docker容器做很多事情。我们可以把玩这些简单而基础的docker网络命令。docker的网络是非常先进的,我们可以用它做很多事情。

如果你有任何的问题、建议、反馈请在下面的评论栏写下来以便于我们我们可以提升或者更新文章的内容。谢谢! 玩得开心!:-)


via: http://linoxide.com/linux-how-to/networking-commands-docker-containers/

作者:Arun Pyasi 译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

你也许已经知道了,Docker 容器技术是现有的成熟虚拟化技术的一个替代方案。它被企业应用在越来越多的领域中,比如快速部署环境、简化基础设施的配置流程、多客户环境间的互相隔离等等。当你开始在真实的生产环境使用 Docker 容器去部署应用沙箱时,你可能需要用到多个容器部署一套复杂的多层应用系统,其中每个容器负责一个特定的功能(例如负载均衡、LAMP 栈、数据库、UI 等)。

那么问题来了:有多台宿主机,我们事先不知道会在哪台宿主机上创建容器,如果保证在这些宿主机上创建的容器们可以互相联网?

联网技术哪家强?开源方案找 weave。这个工具可以为你省下不少烦恼。听我的准没错,谁用谁知道。

于是本教程的主题就变成了“如何使用 weave 在不同主机上的 Docker 容器之间设置网络”。

Weave 是如何工作的

让我们先来看看 weave 怎么工作:先创建一个由多个 peer 组成的对等网络,每个 peer 是一个虚拟路由器容器,叫做“weave 路由器”,它们分布在不同的宿主机上。这个对等网络的每个 peer 之间会维持一个 TCP 链接,用于互相交换拓扑信息,它们也会建立 UDP 链接用于容器间通信。一个 weave 路由器通过桥接技术连接到本宿主机上的其他容器。当处于不同宿主机上的两个容器想要通信,一台宿主机上的 weave 路由器通过网桥截获数据包,使用 UDP 协议封装后发给另一台宿主机上的 weave 路由器。

每个 weave 路由器会刷新整个对等网络的拓扑信息,可以称作容器的 MAC 地址(如同交换机的 MAC 地址学习一样获取其他容器的 MAC 地址),因此它可以决定数据包的下一跳是往哪个容器的。weave 能让两个处于不同宿主机的容器进行通信,只要这两台宿主机在 weave 拓扑结构内连到同一个 weave 路由器。另外,weave 路由器还能使用公钥加密技术将 TCP 和 UDP 数据包进行加密。

准备工作

在使用 weave 之前,你需要在所有宿主机上安装 Docker 环境,参考这些教程,在 UbuntuCentOS/Fedora 发行版中安装 Docker。

Docker 环境部署完成后,使用下面的命令安装 weave:

$ wget https://github.com/zettio/weave/releases/download/latest_release/weave
$ chmod a+x weave
$ sudo cp weave /usr/local/bin 

注意你的 PATH 环境变量要包含 /usr/local/bin 这个路径,请在 /etc/profile 文件中加入一行(LCTT 译注:要使环境变量生效,你需要执行这个命令: source /etc/profile):

export PATH="$PATH:/usr/local/bin"

在每台宿主机上重复上面的操作。

Weave 在 TCP 和 UDP 上都使用 6783 端口,如果你的系统开启了防火墙,请确保这两个端口不会被防火墙挡住。

在每台宿主机上启动 Weave 路由器

当你想要让处于在不同宿主机上的容器能够互相通信,第一步要做的就是在每台宿主机上启动 weave 路由器。

第一台宿主机,运行下面的命令,就会创建并开启一个 weave 路由器容器(LCTT 译注:前面说过了,weave 路由器也是一个容器):

$ sudo weave launch 

第一次运行这个命令的时候,它会下载一个 weave 镜像,这会花一些时间。下载完成后就会自动运行这个镜像。成功启动后,终端会输出这个 weave 路由器的 ID 号。

下面的命令用于查看路由器状态:

$ sudo weave status 

第一个 weave 路由器就绪了,目前为止整个 peer 对等网络中只有一个 peer 成员。

你也可以使用 docker 的命令来查看 weave 路由器的状态:

$ docker ps 

第二台宿主机部署步骤稍微有点不同,我们需要为这台宿主机的 weave 路由器指定第一台宿主机的 IP 地址,命令如下:

$ sudo weave launch <first-host-IP-address> 

当你查看路由器状态,你会看到两个 peer 成员:当前宿主机和第一个宿主机。

当你开启更多路由器,这个 peer 成员列表会更长。当你新开一个路由器时,要指定前一个宿主机的 IP 地址,请注意不是第一个宿主机的 IP 地址(LCTT 译注:链状结构)。

现在你已经有了一个 weave 网络了,它由位于不同宿主机的 weave 路由器组成。

把不同宿主机上的容器互联起来

接下来要做的就是在不同宿主机上开启 Docker 容器,并使用虚拟网络将它们互联起来。

假设我们创建一个私有网络 10.0.0.0/24 来互联 Docker 容器,并为这些容器随机分配 IP 地址。

如果你想新建一个能加入 weave 网络的容器,你就需要使用 weave 命令来创建,而不是 docker 命令。原因是 weave 命令内部会调用 docker 命令来新建容器然后为它设置网络。

下面的命令是在宿主机 hostA 上建立一个 Ubuntu 容器,然后将它放到 10.0.0.0/24 网络中,分配的 IP 地址为 10.0.0.1:

hostA:~$ sudo weave run 10.0.0.1/24 -t -i ubuntu 

成功运行后,终端会显示出容器的 ID 号。你可以使用这个 ID 来访问这个容器:

hostA:~$ docker attach <container-id> 

在宿主机 hostB 上,也创建一个 Ubuntu 容器,IP 地址为 10.0.0.2:

hostB:~$ sudo weave run 10.0.0.2/24 -t -i ubuntu 

访问下这个容器的控制台:

hostB:~$ docker attach <container-id> 

这两个容器能够互相 ping 通,你可以通过容器的控制台检查一下。

如果你检查一下每个容器的网络配置,你会发现有一块名为“ethwe”的网卡,你分配给容器的 IP 地址出现在它们那里(比如这里分别是 10.0.0.1 和 10.0.0.2)。

Weave 的其他高级用法

weave 提供了一些非常巧妙的特性,我在这里作下简单的介绍。

应用分离

使用 weave,你可以创建多个虚拟网络,并为每个网络设置不同的应用。比如你可以为一群容器创建 10.0.0.0/24 网络,为另一群容器创建 10.10.0.0/24 网络,weave 会自动帮你维护这些网络,并将这两个网络互相隔离。另外,你可以灵活地将一个容器从一个网络移到另一个网络而不需要重启容器。举个例子:

首先开启一个容器,运行在 10.0.0.0/24 网络上:

$ sudo weave run 10.0.0.2/24 -t -i ubuntu

然后让它脱离这个网络:

$ sudo weave detach 10.0.0.2/24 <container-id>

最后将它加入到 10.10.0.0/24 网络中:

$ sudo weave attach 10.10.0.2/24 <container-id> 

现在这个容器可以与 10.10.0.0/24 网络上的其它容器进行通信了。这在当你创建一个容器而网络信息还不确定时就很有帮助了。

将 weave 网络与宿主机网络整合起来

有时候你想让虚拟网络中的容器能访问物理主机的网络。或者相反,宿主机需要访问容器。为满足这个功能,weave 允许虚拟网络与宿主机网络整合。

举个例子,在宿主机 hostA 上一个容器运行在 10.0.0.0/24 中,运行使用下面的命令:

hostA:~$ sudo weave expose 10.0.0.100/24 

这个命令把 IP 地址 10.0.0.100 分配给宿主机 hostA,这样一来宿主机 hostA 也连到了 10.0.0.0/24 网络上了。显然,你在为宿主机选择 IP 地址的时候,需要选一个没有被其他容器使用的地址。

现在 hostA 就可以访问 10.0.0.0/24 上的所有容器了,不管这些容器是否位于 hostA 上。好巧妙的设定啊,32 个赞!

总结

如你所见,weave 是一个很有用的 docker 网络配置工具。这个教程只是它强悍功能的冰山一角。如果你想进一步玩玩,你可以试试它的以下功能:多跳路由功能,这个在 multi-cloud 环境(LCTT 译注:多云,企业使用多个不同的云服务提供商的产品,比如 IaaS 和 SaaS,来承载不同的业务)下还是很有用的;动态重路由功能是一个很巧妙的容错技术;或者它的分布式 DNS 服务,它允许你为你的容器命名。如果你决定使用这个好东西,欢迎分享你的使用心得。


via: http://xmodulo.com/networking-between-docker-containers.html

作者:Dan Nanni 译者:bazz2 校对:校对者ID

本文由 LCTT 原创翻译,Linux中国 荣誉推出