1.网络分类

  • 单机

    • Bridge Network
    • Host Network
    • None Network
  • 多机
    • Overlay Network

2.网络基础

  • 公有IP和私有IP

    • public IP:互联网上的唯一标识,可以访问Internet
    • private IP:不可在互联网上使用,仅限机构内部使用
    • A类:10.0.0.0~10.255.255.255(10.0.0.0/8)
    • B类:172.16.0.0~172.31.255.255(172.16.0.0/12)
    • C类:192.168.0.0~192.168.255.255(192.168.0.0/16)
  • 网络地址转换NAT
  • 有一个公有IP,路由来做NAT转换
  • ping:验证IP的可达性
  • telnet:验证服务的可用性

3.Linux网络命名空间namespace

  • 查看后台进程
  • 交互运行
  • exit退出后,本机也可以查看网络接口,但他们是不同的,是隔离开的,这就是通过namespace实现的网络隔离
  • 直接查看容器的网络端口,在本机可以ping通,因为本机也虚拟出了一个网段
  • 查看本机的network namespace
  • 创建namespace
  • 删除namespace
  • 再次创建namespace
  • 在namespace中执行ip a创建一个回环口
  • 查看回环口状态
  • 使之变为up状态
  • 再次查看回环口状态
  • 创建另一个namespace test2
  • 添加link,然后查看,多了两个veth的接口
  • 查看veth的接口
  • 将veth-test1添加到namespace的test1中,然后查看test1中的接口
  • 可以在本地查看ip link,本地的veth-test1不见了

  • 将veth-test2添加到namespace的test2中,然后查看test2中的接口
  • 然后可以在本地查看ip link,本地的veth-test2不见了
  • 为test1和test2分配IP地址
  • 此时查看test1和test2,并没有IP
  • 开启2个端口
  • 再次查看test1和test2
  • test1和test2此时已经有IP了

  • test1和test2互相可以ping通
  • 这就是docker底层应用namespace网络隔离的原理
  • 创建容器,就会同时创建一个namespace

4.Bridge详解

  • 关掉test6,就留一个test5
  • 列举当前机器docker有哪些网络
  • 查看bridge网络的连接情况
  • 可以看到test5的container连接的是docker bridge网络

  • 查看本机的网卡

  • 查看test5的ip a,下面的eth0@if15就与上面的veth是一对的
  • 可以通过brctl查看所有的bridge
  • 可以看到如下veth与 ip a 查看到的docker0的veth是一样的
  • 再创建一个container
  • 再次查看所有的bridge
  • 查看ip a,docker0下也多了一个veth与之对应
  • 进入容器交互运行
  • ping 外网
  • 本机的eth0可以去访问外网,NAT网络地址转换实现了docker0也可以访问外网,也就是iptables实现的

5.容器通信

  • 创建一个container
  • 创建另一个container
  • 查看进程
  • 交互访问test8,然后ping IP和ping 主机名,都是通的


  • 这里假设,访问test7的mysql,就可以test7:3306
  • 反过来,交互运行test7,不能直接ping 主机名,是有方向的
  • 查看,停止,删除test8

6.端口映射

  • 首先,后台创建并运行一个nginx的container
  • 查看进程,nginx默认使用80端口
  • 查看网络状况
  • web连接到了bridge上,IP是172.17.0.2

  • 本机可以ping通nginx的container
  • 80端口也是可连通的
  • 可以查看nginx的欢迎页面
  • 停止并删掉刚才的web容器
  • 重新创建容器,指定-p参数,将容器的80端口映射到本地的80端口
  • 查看进程,已经映射到了本地的80端口
  • 此时访问本地的80端口,也会返回nginx欢迎页
  • 通过浏览器访问虚拟机IP也可以
  • 拓扑图如下,nginx是绑定到172.17.0.2:80,刚才-p参数是将192.168.205.10:80转发到了172.17.0.2:80
  • 如果是在阿里云创建的,192.168.205.10就是对外的IP
  • 阿里云也是给两个IP,有一个是对外的IP

