Docker学习-Network网络

  • 一、网络介绍
    • 1.三种网络地址
    • 2.Docker四种网络模式
    • 3.网桥相关命令
  • 二、Docker0网络验证和使用
    • 1.Docker容器默认网络docker0
    • 2.使用`--link`建立DNS域名映射
  • 三、自定义网络
    • 1.自定义`bridge`网络
    • 2.使用`host`网络模式
    • 3.使用`container`网络模式
  • 四、建立不同网络间的通信
    • 1.使用`docker network connec`建立网络连通

一、网络介绍

1.三种网络地址

宿主机三种网络地址

[root@iZuf60iq1x5h6s5apkzxd3Z /]# ip addr
# 本地回环地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
# 阿里云内网地址
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:16:3e:25:ef:d9 brd ff:ff:ff:ff:ff:ffinet 172.24.4.239/18 brd 172.24.63.255 scope global dynamic eth0valid_lft 312342548sec preferred_lft 312342548sec
# docker网络地址(可以看做是路由器)
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:ab:70:8d:3b brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft forever

2.Docker四种网络模式

Docker四种网络模式

[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
02b628036c16   bridge    bridge    local
f6a22701c9de   host      host      local
aa6b4ac0c17d   none      null      local# bridge: 桥接docker(默认,自己创建也使用bridge方式)
# none: 不配置网络
# host: 和宿主机共享网络
# container: 容器网络连通!(用的少!局限很大)

3.网桥相关命令

网桥命令

# 安装网桥工具包
yum install bridge-utils -y# 查看网桥状态
brctl show# 卸载网桥上的端口
brctl delif <网桥名> <端口名># 查看是否有网桥网卡名
ifconfig# 关闭此网卡
ifconfig <网桥名> down# 删除网桥
brctl delbr <网桥名>

二、Docker0网络验证和使用

1.Docker容器默认网络docker0

# 1.启动tomcat01容器
$ sudo docker run -d -P --name tomcat01 tomcat# 2.查看容器内部网络地址 `ip addr`,发现容器启动的时候会得到一个 `48: eth0@if49` ip地址,docker分配的~
[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
48: eth0@if49: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.2/16 brd 172.17.255.255 scopeglobal eth0valid_lft forever preferred_lft forever# 3.思考linux能不能ping通容器内部
[root@iZuf60iq1x5h6s5apkzxd3Z /]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.077 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.056 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.057 ms
# linux可以ping通docker容器内部的原理
# 解答:我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术!# 4.再次查看网络情况
[root@iZuf60iq1x5h6s5apkzxd3Z /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:16:3e:25:ef:d9 brd ff:ff:ff:ff:ff:ffinet 172.24.4.239/18 brd 172.24.63.255 scope global dynamic eth0valid_lft 312341407sec preferred_lft 312341407sec
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ab:70:8d:3b brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft forever
49: veth4625e1d@if48: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether a6:f9:9c:0e:cc:45 brd ff:ff:ff:ff:ff:ff link-netnsid 0
# 我们发现这个容器的网卡,都是一对一对的
# evth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连
# 正因为有这个特性,evth-pair 充当一个桥梁,连接各种虚拟网络设备的
# OpenStak、Docker容器之间的连接,OVP的连接,都是使用evth-pair技术。# 5.测试容器之间可以ping通
[root@iZuf60iq1x5h6s5apkzxd3Z /]# sudo docker run -d -P --name tomcat02 tomcat
0fcbbefa9b6d39a71d25402181ef6001166116b487bda4f03dcffda629442547
[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker exec -it tomcat01 ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.054 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.059 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.052 ms
# tomcat01和tomcat02是公用的一个路由器docker0
# 所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP# 6.结论:
# docker网络,是通过linux建立虚拟网卡,通过veth-pair技术实现容器间的通行。中间桥接使用的docker0

2.使用--link建立DNS域名映射

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

# 1.使用容器名ping不同
[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker exec -it tomcat01 ping tomcat02
ping: tomcat02: Name or service not known
# 如何可以解决呢?# 2.通过`--link` 就可以解决网络连通问题
[root@iZuf60iq1x5h6s5apkzxd3Z /]# sudo docker run -d -P --name tomcat03 --link tomcat02 tomcat
4b3aa3654e8023f11cf04cda6da2093c8b655526a7d55064398985c9f7445575
[root@iZuf60iq1x5h6s5apkzxd3Z /]# 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.136 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.073 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.073 ms# 3.反向可以tomcat03来ping tomcat02通么?
[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known

2.探究tomcat03为什么可以ping通tomcat02?

# 1.查看 tomcat03中hosts配置,在这里发现!
[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3  tomcat02 0fcbbefa9b6d
172.17.0.4  4b3aa3654e80# 2.本质探究:--link 就是我们在hosts配置中添加了一个绑定关系。
172.17.0.3  tomcat02 0fcbbefa9b6d
# 我们现在玩Docker已经不建议使用--link
# docker0特点:默认,域名不能访问(它不支持容器名连接访问!),--link可以打通连接!

三、自定义网络

1.自定义bridge网络

1.我们可以自定义一个网络--driver bridge

[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
9c69225f24dbab546d89b4dda5280965fbaea7c37a9547cdd851b745b8b308fe
[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
02b628036c16   bridge    bridge    local
f6a22701c9de   host      host      local
9c69225f24db   mynet     bridge    local
aa6b4ac0c17d   none      null      local

2.查看自己创建网络的信息

[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker network inspect 9c69225f24db
[{"Name": "mynet","Id": "9c69225f24dbab546d89b4dda5280965fbaea7c37a9547cdd851b745b8b308fe","Created": "2021-07-15T16:45:33.129988644+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "192.168.0.0/16","Gateway": "192.168.0.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {},"Options": {},"Labels": {}}
]

3.使用自己的网络启动容器

$ docker run -d -P --name tomcat-net01 --net mynet tomcat
$ docker run -d -P --name tomcat-net02 --net mynet tomcat

4.再次查看网络信息

[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker network inspect 9c69225f24db
[{"Name": "mynet","Id": "9c69225f24dbab546d89b4dda5280965fbaea7c37a9547cdd851b745b8b308fe","Created": "2021-07-15T16:45:33.129988644+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "192.168.0.0/16","Gateway": "192.168.0.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"0051c8e47cca2f3d58ea75ffbe33a56c287e864043fc3a168fc54a68ccc2be32": {"Name": "tomcat-net02","EndpointID": "e35641a3bdfe8f5cf80e0d9f09804e9591e945d2f9257aae51fc09632efbb1c4","MacAddress": "02:42:c0:a8:00:03","IPv4Address": "192.168.0.3/16","IPv6Address": ""},"9fd768faec08b2e31cc93d0d153fbd8a9495dc8663fcd7d0516f53571f07fd23": {"Name": "tomcat-net01","EndpointID": "135d862e55a90ceb10870622977d4f010edd188c7ffdb3feec394e0eeae3356a","MacAddress": "02:42:c0:a8:00:02","IPv4Address": "192.168.0.2/16","IPv6Address": ""}},"Options": {},"Labels": {}}
]

5.再次测试容器间的连接

# 不使用--link也可以容器间使用容器名称来连接
[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker exec -it tomcat-net01 ping tomcat-net02
PING tomcat-net02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.083 ms
64 bytes from tomcat-net02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.086 ms

6.总结:自定义网络的好处:不同集群使用不同的网络,保证集群是安全和健康的

2.使用host网络模式

使用host网络

docker run --name test_host --network host -d tomcat /bin/bash

3.使用container网络模式

使用container网络

# 启动test1容器
docker run --name test1 -d tomcat /bin/bash
# 使用container模式
docker run --name test_container --network container:test1 -d tomcat /bin/bash

四、建立不同网络间的通信

1.使用docker network connec建立网络连通

1.新建两个默认网络容器

[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker run -d -P --name tomcat01 tomcat
8fd080d7806c21fa3b0af81d1ef4b1bcda4560fef6ce7ac37b76121e32360f28
[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker run -d -P --name tomcat02 tomcat
f34b856bd77bf3af5da6418ba17e6146c53f77b8d03557aab3ea8e138c570b3a

2.在tomcat01容器中pingtomcat-net01

[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker exec -it tomcat01 ping tomcat-net01
ping: tomcat-net01: Name or service not known

3.建立网络连接 docker network connect [可选项] 网络 容器

[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker network connect mynet tomcat01
[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker network inspect mynet
[{"Name": "mynet","Id": "9c69225f24dbab546d89b4dda5280965fbaea7c37a9547cdd851b745b8b308fe","Created": "2021-07-15T16:45:33.129988644+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "192.168.0.0/16","Gateway": "192.168.0.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"0051c8e47cca2f3d58ea75ffbe33a56c287e864043fc3a168fc54a68ccc2be32": {"Name": "tomcat-net02","EndpointID": "e35641a3bdfe8f5cf80e0d9f09804e9591e945d2f9257aae51fc09632efbb1c4","MacAddress": "02:42:c0:a8:00:03","IPv4Address": "192.168.0.3/16","IPv6Address": ""},"8fd080d7806c21fa3b0af81d1ef4b1bcda4560fef6ce7ac37b76121e32360f28": {"Name": "tomcat01","EndpointID": "13cb8bb7106a2007f3d7dc307398dd3c3b95cb024b46db0b4ce5ac74f227501b","MacAddress": "02:42:c0:a8:00:04","IPv4Address": "192.168.0.4/16","IPv6Address": ""},"9fd768faec08b2e31cc93d0d153fbd8a9495dc8663fcd7d0516f53571f07fd23": {"Name": "tomcat-net01","EndpointID": "135d862e55a90ceb10870622977d4f010edd188c7ffdb3feec394e0eeae3356a","MacAddress": "02:42:c0:a8:00:02","IPv4Address": "192.168.0.2/16","IPv6Address": ""}},"Options": {},"Labels": {}}
]# 本质就是在网络中添加tomcat01的容器
# 官方说的就是:一个容器两个ip地址(公网ip+私网ip)

4.再次尝试tomcat01连接tomcat-net01

[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker exec -it tomcat01 ping tomcat-net01
PING tomcat-net01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.081 ms
64 bytes from tomcat-net01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.069 ms

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

Docker学习-Network网络相关推荐

  1. Docker学习之网络篇

    Docker 中的网络功能介绍 Docker 允许通过外部访问容器或容器互联的方式来提供网络服务. 外部访问容器 容器中运行的网络应用,外部要访问这些应用.可以通过-P 或 -p 参数指定端口映射. ...

  2. Docker学习四:Docker 网络

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  3. Docker 学习笔记 - 进阶四 Docker网络和 Docker compose

    Docker 学习笔记 - 进阶四 Docker网络和 Docker compose 4. docker 网络 4.1 docker network是什么 4.1.1 docker不启动,默认网络情况 ...

  4. Docker学习:容器五种(3+2)网络模式 | bridge模式 | host模式 | none模式 | container 模式 | 自定义网络模式详解

    前言 本讲是从Docker系列讲解课程,单独抽离出来的一个小节,重点介绍容器网络模式, 属于了解范畴,充分了容器的网络模式,更有助于更好的理解Docker的容器之间的访问逻辑. 疑问:为什么要了解容器 ...

  5. docker学习笔记(三)docker中的网络

    目录 Linux中的网卡 Network Namespace Docker中的Bridge网络 使用自定义Bridge网络创建容器 Container中的其他网络 Host网络 None网络 Linu ...

  6. 套娃的开始——Network in Network网络学习笔记

    前言 <Network in Network>是2014年ICLR的一篇文章,文章当时较为创新,对后面的一些模型产生了一些较为深远的影响,现在看来,尽管文章较为久远,仍不失为经典论文,对现 ...

  7. Docker 网络(十一)——Docker Multi-host Network

    11 Docker Multi-host Network Docker 多主机网络使用基于VXLAN解决方案在libnetwork和libkv库的基础上,所以这个重叠网络需要一个有效的键-值存储服务在 ...

  8. 网络表示学习Network Representation Learning/Embedding

    网络表示学习Network Representation Learning/Embedding 网络表示学习相关资料 网络表示学习(network representation learning,NR ...

  9. Docker学习之路(三)Docker网络详解

    1. Docker的4种网络模式 我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: host模式,使用--net=host ...

最新文章

  1. 点击按钮显示谷歌地图
  2. vi (vim) 常用命令
  3. 菜菜sklearn——XGBoost(2)
  4. 20210621 数学上的距离和空间
  5. 简述使用REST API 的最佳实践
  6. 企业级应用架构(三)三层架构之数据访问层的改进以及测试DOM的发布
  7. 打破牢笼,展望更高层次的世界
  8. linux mint 18.3浏览器,在Ubuntu 18.04/Linux Mint 19中安装Chromium浏览器的方法
  9. 零基础带你学习计算机网络复习—(五)
  10. html加载js那些事
  11. Silverlight 4常用StringFormat格式总结(转)
  12. 安全扫描工具 Netsparker
  13. VS2008 ---- VS2013各个版本下载地址
  14. Java的三种技术架构是什么?
  15. 运动重构(SFM)学习笔记一
  16. python怎么判断质数和合数_什么是质数和合数以及判断方法介绍
  17. php页眉,phpword页眉页脚
  18. python实现pdf转换成图片
  19. 计算机毕业设计(附源码)python疫情防控管理系统
  20. css中只读,是否可以通过CSS将输入字段设置为只读?

热门文章

  1. 第二章第一节 能把梳子卖给和尚吗
  2. 电子邮箱有哪些类型,2020什么邮箱最火爆?
  3. cta计算机,2.5 CTA:一种实际的并行计算机模型
  4. 一点就懂的经典十大排序算法
  5. linux 系统修复模式
  6. SpringBoot+JPA 启动建表错误:CommandAcceptanceException: Error executing DDLalter table X drop foreign key
  7. The Tree (AVL, 2-3-, 红黑,Huffman)
  8. Demo:超市管理系统(python)
  9. Ta来了,Ta来了,Spark基础能力测试题Ta来了!
  10. 互联网早报:UP主首款桌面创作工具,不咕剪辑专业版公测开启