docker 网络命名空间如何连通?

简介: docker 网络命名空间如何连通?

一、busybox介绍


busybox是一个集成了一百多个最常用linux命令和工具的软件,他甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小.我们平时用的那些linux命令就好比是分立式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍,在嵌入式linux应用中,busybox有非常广的应用。

[root@iZ2vceej7yes1abpm7yec2Z ~]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
python                      3.6                 1297140c6dd2        9 days ago          874MB
ubuntu                      latest              d70eaf7277ea        2 weeks ago         72.9MB
busybox                     latest              f0b02e9d092d        4 weeks ago         1.23MB

看到了吧,busybox 这个images只有1.23MB, 这一般用于嵌入式linux系统。

详情参考:https://www.ibm.com/developerworks/cn/linux/l-busybox/index.html

二、运行两个busybox contain,尝试互ping 和 telnet


在busybox的sh下运行一个sleep脚本

1、busybox test1

docker run -d busybox /bin/sh -c "while true; do sleep 3600; done"

2、busybox test2

~]# docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3600; done"
~]# docker container  ls -a
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS                       PORTS                    NAMES
51ea3cd11968        busybox                        "/bin/sh -c 'while t…"   5 seconds ago       Up 5 seconds                                          test2
4209ba002f3d        busybox                        "/bin/sh -c 'while t…"   3 minutes ago       Up 3 minutes                                          gallant_ramanujan

在container test2中ping 另外一个container

docker exec 在运行中的container中查询ip

 ~]# docker exec  51ea ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
144: eth0@if145: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@iZ2vceej7yes1abpm7yec2Z ~]# 
[root@iZ2vceej7yes1abpm7yec2Z ~]# docker exec  420 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
142: eth0@if143: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

两个容器相互ping,可以ping通

 ~]# docker exec 51e ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.093 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.065 ms
64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.070 ms
^C
[root@iZ2vceej7yes1abpm7yec2Z ~]# 
[root@iZ2vceej7yes1abpm7yec2Z ~]# docker exec 420 ping 172.17.0.4
PING 172.17.0.4 (172.17.0.4): 56 data bytes
64 bytes from 172.17.0.4: seq=0 ttl=64 time=0.083 ms
64 bytes from 172.17.0.4: seq=1 ttl=64 time=0.071 ms
64 bytes from 172.17.0.4: seq=2 ttl=64 time=0.068 ms

这是如何实现的呢?请看第三节

三、networknamespace的实现原理


3.1 如何创建和销毁linux 的netns?


~]# ip netns add net1
[root@iZ2vceej7yes1abpm7yec2Z ~]# ip netns add net2
[root@iZ2vceej7yes1abpm7yec2Z ~]# 
[root@iZ2vceej7yes1abpm7yec2Z ~]# ip netns list
net2
net1

3.2 如何在linux中查看netns的ip?


上面创建的这两个容器都有自己的netns,通过docker exec查看ip和端口。linux中也有同样的命令。

 ~]# ip netns exec net1 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

执行ip link

 ~]# ip netns exec net1 ip link
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

只有一个link,是本地回环口。

稍后会绑定一个link 和另外一个netns互通。

启动l0端口

~]# ip netns exec net1 ip link set dev lo up
[root@iZ2vceej7yes1abpm7yec2Z ~]# 
[root@iZ2vceej7yes1abpm7yec2Z ~]# ip netns exec net1 ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

状态现在变为unknown,这和本地的回环口一样,只有两端都连接时,例如eth0会和mac的虚拟端口连接起来,必须是一对才会显示up。

3.3 docker 中的网络连接


20201119150134799.png

通过docker network inspect 可以看到bridge上的连接就是0.4这个ip地址。

20201119150242929.png

本地的ip a结果分析

20201119150414363.png

