前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker网络

Docker网络

作者头像
李昂君
发布2021-12-24 18:39:20
4630
发布2021-12-24 18:39:20
举报
文章被收录于专栏:李昂君

阅读量: 503

本地网络信息

三个网络,分别代表不同的环境

一、问题

1. docker网络是如何处理容器网络访问的?
代码语言:javascript
复制
//运行一个 tomcat 实例,测试看看
docker run -d -P --name tomcat01 tomcat

查看容器的Ip地址

代码语言:javascript
复制
docker exec -it tomcat01 ip addr

查看宿主主机是否能ping通容器

通过测试,宿主主机可以ping通容器!!!

查看容器是否能ping通外面的网络

通过测试,容器内可以ping通:“内网、docker0”网络地址!!!

网络的互通,思路如下:

细心的同学,可能发现,tomcat01的网络地址是172.17.0.2,而docker0的网络地址是172.17.0.1,由此可以得出它们在同一个网段

还有就是容器和容器之间是可以互相ping通的

绘制网络模型图

tomcat01和tomcat02是共用一个路由器,docker0。

所有容器不指定网络的情况下,都是docker0路由器,docker会给我们的容器分配一个默认可用IP

科普网络基础知识

一、网络地址

IP地址由网络号(包括子网号)和主机号组成,网络地址的主机号为全0,网络地址代表着整个网络。

二、广播地址

广播地址通常称为直接广播地址,是为了区分受限广播地址。

广播地址与网络地址的主机号正好相反,广播地址中,主机号为全1。当向某个网络的广播地址发送消息时,该网络内的所有主机都能收到该广播消息。

三、组播地址

D类地址就是组播地址。

先回忆下A,B,C,D类地址吧:

A类地址以0开头,第一个字节作为网络号,地址范围为:0.0.0.0~127.255.255.255;(modified @2016.05.31)

B类地址以10开头,前两个字节作为网络号,地址范围是:128.0.0.0~191.255.255.255;

C类地址以110开头,前三个字节作为网络号,地址范围是:192.0.0.0~223.255.255.255。

D类地址以1110开头,地址范围是224.0.0.0~239.255.255.255,D类地址作为组播地址(一对多的通信);

E类地址以1111开头,地址范围是240.0.0.0~255.255.255.255,E类地址为保留地址,供以后使用。

注:只有A,B,C有网络号和主机号之分,D类地址和E类地址没有划分网络号和主机号。

四、回环地址

127.0.0.0/8被用作回环地址,回环地址表示本机的地址,常用于对本机的测试,用的最多的是127.0.0.1。

五、A/B/C/D 类私有地址

私有地址(private address)也叫专用地址,它们不会在全球使用,只具有本地意义。

A类私有地址:10.0.0.0/8,范围是:10.0.0.0~10.255.255.255

B类私有地址:172.16.0.0/12,范围是:172.16.0.0~172.31.255.255

C类私有地址:192.168.0.0/16,范围是:192.168.0.0~192.168.255.255

Docker中的 –link

思考一个场景,我们编写了一个微服务,database url=ip,项目不重启,数据库ip换掉了,我们希望可以处理这个问题,可以用名称来进行访问容器吗?

代码语言:javascript
复制
root@liang:/home/joila# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
44a4e3e12a05        tomcat              "catalina.sh run"   5 seconds ago       Up 4 seconds        0.0.0.0:32770->8080/tcp   tomcat02
3a8958037482        tomcat              "catalina.sh run"   16 hours ago        Up 16 hours         0.0.0.0:32769->8080/tcp   tomcat01
root@liang:/home/joila# docker exec -it tomcat02 ping tomcat01

ping: tomcat01: Name or service not known

# 如何可以解决这个问题呢?

通过 –link 命令 实现 连接

代码语言:javascript
复制
# 通过 --link 就可以解决网络连通问题
root@liang:/home/joila# docker run -d -P --name tomcat03 --link tomcat02 tomcat
c434b500fd9b34e61d6eb6e5758e550c5d42559687d433ebb860db9ac33b1841
root@liang:/home/joila# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.081 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.048 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.079 ms
代码语言:javascript
复制
# 通过命令查看 link信息
root@liang:/home/joila# docker inspect tomcat03

通过查看 host配置,探究原理

本质探究:

–link 就是我们咋 hosts配置中增加了一个 172.18.0.3 tomcat02 44a4e3e12a05

我们现在在实际操作Docker网络中,不建议使用 –link !!

如何自定义网络?

一、查看所有的Docker网络

1. 网络模式

模式

描述

bridge

桥接docker(默认)

none

不配置网络

host

和宿主主机共享网络

container

容器网络连通(用的少,局限很大)

二、自定义一个网络

代码语言:javascript
复制
# 查看网络的帮助说明
docker network --help
1. 创建一个桥接网络
代码语言:javascript
复制
# 查看创建桥接网络的帮助说明
docker network create --help

我们自定义创建网络的命令

代码语言:javascript
复制
# --driver    模式
# --subnet    子网
# --gateway    网关

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
代码语言:javascript
复制
# 探究刚刚创建的自定义网络的详细信息
docker network inspect mynet
代码语言:javascript
复制
# 启动两个容器并关联网络模式,进行测试
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat
代码语言:javascript
复制
# 再次探究自定义网络的详细信息
docker network inspect mynet

不使用 –link,也可以ping容器名称了!

我们自定义的网络,docker都已经帮我们维护好了对应的关系,所以在平时业务场景中,推荐这样使用docker网络!

三、优势

服务

好处

redis集群

不同的集群使用不同的网络,保证集群是安全和健康的!

mysql集群

不同的集群使用不同的网络,保证集群是安全和健康的

自定义网络如何连通不同网段?

一、测试

代码语言:javascript
复制
# 启动两个容器,且网络模式默认的docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat02 tomcat

测试 tomcat01 是否可以 ping 通 tomcat-net-02

结果:两个容器不在同一个网段,ping是肯定肯定不会通的

二、打通两个不同网段的容器

代码语言:javascript
复制
# 查看连通帮助文档
docker network connect --help

实现 tomcat01 打通 mynet网络模式

代码语言:javascript
复制
docker network connect mynet tomcat01

打通后,术语就是:一个容器,两个ip地址

测试是否ping的通

结论:假设要跨网操作别的网段,就需要使用 docker network connect 连通

打通的模型图

结论

Docker使用的是Linux的桥接,宿主主机中是一个Docker容器的网桥 docker0

Docker中的所有网络接口是虚拟的。虚拟的转发效率高(内网传递数据)!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-2-24 1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本地网络信息
    • 一、问题
      • 1. docker网络是如何处理容器网络访问的?
  • 绘制网络模型图
  • 科普网络基础知识
    • 一、网络地址
      • 二、广播地址
        • 三、组播地址
          • 四、回环地址
            • 五、A/B/C/D 类私有地址
            • Docker中的 –link
            • 如何自定义网络?
              • 一、查看所有的Docker网络
                • 1. 网络模式
              • 二、自定义一个网络
                • 1. 创建一个桥接网络
              • 三、优势
              • 自定义网络如何连通不同网段?
                • 一、测试
                  • 二、打通两个不同网段的容器
                  • 结论
                  相关产品与服务
                  容器服务
                  腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档