1.04 docker的网络
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的网络相关推荐
- 单一docker主机网络
一. 容器网络模型: Docker定义了一个非常简单的网络模型,叫做container network model(CNM).如下图所示: CNM模型有三个元素---sandbox, endpoint ...
- docker容器网络及其配置
docker容器网络及其配置 文章目录 docker容器网络及其配置 虚拟化网络 单主机与多主机的Docker网络 单节点容器间通信 不同节点容器间通信 Docker网络驱动 选择Docker网络驱动 ...
- Docker容器网络实例管理
Docker容器网络实例管理 Linux内核实现名称空间的创建 ip netns命令 可以借助ip netns命令来完成对 Network Namespace 的各种操作.ip netns命令来自于i ...
- docker的网络架构配置
http://xiaorenwutest.blog.51cto.com docker 网络架构模 默认情况下,容器可以建立到外部网络的连接,但是外部网络无法连接到容器 ...
- docker(4)docker的网络,自定义网桥
Docker 的网络 运行 ifconfig 找到 docker0 : 虚拟网卡默认网卡名称为docker0 查看docker 的网桥: 我这里默认们没有进行安装 网桥管理设备:进行安装一下: yum ...
- 手工模拟实现 Docker 容器网络!
大家好,我是飞哥! 如今服务器虚拟化技术已经发展到了深水区.现在业界已经有很多公司都迁移到容器上了.我们的开发写出来的代码大概率是要运行在容器上的.因此深刻理解容器网络的工作原理非常的重要.只有这样将 ...
- Docker(十四):Docker:网络模式详解
Docker作为目前最火的轻量级容器技术,牛逼的功能,如Docker的镜像管理,不足的地方网络方面. Docker自身的4种网络工作方式,和一些自定义网络模式 安装Docker时,它会自动创建三个网络 ...
- Spring Cloud开发实践 - 04 - Docker部署
Docker的安装和命令可以参考 https://www.cnblogs.com/milton/p/9866963.html . 资源规划 这一步要区分传统资源和Docker资源, 为后面的细节定好基 ...
- Kubernetes Docker 容器网络终极之战(十四)
与 Docker 默认的网络模型不同,Kubernetes 形成了一套自己的网络模型,该网络模型更加适应传统的网络模式,应用能够平滑的从非容器环境迁移到 Kubernetes 环境中. 自从 Dock ...
最新文章
- Unity2D游戏开发基础教程1.2项目、资源和场景
- Mysql与Sql Server查询数据库中表以及表字段
- matlab figure 嵌套,操作Matlab的Figure窗口(一)
- 取得数组下标_《零基础C++入门教程》——(8)搞定二维数组与循环嵌套
- Python学习笔记:过滤N位数并绘制折线图
- VC6.0加载lib文件的三种方法
- String ,StringBuilder,StringBuffer的区分
- Spark系列-SparkSQL实战
- php微博自动评论,新浪微博自动评论工具
- 安装SQL server需要重启计算机,解决安装sql server 需要重启问题
- Chango的数学Shader世界(十八)RayTrace三维分形(三)—— 完善,距离场软阴影
- 什么是企业移动化?以及企业移动化的4大特征
- 如何在SQL Server中创建是/否布尔字段?
- Python爬虫之使用正则表达式匹配网页内容
- shiro的anon部分失效
- Java EE 7 Hands-on Lab,CDI deployment failure:WELD-000072,解决办法
- 且行且走 (8月24,25日)
- JVM垃圾回收器G1详解
- 解析光纤跳线的5大知识点,让安装使用更顺畅
- matlab离散方波信号,MATLAB - 在ODE15s函数中生成方波信号?(MATLAB - Generate square signal in ODE15s function?)...
热门文章
- Oracle基础-ALC权限
- [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) —— 数据的持久化——使用MongoDB存储爬取的数据
- 在线约会其实就是网络泡妞,Meexo 反其道而行为你隐姓埋名
- EI检索收录的文献如何下载全文?
- [小说]魔王冢(5)格物
- Mosquitto 在Linux服务器上的部署过程中以及踩过的坑
- WPF教程(六)二进制资源
- c语言风光互补运行模式,基于风光互补特性的风电光热电站联合系统容量优化方法与流程...
- 虚拟机VM中如何安装图形化界面?
- VB.net小技巧——VB中利用TreeView控件和Box控件做知识备忘