7.网络的none和host

  • 介绍host和none网络
  • 创建新的容器,使用none网络
  • 查看none网络,连接了test10

  • 外界查看不到test10的网络
  • 进入test10容器,并查看网络,没有对外的接口,是一个孤立的容器
  • 应用场景:安全性要求极高,存储绝密数据等
  • 创建新的容器,使用host网络
  • 查看host网络,连接了test11
  • 进入test11容器,并查看网络,与本机看到的是一样的,与主机共享namespace,类似虚拟机NAT模式

8.多容器部署和应用

  • 创建redis容器
  • 创建并进入目录
  • 创建app.py,写入以下内容
    from flask import Flask
    from redis import Redis
    import os
    import socket

app = Flask(name)
redis = Redis(host=os.environ.get(‘REDIS_HOST’, ‘127.0.0.1’), port=6379)

@app.route(’/’)
def hello():
redis.incr(‘hits’)
return ‘Hello Container World! I have been seen %s times and my hostname is %s.\n’ % (redis.get(‘hits’),socket.gethostname())

if name == “main”:
app.run(host=“0.0.0.0”, port=5000, debug=True)

  • 创建Dockerfile,写入以下内容
    FROM python:2.7
    LABEL maintaner="sjc_job@126.com"
    COPY . /app
    WORKDIR /app
    RUN pip install flask redis
    EXPOSE 5000
    CMD [ “python”, “app.py” ]
  • 构建image
  • 创建flask容器
  • 进入容器,交互执行
  • 查看环境变量

  • 直接可以ping redis了
  • 多次访问5000端口,实现自增

  • 停止并删掉flask-redis
  • 重启启动容器,加-p参数指定端口映射
  • 本地也可以访问容器内的服务了
  • 这里的自增1是redis做的,web服务是flask发布的

9.overlay网络和etcd通信

  • etcd是一个开源免费的K-V的分布式存储
  • 解压
  • 进入解压目录
  • 运行如下启动命令,然后回车,后台运行

    nohup ./etcd --name docker-node1 --initial-advertise-peer-urls http://192.168.174.141:2380
    –listen-peer-urls http://192.168.174.141:2380
    –listen-client-urls http://192.168.174.141:2379,http://127.0.0.1:2379
    –advertise-client-urls http://192.168.174.141:2379
    –initial-cluster-token etcd-cluster
    –initial-cluster docker-node1=http://192.168.174.141:2380,docker-node2=http://192.168.174.142:2380
    –initial-cluster-state new&
  • 第二台机器,进入/usr/local目录,下载tar包
  • 解压
  • 进入解压目录
  • 运行如下启动命令,然后回车,后台运行

    nohup ./etcd --name docker-node2 --initial-advertise-peer-urls http://192.168.174.142:2380
    –listen-peer-urls http://192.168.174.142:2380
    –listen-client-urls http://192.168.174.142:2379,http://127.0.0.1:2379
    –advertise-client-urls http://192.168.174.142:2379
    –initial-cluster-token etcd-cluster
    –initial-cluster docker-node1=http://192.168.174.141:2380,docker-node2=http://192.168.174.142:2380
    –initial-cluster-state new&
  • 在第一台机器etcd文件夹中执行,查看etcd集群状态
  • 第二台机器也同样执行,检查状态
  • 第一台机器停止docker
  • 手动后台运行docker,命令执行完打回车
  • 第二台机器停止docker
  • 手动后台运行docker,命令执行完打回车
  • 可以将两个机器都exit退出,然后再重新连接
  • node01中,创建网络,overlay是驱动
  • 查看网络,多个demo
  • node02中查看网络,也多个demo,两边数据是同步的,etcd实现的
  • node01中查看etcd记录的信息,最终看到id与创建network产生的id一致



  • 可以查看网络的基本信息
  • node01中创建容器
  • 此时将命令复制到node02运行,会直接报错,说test12已经存在
  • node02中重新创建,改名为test13

    学院Go语言视频主页
    https://edu.csdn.net/lecturer/1928

