浅谈 Docker 网络:单节点单容器
1.Docker 网络模型
- sandbox:沙盒,沙盒包含了容器网络栈的信息,它可以对容器的接口、路由和 DNS 设置等进行管理。一个沙盒可以有多个 endpoint 和 network,它的实现机制一般是 Liunx network space。
- endpoint:端点,一个端点可以加入 sandbox 和 network 中,它可以通过 veth pair、Open vSwitch 或其它网络设备实现,一个端点只可以属于一个网络并且只属于一个沙盒。
- network:网络,网络是一组可以直接互相连通的端点,它可以通过 Liunx Bridge、VLAN 等实现。
- bridge driver:Docker 默认的驱动类型,使用该驱动时 libnetwork 将创建的容器连接到 Docker 网桥上。它可以满足大部分容器网络应用场景,但是在容器访问外网时需要做 NAT, 增加了通信的复杂度。
- host driver:使用该驱动类型时 libnetwork 将不会为容器创建 network namespace,容器和宿主机共用 network namespace。
- overlay driver:该驱动类型使用标准的 VXLAN 方式进行通信,使用该驱动需要额外配置存储服务,如 etcd 等。
- remote driver:该驱动并未做真正的网络实现,它通过调用用户自行实现的网络驱动插件,使 libnetwork 实现驱动的插件化。
- null driver:该驱动会为容器创建 network space,但是不对容器进行任何网络配置,即创建的容器只有 loopback 地址,没有其它网卡、路由和 IP 等信息。
2.单容器网络
[root@lianhua ~]$ docker network ls
NETWORK ID NAME DRIVER SCOPE
1a779d0e62d5 bridge bridge local
f0ae6387e721 host host local
6d565e9acb10 none null local
[root@lianhua ~]$ docker run -it --name demo0 httpd
[root@lianhua ~]$ docker inspect bridge
[
{
"Name": "bridge",
"Id": "1a779d0e62d5a309e1e942862b76d69d4ba9ed9be9c7bcdc051e8de89b0cc3ee",
"Created": "2020-08-26T00:06:03.910196776+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"7be09e54b24c45100769e131b46259c519710785ccfb68afaa904a1114add9a1": {
"Name": "demo0",
"EndpointID": "98399b3c0560aac4ca63de9f79659176562406ac02d917c667852b9a863296bb",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
[root@lianhua ~]$ brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02426c5d38db no veth559f8be
3.单容器访问外网
[root@lianhua ~]$ docker exec -it demo0 /bin/bash
bash-4.2$ ping 172.17.0.1 -c 3
PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from 172.17.0.1: icmp_seq=2 ttl=64 time=0.047 ms
64 bytes from 172.17.0.1: icmp_seq=3 ttl=64 time=0.053 ms
--- 172.17.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.047/0.049/0.053/0.008 ms bash-4.2$ ping 192.168.0.69 -c 3
PING 192.168.0.69 (192.168.0.69) 56(84) bytes of data.
64 bytes from 192.168.0.69: icmp_seq=1 ttl=64 time=0.040 ms
64 bytes from 192.168.0.69: icmp_seq=2 ttl=64 time=0.055 ms
64 bytes from 192.168.0.69: icmp_seq=3 ttl=64 time=0.052 ms
--- 192.168.0.69 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.040/0.049/0.055/0.006 ms bash-4.2$ ping 10.57.***.*** -c 3
PING 10.57.***.*** (10.57.***.***) 56(84) bytes of data.
64 bytes from 10.57.***.***: icmp_seq=1 ttl=42 time=1.81 ms
64 bytes from 10.57.***.***: icmp_seq=2 ttl=42 time=1.59 ms
64 bytes from 10.57.***.***: icmp_seq=3 ttl=42 time=1.71 ms
--- 10.57.***.*** ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 1.593/1.705/1.813/0.095 ms
[root@lianhua ~]$ iptables-save
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
# 容器中 ping 外网
bash-4.2$ ping 10.57.***.*** -c 3
PING 10.57.***.*** (10.57.***.***) 56(84) bytes of data.
64 bytes from 10.57.***.***: icmp_seq=1 ttl=42 time=1.67 ms
64 bytes from 10.57.***.***: icmp_seq=2 ttl=42 time=1.59 ms
64 bytes from 10.57.***.***: icmp_seq=3 ttl=42 time=1.64 ms --- 10.57.***.*** ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 1.594/1.637/1.673/0.057 ms # 宿主机(虚拟机)上抓包
[root@lianhua ~]$ tcpdump -i eth0 -n icmp -vv
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
22:03:18.733722 IP (tos 0x0, ttl 63, id 25663, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.0.69 > 10.57.***.***: ICMP echo request, id 15, seq 1, length 64
22:03:18.735322 IP (tos 0x48, ttl 43, id 58922, offset 0, flags [none], proto ICMP (1), length 84)
10.57.***.*** > 192.168.0.69: ICMP echo reply, id 15, seq 1, length 64
22:03:19.735287 IP (tos 0x0, ttl 63, id 25731, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.0.69 > 10.57.***.***: ICMP echo request, id 15, seq 2, length 64
22:03:19.736786 IP (tos 0x48, ttl 43, id 59208, offset 0, flags [none], proto ICMP (1), length 84)
10.57.***.*** > 192.168.0.69: ICMP echo reply, id 15, seq 2, length 64
22:03:20.736261 IP (tos 0x0, ttl 63, id 26101, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.0.69 > 10.57.***.***: ICMP echo request, id 15, seq 3, length 64
22:03:20.737811 IP (tos 0x48, ttl 43, id 59632, offset 0, flags [none], proto ICMP (1), length 84)
10.57.***.*** > 192.168.0.69: ICMP echo reply, id 15, seq 3, length 64 # 外网 host 上抓包
[root@controller-2 admin(admin)]# tcpdump -i eth0 -n icmp -vv
tcpdump: listening on vlan9, link-type EN10MB (Ethernet), capture size 262144 bytes
22:03:18.772846 IP (tos 0x48, ttl 42, id 25663, offset 0, flags [DF], proto ICMP (1), length 84)
10.183.**.*** > 10.57.***.***: ICMP echo request, id 15, seq 1, length 64
22:03:18.772890 IP (tos 0x48, ttl 64, id 58922, offset 0, flags [none], proto ICMP (1), length 84)
10.57.***.*** > 10.183.**.***: ICMP echo reply, id 15, seq 1, length 64
22:03:19.774331 IP (tos 0x48, ttl 42, id 25731, offset 0, flags [DF], proto ICMP (1), length 84)
10.183.**.*** > 10.57.***.***: ICMP echo request, id 15, seq 2, length 64
22:03:19.774358 IP (tos 0x48, ttl 64, id 59208, offset 0, flags [none], proto ICMP (1), length 84)
10.57.***.*** > 10.183.**.***: ICMP echo reply, id 15, seq 2, length 64
22:03:20.775339 IP (tos 0x48, ttl 42, id 26101, offset 0, flags [DF], proto ICMP (1), length 84)
10.183.**.*** > 10.57.***.***: ICMP echo request, id 15, seq 3, length 64
22:03:20.775390 IP (tos 0x48, ttl 64, id 59632, offset 0, flags [none], proto ICMP (1), length 84)
10.57.***.*** > 10.183.**.***: ICMP echo reply, id 15, seq 3, length 64
# 10.183.**.*** 是虚拟机所在 host 的网口 ip 地址
4.外网访问单容器
$ docker run -d -p 80 --name demo1 httpd
6070389f1362ef4ad6c6264077c4a47ffe8d9b2700c48e03afcb8afa5e92356c
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6070389f1362 httpd "httpd-foreground" 44 seconds ago Up 32 seconds 0.0.0.0:32768->80/tcp demo1
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWNgroup default 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 02:42:ac:11:00:44 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.68/16 brd 172.17.255.255 scope global ens3
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:44/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:b6:5f:a7:1b brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/24 brd 172.18.0.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:b6ff:fe5f:a71b/64 scope link
valid_lft forever preferred_lft forever
5: veth0541dca@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 2e:31:fe:95:a3:b8 brd ff:ff:ff:ff:ff:ff link-netnsid0
inet6 fe80::2c31:feff:fe95:a3b8/64 scope link
valid_lft forever preferred_lft forever
$ ps -elf | grep docker-proxy | grep -v grep
root /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port32768 -container-ip 172.18.0.2 -container-port 80
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 32768 -j DNAT --to-destination 172.18.0.2:80
浅谈 Docker 网络:单节点单容器的更多相关文章
- 浅谈Spring的两种配置容器
浅谈Spring的两种配置容器 原文:https://www.jb51.net/article/126295.htm 更新时间:2017年10月20日 08:44:41 作者:黄小鱼ZZZ ...
- 浅谈通信网络(三)——TCP/IP协议
简介 Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议.In ...
- Docker深入浅出系列 | 单节点多容器网络通信
目录 教程目标 准备工作 带着问题开车 同一主机两个容器如何相互通信? 怎么从服务器外访问容器 Docker的三种网络模式是什么 Docker网络通信原理 计算机网络模型回顾 Linux中的网卡 查看 ...
- Kafka 单节点单Kafka Broker集群
下载与安装 从 http://www.apache.org/dist/kafka/ 下载最新版本的 kafka,这里使用的是 kafka_2.12-0.10.2.1.tgz $ tar zxvf ka ...
- 浅谈Docker(一)
注:由于别人写的太好了就转来基础介绍! 转自:http://www.infoq.com/cn/articles/docker-core-technology-preview Docker是PaaS供应 ...
- 浅谈iOS网络编程之一入门
计算机网络,基本上可以抽象是端的通信.实际在通讯中会用到不同的设备,不同的硬件中,为了能友好的传输信息,那么建立一套规范就十分必要了.先来了解一些基本概念 了解网络中传输的都是二进制数据流. 2.了 ...
- 浅谈Docker
一.为什么使用Docker 软件开发最大的麻烦事之一,就是环境配置.很多人想到,能不能从根本上解决问题,软件可以带环境安装? 也就是说,安装的时候,把原始环境一模一样地复制过来. 目前有两个主流解决方 ...
- 浅谈 Docker 安全合规建设
通过阅读网上帖子及浏览相关信息,大家可能会产生一种错觉:Docker 安全性不足,对 Docker 导入生产环境持保守态度.不过实际情况是,虽然我们需要对容器的安全性高度关注,但只要使用得当,完全可以 ...
- 浅谈Docker(二)
Docker使用cgroup实现CPU,内存和磁盘IO等系统资源的限制. CPU Docker现在有2个与CPU资源相关的参数,-c可以指定CPU的占比,--cpuset可以绑定CPU.例如,指定容器 ...
- 浅谈C#网络编程(一)
阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...
随机推荐
- 【论文阅读】HTTP 流量和恶意 URL 的异常检测
Part 1关于论文 基本信息 题目:HTTP 流量和恶意 URL 的异常检测 源码:sec2vec源代码 摘要 在本文中,我们将展示如何利用自然语言处理(NLP)中已知 的方法来检测 HTTP 请求 ...
- linux 上安装kapacitor
转载请注明出处: 1.通过安装包安装 1.使用以下命令下载安装包: wget https://dl.influxdata.com/kapacitor/releases/kapacitor_1.6.3- ...
- RV1126 分区教程
一.前言 期初我是想弄一个分区存放自己的 APP 程序,如果需要更改应用的时候,只需要烧写独立的分区即可,就不需要重新烧写 rootfs.这是一个简单的操作,为啥还需要记录了,因为我在里面遇到了一些坑 ...
- awk所有常用语法
awk [OPTIONS] PROGRAM FILE... 选项: -F 指定分隔符 -f 引用awk脚本 -v VAR=VALUE 定义一个变量传递给PROGRAM,但是这里的变量BEGIN读不了, ...
- Ef Core花里胡哨系列(7) 使用Ef Core也能维护表架构?
Ef Core花里胡哨系列(7) 使用Ef Core也能维护表架构? 我们这里指的并不是查询,而是利用Ef的迁移原理,生成可用的其它表架构操作的Sql. 例如你想在Ef Core里建表,并且可能程序里 ...
- uniapp的app苹果应用商店上架最简教程
除了测试版本之外,uniapp打包好的ipa文件是无法直接安装在普通用户的手机上面,这是苹果的证书和描述文件的机制的原因. 因此我们需要将打包好的ipa文件上架到苹果应用商店,也就是app store ...
- SpringBoot 接口:响应时间优化9个技巧!
今天聊聊 SpringBoot接口:响应时间优化的9个技巧.在实际开发中,提升接口响应速度是一件挺重要的事,特别是在面临大量用户请求的时候.好了,咱们直接切入正题. 本文,已收录于,我的技术网站 dd ...
- JavaFx之使用高版本JDK(二十八)
JavaFx之使用高版本JDK(二十八) 如何使用高版本的jfx? 根据官网的需要手动引入jfx模块(运行参数:–module-path) 要知道高版本jfx已经集成了丰富的主流功能,例如视频编码,大 ...
- 浅谈6种流行的API架构风格
前言 API在现代软件开发中扮演着重要的角色,它们是不同应用程序之间的桥梁.编写业务API是日常开发工作中最常见的一部分,选择合适的API框架对项目的成功起到了至关重要的作用.本篇文章将浅谈一下当前6 ...
- NebulaGraph实战:1-NebulaGraph安装和基础操作
以前使用Neo4j图数据库,考虑到生产环境需要最终选择了NebulaGraph图数据库.对于数据要求比较高的领域,比如医疗.财务等,暂时还是离不开知识图谱的.后面主要围绕LLM+KG做一些行业解决 ...