1.04 docker的网络

栏目: 数据库 · 发布时间: 5年前

内容简介: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:验证服务的可用性
    1.04  <a href='https://www.codercto.com/topics/20577.html'>docker</a> 的网络

3.Linux网络命名空间namespace

1.04 docker的网络
  • 查看后台进程
    1.04 docker的网络
  • 交互运行
    1.04 docker的网络
  • exit退出后,本机也可以查看网络接口,但他们是不同的,是隔离开的,这就是通过namespace实现的网络隔离
    1.04 docker的网络
  • 直接查看容器的网络端口,在本机可以ping通,因为本机也虚拟出了一个网段
    1.04 docker的网络
  • 查看本机的network namespace
    1.04 docker的网络
  • 创建namespace
    1.04 docker的网络
  • 删除namespace
    1.04 docker的网络
  • 再次创建namespace
    1.04 docker的网络
  • 在namespace中执行ip a创建一个回环口
    1.04 docker的网络
  • 查看回环口状态
    1.04 docker的网络
  • 使之变为up状态
    1.04 docker的网络
  • 再次查看回环口状态
    1.04 docker的网络
  • 创建另一个namespace test2
    1.04 docker的网络
  • 添加link,然后查看,多了两个veth的接口
    1.04 docker的网络
  • 查看veth的接口
    1.04 docker的网络
  • 将veth-test1添加到namespace的test1中,然后查看test1中的接口
    1.04 docker的网络
  • 可以在本地查看ip link,本地的veth-test1不见了
    1.04 docker的网络 1.04 docker的网络
  • 将veth-test2添加到namespace的test2中,然后查看test2中的接口
    1.04 docker的网络
  • 然后可以在本地查看ip link,本地的veth-test2不见了
    1.04 docker的网络
  • 为test1和test2分配IP地址
    1.04 docker的网络
  • 此时查看test1和test2,并没有IP
    1.04 docker的网络
  • 开启2个端口
    1.04 docker的网络
  • 再次查看test1和test2
    1.04 docker的网络
  • test1和test2此时已经有IP了
    1.04 docker的网络 1.04 docker的网络
  • test1和test2互相可以ping通
  • 这就是docker底层应用namespace网络隔离的原理
  • 创建容器,就会同时创建一个namespace
    1.04 docker的网络

4.Bridge详解

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

5.容器通信

  • 创建一个container
    1.04 docker的网络
  • 创建另一个container
    1.04 docker的网络
  • 查看进程
    1.04 docker的网络
  • 交互访问test8,然后ping IP和ping 主机名,都是通的
    1.04 docker的网络 1.04 docker的网络 1.04 docker的网络
  • 这里假设,访问test7的mysql,就可以test7:3306
    1.04 docker的网络
  • 反过来,交互运行test7,不能直接ping 主机名,是有方向的
    1.04 docker的网络
  • 查看,停止,删除test8
    1.04 docker的网络

6.端口映射

  • 首先,后台创建并运行一个nginx的container
    1.04 docker的网络
  • 查看进程,nginx默认使用80端口
    1.04 docker的网络
  • 查看网络状况
  • web连接到了bridge上,IP是172.17.0.2
    1.04 docker的网络 1.04 docker的网络
  • 本机可以ping通nginx的container
    1.04 docker的网络
  • 80端口也是可连通的
    1.04 docker的网络
  • 可以查看nginx的欢迎页面
    1.04 docker的网络
  • 停止并删掉刚才的web容器
    1.04 docker的网络
  • 重新创建容器,指定-p参数,将容器的80端口映射到本地的80端口
    1.04 docker的网络
  • 查看进程,已经映射到了本地的80端口
    1.04 docker的网络
  • 此时访问本地的80端口,也会返回nginx欢迎页
    1.04 docker的网络
  • 通过浏览器访问虚拟机IP也可以
    1.04 docker的网络
  • 拓扑图如下,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网络
    1.04 docker的网络
  • 创建新的容器,使用none网络
    1.04 docker的网络
  • 查看none网络,连接了test10
    1.04 docker的网络 1.04 docker的网络
  • 外界查看不到test10的网络
    1.04 docker的网络
  • 进入test10容器,并查看网络,没有对外的接口,是一个孤立的容器
    1.04 docker的网络
  • 应用场景:安全性要求极高,存储绝密数据等
  • 创建新的容器,使用host网络
    1.04 docker的网络
  • 查看host网络,连接了test11
    1.04 docker的网络
  • 进入test11容器,并查看网络,与本机看到的是一样的,与主机共享namespace,类似虚拟机NAT模式
    1.04 docker的网络