[清华团队带你实战区块链开发]
(https://ke.qq.com/course/344443?tuin=3d17195d)
扫码获取海量视频及源码 QQ群:
721929980

1.04 docker的网络相关推荐

  1. 单一docker主机网络

    一. 容器网络模型: Docker定义了一个非常简单的网络模型,叫做container network model(CNM).如下图所示: CNM模型有三个元素---sandbox, endpoint ...

  2. docker容器网络及其配置

    docker容器网络及其配置 文章目录 docker容器网络及其配置 虚拟化网络 单主机与多主机的Docker网络 单节点容器间通信 不同节点容器间通信 Docker网络驱动 选择Docker网络驱动 ...

  3. Docker容器网络实例管理

    Docker容器网络实例管理 Linux内核实现名称空间的创建 ip netns命令 可以借助ip netns命令来完成对 Network Namespace 的各种操作.ip netns命令来自于i ...

  4. docker的网络架构配置

    http://xiaorenwutest.blog.51cto.com                  docker 网络架构模 默认情况下,容器可以建立到外部网络的连接,但是外部网络无法连接到容器 ...

  5. docker(4)docker的网络,自定义网桥

    Docker 的网络 运行 ifconfig 找到 docker0 : 虚拟网卡默认网卡名称为docker0 查看docker 的网桥: 我这里默认们没有进行安装 网桥管理设备:进行安装一下: yum ...

  6. 手工模拟实现 Docker 容器网络!

    大家好,我是飞哥! 如今服务器虚拟化技术已经发展到了深水区.现在业界已经有很多公司都迁移到容器上了.我们的开发写出来的代码大概率是要运行在容器上的.因此深刻理解容器网络的工作原理非常的重要.只有这样将 ...

  7. Docker(十四):Docker:网络模式详解

    Docker作为目前最火的轻量级容器技术,牛逼的功能,如Docker的镜像管理,不足的地方网络方面. Docker自身的4种网络工作方式,和一些自定义网络模式 安装Docker时,它会自动创建三个网络 ...

  8. Spring Cloud开发实践 - 04 - Docker部署

    Docker的安装和命令可以参考 https://www.cnblogs.com/milton/p/9866963.html . 资源规划 这一步要区分传统资源和Docker资源, 为后面的细节定好基 ...

  9. Kubernetes Docker 容器网络终极之战(十四)

    与 Docker 默认的网络模型不同,Kubernetes 形成了一套自己的网络模型,该网络模型更加适应传统的网络模式,应用能够平滑的从非容器环境迁移到 Kubernetes 环境中. 自从 Dock ...

最新文章

  1. Unity2D游戏开发基础教程1.2项目、资源和场景
  2. Mysql与Sql Server查询数据库中表以及表字段
  3. matlab figure 嵌套,操作Matlab的Figure窗口(一)
  4. 取得数组下标_《零基础C++入门教程》——(8)搞定二维数组与循环嵌套
  5. Python学习笔记:过滤N位数并绘制折线图
  6. VC6.0加载lib文件的三种方法
  7. String ,StringBuilder,StringBuffer的区分
  8. Spark系列-SparkSQL实战
  9. php微博自动评论,新浪微博自动评论工具
  10. 安装SQL server需要重启计算机,解决安装sql server 需要重启问题
  11. Chango的数学Shader世界(十八)RayTrace三维分形(三)—— 完善,距离场软阴影
  12. 什么是企业移动化?以及企业移动化的4大特征
  13. 如何在SQL Server中创建是/否布尔字段?
  14. Python爬虫之使用正则表达式匹配网页内容
  15. shiro的anon部分失效
  16. Java EE 7 Hands-on Lab,CDI deployment failure:WELD-000072,解决办法
  17. 且行且走 (8月24,25日)
  18. JVM垃圾回收器G1详解
  19. 解析光纤跳线的5大知识点,让安装使用更顺畅
  20. matlab离散方波信号,MATLAB - 在ODE15s函数中生成方波信号?(MATLAB - Generate square signal in ODE15s function?)...

热门文章

  1. Oracle基础-ALC权限
  2. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) —— 数据的持久化——使用MongoDB存储爬取的数据
  3. 在线约会其实就是网络泡妞,Meexo 反其道而行为你隐姓埋名
  4. EI检索收录的文献如何下载全文?
  5. [小说]魔王冢(5)格物
  6. Mosquitto 在Linux服务器上的部署过程中以及踩过的坑
  7. WPF教程(六)二进制资源
  8. c语言风光互补运行模式,基于风光互补特性的风电光热电站联合系统容量优化方法与流程...
  9. 虚拟机VM中如何安装图形化界面?
  10. VB.net小技巧——VB中利用TreeView控件和Box控件做知识备忘