10-Docker 网络

10-Docker 网络

在这里插入图片描述

基础网络概念

数据传输通过数据包

在这里插入图片描述

两台笔记本之间通信是通过数据包通信的。想知道数据包是怎么打包的呢,就先要知道网络分层的概念。

网络分层

在这里插入图片描述

目前有两种网络分层的模型。

  • ISO/OSI 分层,也就是 7 层模型。
  • TCP/IP 分层,也就是 5 层模型。

TCP/IP 是目前最流行的分层模型。

TCP/IP模型

  • 最底层物理层 也就是 传输介质,像 网线,光纤…
  • 网络接口层,主要是一些网络协议
  • IP 层,这一层比较重要,比如想连接目标,需要目标的ip地址和自身ip地址
  • 传输层,tcp/udp
  • 应用层,主要是应用的协议,如http,ssh…

路由的概念

在这里插入图片描述

我们在地图中搜索一个地点,我们可能获得很多路径,我们从中选择一条路径,这就是现实中的路由概念。

那么在网络中会有路由器帮我们选择哪一条路径进行传输,路由本身涉及很多知识点,不做介绍。

IP地址和路由

在这里插入图片描述

IP地址是唯一标识设备的,如果我们想连接目标地址,那么传输的数据内要包含我们的源地址和目的地址。这样才知道一发一回才知道发给谁。

在这里插入图片描述

我们在访问的过程中,会经过很多路由,比如 电信运行商。

公有IP和私有IP

  • Public IP : 互联网上的唯一标识,可以访问internet
  • Private IP : 不可在互联网上使用,仅供机构内部使用

那么如果我想通过私有IP访问互联网怎么办?这里就需要用到网络地址转换 NAT 技术。

在这里插入图片描述

比如说 校园网,那么这个校园网有一个出口,而且有一个公有的 ip 地址, 学生及老师都是使用私有ip地址,那么当学生或老师访问互联网的时候,会将数据发送到 学校的路由器上,然后路由器会对这条信息做 NAT 地址转换。

转换过程为,NAT 会记录源地址(source)和目标地址(dest),然后转换成公网的ip地址,然后发送出去,当发送回来的时候,NAT 会查询本地存储的表然后转换回内部的私有ip地址。

这里我们要先介绍两个工具 Ping(ICMP)Telnet

  • ping 可以判断IP的可达性
  • telnet 检查服务的可用性,比如一个 web服务器 80/443 端口

案例:

ping www.imooc.com   # 慕课网,这里是不能ping 通的,可能是防火墙的原因

使用telnet

telnet www.imooc.com 80

这里可以成功访问,说明慕课网的这个ip地址是不可达的,但是 80端口的服务是可达的。

实例分析

  1. 创建一个容器

    docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3600; done"
    

busybox 是一个最小化的 linux 镜像。

  1. 进入容器内部

    docker exec -it test1 /bin/sh
    
  2. 查看网络

    $: ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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 lovalid_lft forever preferred_lft forever
    21: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ffinet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever
    

    然后退出

    exit
    

    查看宿主机器的网络

    ip a
    

    此时这里面的网络和刚刚容器内的网络是完全隔离的,原理是通过 linux net namespace 技术进行隔离的

  3. 再次创建一个容器

    docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3600; done"
    
  4. 查看网络

    docker exec test2 ip a
    
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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 lovalid_lft forever preferred_lft forever
    23: eth0@if24: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ffinet 172.17.0.3/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever
    

    我们再次查看一下 test1 容器的ip

    docker exec test1 ip a
    
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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 lovalid_lft forever preferred_lft forever
    21: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ffinet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever
    

    我们可以发现 test1 的 ip 为 172.17.0.2,而 test2 为172.17.0.3

  5. 进入 test1 容器

    docker exec -it test1 /bin/sh
    

    ping test2 容器ip

    ping 172.17.0.3
    

    我们发现可以ping通,说明两个容器之间是网络互通的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11-Docker Bridge详解

11-Docker Bridge详解 容器之间是如何通信的&#xff1f; 操作前删除test2的容器。 查看当前机器上docker的网络 docker network lsNETWORK ID NAME DRIVER SCOPE 056d0ece100f bridge bridge local a…

12-容器之间link

12-容器之间link 这篇主要讲 容器之间如何 link。 需要准备的是&#xff0c;创建两个容器 test1 和 test2 通过 busybox。 在之前的课程中已经创建的只需要重新启动即可。 什么情况下需要link 例如有一个容器是 web 服务器&#xff0c;并且跑在一个docker容器内&#xff0c;…

13-容器的端口映射

13-容器的端口映射 部署一个简单web nginx容器 docker run -d --name web nginxnginx 默认的端口是 80 端口&#xff0c;此时我们是没有办法访问的。 好的&#xff0c;通过前面的学习我们已经知道&#xff0c;这个 web 容器四连接到 bridge 网桥上的&#xff0c;那我们查看一…

14-容器网络之host和none

14-容器网络之host和none 在之前的小节&#xff0c;我们有看到过 host 和 none。 通过 docker network ls 查看。 none 网络 删除 test1 容器 docker stop test1 && docker rm test1创建 test1 容器并连接到none网络 docker run -d --name test1 --network none busy…

15-多容器复杂应用的部署

15-多容器复杂应用的部署 此节主要是通过部署一个复杂的应用场景&#xff0c;进而练习容器的网络相关知识。 创建一个flask-web应用 创建一个 flask-web 文件夹 mkdir flask-web在此文件夹内创建 app.py 文件 cd flask-web touch app.py编写一个简单的 web 程序 import os im…