8.多容器部署和应用

  • 创建 redis 容器
    1.04 docker的网络
  • 创建并进入目录
    1.04 docker的网络
  • 创建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
    1.04 docker的网络
  • 创建flask容器
    1.04 docker的网络
  • 进入容器,交互执行
    1.04 docker的网络
  • 查看环境变量
    1.04 docker的网络 1.04 docker的网络
  • 直接可以ping redis了
    1.04 docker的网络
  • 多次访问5000端口,实现自增
    1.04 docker的网络 1.04 docker的网络
  • 停止并删掉flask-redis
    1.04 docker的网络
  • 重启启动容器,加-p参数指定端口映射
    1.04 docker的网络
  • 本地也可以访问容器内的服务了
  • 这里的自增1是redis做的,web服务是flask发布的
    1.04 docker的网络 1.04 docker的网络

9.overlay网络和etcd通信

  • etcd是一个开源免费的K-V的分布式存储
    1.04 docker的网络
  • 解压
    1.04 docker的网络
  • 进入解压目录
    1.04 docker的网络
  • 运行如下启动命令,然后回车,后台运行
    1.04 docker的网络 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包
    1.04 docker的网络
  • 解压
    1.04 docker的网络
  • 进入解压目录
    1.04 docker的网络
  • 运行如下启动命令,然后回车,后台运行
    1.04 docker的网络 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集群状态
    1.04 docker的网络
  • 第二台机器也同样执行,检查状态
    1.04 docker的网络
  • 第一台机器停止docker
    1.04 docker的网络
  • 手动后台运行docker,命令执行完打回车
    1.04 docker的网络
  • 第二台机器停止docker
    1.04 docker的网络
  • 手动后台运行docker,命令执行完打回车
    1.04 docker的网络
  • 可以将两个机器都exit退出,然后再重新连接
  • node01中,创建网络,overlay是驱动
    1.04 docker的网络
  • 查看网络,多个demo
    1.04 docker的网络
  • node02中查看网络,也多个demo,两边数据是同步的,etcd实现的
    1.04 docker的网络
  • node01中查看etcd记录的信息,最终看到id与创建network产生的id一致
    1.04 docker的网络 1.04 docker的网络 1.04 docker的网络 1.04 docker的网络
  • 可以查看网络的基本信息
    1.04 docker的网络
  • node01中创建容器
    1.04 docker的网络
  • 此时将命令复制到node02运行,会直接报错,说test12已经存在
    1.04 docker的网络
  • node02中重新创建,改名为test13
    1.04 docker的网络 学院 Go 语言视频主页
    https://edu.csdn.net/lecturer/1928

[清华团队带你实战区块链开发]

( https://ke.qq.com/course/344443?tuin=3d17195d )

扫码获取海量视频及源码 QQ群:

721929980

1.04 docker的网络

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

CSS揭秘

CSS揭秘

[希] Lea Verou / CSS魔法 / 人民邮电出版社 / 2016-4 / 99.00元

本书是一本注重实践的教程,作者为我们揭示了 47 个鲜为人知的 CSS 技巧,主要内容包括背景与边框、形状、 视觉效果、字体排印、用户体验、结构与布局、过渡与动画等。本书将带领读者循序渐进地探寻更优雅的解决方案,攻克每天都会遇到的各种网页样式难题。 本书的读者对象为前端工程师、网页开发人员。一起来看看 《CSS揭秘》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具