内容简介:app = Flask(redis = Redis(host=os.environ.get(‘REDIS_HOST’, ‘127.0.0.1’), port=6379)@app.route(’/’)
1.网络分类
2.网络基础
- 网络地址转换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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 2019网络重构趋势展望:网络AI化加速 5G驱动网络新变革
- 网络编程——打开网络库
- python网络爬虫之初始网络爬虫
- 万人直播网络架构与CDN网络
- 深度网络揭秘之深度网络背后的数学
- 深入浅出Kubernetes网络:容器网络初探
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。