16-多机器通信

16-多机器通信 回顾上节课的思考题。 flask-redis 想访问 redis&#xff0c;该如何通信&#xff1f; 创建另外一台linux虚拟机 直接拷贝Vagrantfile文件创建一个 centos 虚拟机 我们创建一个centos7-2文件夹&#xff0c;然后创建虚拟机 vagrant up创建的过程中提示选择网络接…

17-Docker的数据持久化介绍

17-Docker的数据持久化介绍 回顾容器与镜像 容器是在镜像之上创建的一层运行时层&#xff0c;这一层是可以读写的&#xff0c;我们能够在容器内添加数据&#xff0c;读取数据。 也就是说我们在创建容器的时候&#xff0c;我们能够在容器内创建文件&#xff0c;安装软件等等&a…

18-数据持久化-Data Volume

18-数据持久化-Data Volume Data Volume 使用场景。一般来讲有些容器自己会产生一些数据&#xff0c;我们不想数据随着容器的销毁而销毁&#xff0c;我们想保存数据&#xff0c;正常一般用在数据库&#xff0c;比如我们想保存数据库中的数据&#xff0c;这个时候我们就会使用 …

19-数据持久化-Bind Mounting

19-数据持久化-Bind Mounting Bind Mounting 与 Data Volume区别 Data Volume 需要在 Dockerfile 内声明需要创建的 volume 目录。 Bind Mounting 则不需要在 Dockerfile 声明 volume&#xff0c;只需要在创建容器的时候&#xff0c;也就是 run 的时候声明即可。 如: dock…

go自定义包教程

go自定义包教程 而是环境为 go version go1.11 linux/amd64linux mint 19 创建一个自定义的包 切换到src目录下&#xff0c;创建demo目录 cd src mkdir demo再创建smap 文件夹 cd demo mkdir smap创建包文件 cd smap touch map.gomap.go文件内容 package smapimport "…

在Linux中对硬盘进行分区、格式化和挂载

在Linux中对硬盘进行分区、格式化和挂载 我最近有一个全新的4-TB硬盘加入我的电脑。所以我需要在Linux中安装它。为此&#xff0c;我需要执行以下操作&#xff1a; 分区格式化挂载检查是否已安装硬盘驱动器 分区 首先&#xff0c;在通过SATA和电源线将硬盘连接到计算机后&am…

Angular gitlab持续集成之runner配置

gitlab持续集成 安装Runner 正常安装 sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64sudo chmod x /usr/local/bin/gitlab-runner sudo useradd --comment GitLab Runner --creat…

javascript编译压缩

javascript编译 js是JavaScript 源码文件&#xff0c; .min.js是压缩版的js文件。 .min.js文件经过压缩&#xff0c;相对编译前的js文件体积较小&#xff0c;传输效率快。经过编码将变量和函数原命名改为毫无意义的命名&#xff0c;以防止他人窥视和窃取 js 源代码 在线版 g…

vscode设置中文

vscode设置中文 当我们安装完成vscode后&#xff0c;会发现它是中文的&#xff0c;因为默认情况下&#xff0c;vscode使用的语言为英文(us)。 那很多同学是不喜欢英文的&#xff0c;不是看不懂&#xff0c;而是不方便哈。 修改语言配置文件 使用快捷键组合【CtrlShiftp】 在…

linux下编译boost

linux下编译boost 下载boot库 官方下载地址 下载完成会解压。 编译 1.进入解压后的文件夹内 cd boost_1_69_0 执行下面的语句 ./bootstrap.sh --with-librariesall --with-toolsetgcc–with-libraries 指定编译哪些boost库&#xff0c;all的话就是全部编译&#xff0c;只想…

C++通过原子变量代替互斥量

C通过原子变量代替互斥量 废话不多说&#xff0c;直接上代码。 实现类似lock_guard功能 #include <atomic> #include <thread>class ClockGuard { public:ClockGuard(std::atomic_flag & atomic):m_lockedFlag(atomic){lock();}~ClockGuard(){unlock();}voi…

conky安装配置

conky安装配置 安装conky sudo apt-get install conky-all修改配置 在主目录下创建’.conkyrc’ 文件内容&#xff1a; # set to yes if you want Conky to be forked in the background background no cpu_avg_samples 2 net_avg_samples 2 out_to_console no # X font w…

Windows子系统安装图形界面

Windows子系统安装图形界面 有很多同学需要使用 linux 系统,但是又不想真正安装一个 linux 系统。于是微软大哥就把 ubuntu 系统集成到 windows 内了&#xff0c;你说 微软 屌不屌&#xff1f; 言归正传。 安装Xlaunch 因为这个是最靠谱的图形化界面了&#xff0c;所以不解…

C++ 判断类是否有某变量

C 判断类是否有某变量 话不多说上代码。 #define HAS_MEMBER(member)\template<typename T, typename... Args>struct has_member_##member\ {\private:\template<typename U> static auto Check(int) -> decltype(std::declval<U>().member(std::declv…

C++将地址转换为字符串

C将地址转换为字符串 有时候在做程序设计的时候&#xff0c;有可能需要做一个类似messageBus的功能&#xff0c;并且需要一个key保证唯一&#xff0c;那么如何实现这个key的唯一呢&#xff1f;大致两种思路: 使用函数签名&#xff0c;因为messagebus绑定的是一个函数&#xf…