docker网络2

Posted 徐中祥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker网络2相关的知识,希望对你有一定的参考价值。

Docker网络2

一.理解Docker0

  • 清空所有环境
# docker rmi -f $(docker images -aq)
# docker rm -f $(docker ps -aq)
  • 测试
# ip addr
6: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:ea:87:87:09 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:eaff:fe87:8709/64 scope link 
       valid_lft forever preferred_lft forever
  • docker 是如何处理网络访问的

1.运行一个容器

# docker run -d -P --name tomcat01 tomcat

2.查看容器的内部网络地址

# docker exec -it tomcat01 ip addr
55: eth0@if56: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever      

说明:
	#发现容器启动的时候会得到一个 eth0@if56 IP地址 是 docker0

3.测试linux能不能 ping 通容器内部

# ping 172.17.0.3
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.311 ms

说明:linux 可以 ping 通 docker 容器内部

4.原理

每启动一个docker容器 docker就会给docker容器分配一个IP

我们只要安装了docker就会有一个网卡docker0

docker 的默认网络模式是桥接模式,使用的技术是 evth-pair技术。
  1. evth-pair?

evth-pair就是一对虚拟设备接口,它们都是成对出现的,一端连着协议,一端彼此相连
正因为有这个特性,evth-pair 充当一个桥梁,连接各种虚拟网络设的。

6.测试容器之间是否可以ping通

# docker exec -it tomcat01 ip a
55: eth0@if56: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
       
# docker exec -it tomcat02 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.103 ms

# 结论:
	 容器和容器之间是可以互相 ping 通的 ,但是不能使用容器的名字 ping

7.网络模型图

在这里插入图片描述
结论:tomcat01和 tomcat02是共用的一个路由器==>docker0 这块网卡。所有的容器不指定网络的情况下都是docker0路由的 dockers会给容器分配一个默认的可用IP

在这里插入图片描述

Docker中的所有网络接口都是虚拟的.虚拟的转发效率高

只要容器删除 对应网桥一对就没了

二.自定义网络

  • docker network 命令
# 命令
		 docker network --help

# 格式
	 Usage:  docker network COMMAND
	 
# 命令
connect     # 将容器连接到网络
create      # 创建一个网络
disconnect  # 断开容器与网络的连接
inspect     # 在一个或多个网络上显示详细信息
ls          # 列出所有网络 
prune       # 删除所有未使用的网络
rm          # 删除一个或多个网络


# create 子命令
		docker network create --help
		
# 格式
	Usage:  docker network create [OPTIONS] NETWORK

# 选项
-d, --driver    # 设置网络模式
--gateway       # 设置网关
--subnet        # 设置网段
  • 查看所有docker网络
# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
f817f380d555   bridge    bridge    local
80a947767e3b   host      host      local
73526c64b2f1   none      null      local
  • 网络模式

1.bridge:桥接模式

2.none:不配置网络

3.host:和宿主机共享网络

4.container:容器网络连通

  • 测试
#  之前直接启动的命令默认加了 --net bridge 参数,就是docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat

# docker0特点:不指定网络模式默认就是 bridge 网络模式。
  • 创建自定义网络
# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
15c5aa7519b03f50130836d09d603400b5cbe074980c443363dda762c9123bc2

# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
15c5aa7519b0   mynet     bridge    local
  • 查看自己定义的网络
[root@docker ~]# docker network inspect mynet 
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
  • 启动容器使用自定义网络
# docker run -d -P --name tomcat01 --net mynet tomcat

# docker run -d -P --name tomcat02 --net mynet tomcat

# docker network inspect mynet   

       "ConfigOnly": false,
        "Containers": {
            "5fa40603324948024abed60145882204caf40e26abfa66294a8f20fb70810951": {
                "Name": "tomcat02",
                "EndpointID": "aaf5100be60508642364d8409fa234844de2e0acccb01139553aa17cd466f058",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            },
            "dc2c7cb028e91ae1bbb3badf8a5ebfe990a522898692112261e4629cae8ea6f6": {
                "Name": "tomcat01",
                "EndpointID": "16397d806a80c5e73a0a315b7eeb6e4a325f83d9bbb47da1e6015215dd6bd691",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            }
  • 测试容器是否能ping通
[root@docker ~]# docker exec -it tomcat01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.081 ms


[root@docker ~]# docker exec -it tomcat01 ping tomcat02
PING tomcat02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.125 ms

# 实现了可以用不同的方式 ping 通网络,也不需要 --link 参数去连接了。

自定义的网络docker都已经帮我们维护好了对应的关系推荐平时这样使用网络

三.不同网络连通

# 创建两个不同网络的容器
[root@docker ~]# docker run -d -P --name tomcat03 tomcat
[root@docker ~]# docker run -d -P --name tomcat04 tomcat


# 把默认网络模式中的容器加入到自定义的网络模式中
[root@docker ~]# docker network connect mynet tomcat04 

# 查看自定义网络
[root@docker ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "15c5aa7519b03f50130836d09d603400b5cbe074980c443363dda762c9123bc2",
        "Created": "2021-04-01T21:34:54.146960861+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": {
            "5fa40603324948024abed60145882204caf40e26abfa66294a8f20fb70810951": {
                "Name": "tomcat02",
                "EndpointID": "aaf5100be60508642364d8409fa234844de2e0acccb01139553aa17cd466f058",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            },
            "638de9e37872902098bce1cf935172b55f497fed24bc81c24756549e56407132": {
                "Name": "tomcat04",
                "EndpointID": "2f7574bc83afff4beed3827811b269878491f4d6d4950bcdd4228cd660370a34",
                "MacAddress": "02:42:c0:a8:00:04",
                "IPv4Address": "192.168.0.4/16",
                "IPv6Address": ""
            },
            "dc2c7cb028e91ae1bbb3badf8a5ebfe990a522898692112261e4629cae8ea6f6": {
                "Name": "tomcat01",
                "EndpointID": "16397d806a80c5e73a0a315b7eeb6e4a325f83d9bbb47da1e6015215dd6bd691",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

# 测试ping通不同网络的容器成功
[root@docker ~]# docker exec -it tomcat01 ping tomcat04
PING tomcat04 (192.168.0.4) 56(84) bytes of data.
64 bytes from tomcat04.mynet (192.168.0.4): icmp_seq=1 ttl=64 time=0.240 ms
64 bytes from tomcat04.mynet (192.168.0.4): icmp_seq=2 ttl=64 time=0.335 ms

连通之后就是将 tomcat04 加入到了mynet网络下

以上是关于docker网络2的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

markdown [Docker] Docker片段列表和命令#linux #docker #snippets

markdown docker-compose片段

sh Docker片段

《Docker 源码分析》全球首发啦!