目录
相关文章
|
11天前
|
Kubernetes Devops 持续交付
DevOps实践:使用Docker和Kubernetes实现持续集成和部署网络安全的守护盾:加密技术与安全意识的重要性
【8月更文挑战第27天】本文将引导读者理解并应用DevOps的核心理念,通过Docker和Kubernetes的实战案例,深入探讨如何在现代软件开发中实现自动化的持续集成和部署。文章不仅提供理论知识,还结合真实示例,旨在帮助开发者提升效率,优化工作流程。
|
16天前
|
应用服务中间件 nginx Docker
【与时俱进】网络工程师必备技能:Docker基础入门指南,助你轻松应对新时代挑战!
【8月更文挑战第22天】随着容器技术的发展,Docker已成为开发与运维的关键工具。本文简要介绍Docker——一种开源容器化平台,能让应用程序及依赖项被打包成轻量级容器,在任何Linux或Windows机器上运行。文中涵盖Docker的安装步骤、基础命令操作如启动服务、查看版本、拉取与运行容器等。并通过实例演示了如何运行Nginx服务器和基于Dockerfile构建Python Flask应用镜像的过程。这些基础知识将助力网络工程师理解Docker的核心功能,并为实际应用提供指导。
44 2
|
18天前
|
Ubuntu Shell 网络架构
网络工程师的秘密武器:为何他们必须掌握Docker的基础知识?
【8月更文挑战第20天】在IT领域,Docker作为主流容器化平台,简化了应用部署与管理。网络工程师虽不必精通Docker,但需了解其基本概念如镜像、容器等,及如何创建、运行容器,还需掌握Docker网络模式如bridge、overlay等。这有助于与开发团队协作,设计高效网络架构。例如,通过`docker pull ubuntu`和`docker run -it ubuntu /bin/bash`即可拉取并启动Ubuntu容器。了解这些基础知识能促进跨团队沟通,适应快速发展的IT行业需求。
26 0
|
5天前
|
Shell Linux Docker
自定义Docker网络
这篇文章介绍了如何使用Docker命令自定义网络,并通过创建和配置网络来实现容器间的通信。
16 6
自定义Docker网络
|
5天前
|
NoSQL 应用服务中间件 Redis
Docker跨宿主机容器通信-通过网络跨宿主机互联
这篇文章介绍了Docker容器跨宿主机通信的实现方法,包括Docker的四种网络模式(host、none、container、bridge)以及如何通过修改网络配置和添加路由规则来实现不同宿主机上的容器之间的互联。
12 0
Docker跨宿主机容器通信-通过网络跨宿主机互联
|
17天前
|
Kubernetes 网络安全 网络架构
Docker不同宿主机网络打通
【8月更文挑战第20天】在不同宿主机上打通Docker网络可通过多种方法:1) 使用Docker原生的Overlay或Macvlan网络驱动实现跨主机通信,如Overlay网络利用VXLAN技术连接多台宿主机,Macvlan则让容器直接接入物理网络;2) 利用第三方工具如Weave Net或Flannel构建虚拟网络,Weave Net简化网络配置,Flannel则适用于Kubernetes环境并通过UDP封装数据包实现通信。实施前需确保宿主机间网络畅通且防火墙设置适当。
|
20天前
|
网络协议 Linux 网络安全
遇到Docker容器网络隔断?揭秘六种超级实用解决方案,轻松让Docker容器畅游互联网!
【8月更文挑战第18天】Docker容器内网络不通是开发者常遇问题,可能因网络配置错、Docker服务异常或防火墙阻碍等原因引起。本文提供六种解决策略:确认Docker服务运行状态、重启Docker服务、检查与自定义Docker网络设置、验证宿主机网络连接、临时禁用宿主机IPv6及检查防火墙规则。通过这些步骤,多数网络问题可得以解决,确保容器正常联网。
34 1
|
14天前
|
负载均衡 安全 测试技术
Docker 的不同网络类型详解
【8月更文挑战第24天】
15 0
|
18天前
|
Kubernetes 安全 网络安全
Docker不同宿主机网络打通
【8月更文挑战第18天】在Docker中实现不同宿主机间的网络互联有多种方法:1) 使用Docker原生的Overlay与Macvlan网络。Overlay网络让容器跨主机通信,通过简单配置即可搭建;Macvlan则允许容器直接接入物理网络,实现高效通信。2) 利用第三方插件如Flannel和Calico,它们不仅支持跨主机网络,还提供高级特性如网络策略管理。无论选用哪种方案,均需确保宿主机间网络通畅,并适当配置防火墙以保障容器间的顺畅通信。
|
19天前
|
Docker 容器
在Docker中,网络模式有哪些?
在Docker中,网络模式有哪些?
下一篇
DDNS