ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

八、Docker 网络

2022-06-25 16:34:53  阅读:109  来源: 互联网

标签:-- ping 网络 64 172.17 docker root Docker


1.理解Docker 0

清空实验环境

# 删除所有容器
docker rm -f $(docker ps -aq)
# 删除所有镜像
docker rmi -f $(docker images -aq)

问题: docker 是如何处理容器网络访问的?

# 测试 运行一个alpine
# 查看容器内部网络地址 发现容器启动的时候会得到一个 eth0@if13 ip地址,docker分配!
[root@fedora ~]# docker run -it --name alpine01 alpine
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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 lo
       valid_lft forever preferred_lft forever
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@fedora ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
   ......
   ......
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:b1:ad:28:e2 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
 ......
 # 主机中多出一个网卡与docekr容器相对应
13: veth398a65c@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 62:10:aa:cb:5b:c8 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::6010:aaff:fecb:5bc8/64 scope link 
       valid_lft forever preferred_lft forever
# 思考? linux能不能ping通容器内部? 可以! 
#        容器内部可以ping通外界吗?  可以!

#进入容器
[root@fedora ~]# docker exec -it alpine01 /bin/sh
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
......
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ping 192.168.10.128
PING 192.168.10.128 (192.168.10.128): 56 data bytes
64 bytes from 192.168.10.128: seq=0 ttl=64 time=0.490 ms
64 bytes from 192.168.10.128: seq=1 ttl=64 time=0.206 ms

# 回到Linux
[root@fedora ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) 字节的数据。
64 字节,来自 172.17.0.2: icmp_seq=1 ttl=64 时间=0.137 毫秒
64 字节,来自 172.17.0.2: icmp_seq=2 ttl=64 时间=0.155 毫秒

原理

1、我们每启动一个docker容器,docker就会给docker容器分配一个ip。

我们只要安装了docker,就会有一个 docker 0 。桥接模式,使用的技术是veth-pair技术!

2 、再启动一个容器测试,发现又多了一对网络

docker run -it --name alpine02 /bin/sh

ip addr

我们发现这个容器的网卡,都是一对对的

veth-pair 就是一对的虚拟设备接口,它们都是成对出现的,一端连着协议,一端彼此相连

正因为有这个特性 veth-pair 充当一个桥梁,连接各种虚拟网络设备的

OpenStack,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术

3、测试下alpine01和alpine02是否可以ping通

可以互相ping通!

[root@fedora ~]# docker exec -it alpine02 /bin/sh
/ # ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=4.337 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.221 ms

[root@fedora ~]# docker exec -it alpine01 /bin/sh
/ # ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.247 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.221 ms

结论:alpine01和alpine02共用一个路由器,docker 0

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

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

Docker中所有网络接口都是虚拟的,虚拟的转发效率高(内网传递文件)

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

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

2.--link

[root@fedora ~]# docker exec -it alpine02 ping alpine01
ping: bad address 'alpine01'  # ping不通

# 运行一个alpine03, --link alpine02
[root@fedora ~]# docker run -it --name alpine03 --link alpine02 alpine
# alpine03 ping alpine02,可以ping通
/ # ping alpine02
PING alpine02 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.540 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.188 ms

# alpine02 ping alpine03,ping不通
[root@fedora ~]# docker exec -it alpine02 ping alpine03
ping: bad address 'alpine03'

探究: docker network inspect 网络id 网段相同

[root@fedora ~]# docker inspect alpine03
......
"Links": [
                "/alpine02:/alpine03/alpine02"
            ],
......

查看alpine03里面的/etc/hosts发现有alpine02的配置

[root@fedora ~]# docker exec -it alpine03 cat /etc/hosts
127.0.0.1	localhost
......
......
172.17.0.3	alpine02 032cb6efc4a0
172.17.0.4	a5e81b380663

--link 本质就是在hosts配置中添加映射

现在使用Docker已经不建议使用--link了!

自定义网络,不使用 docker 0 !

docker 0问题:不支持容器名连接访问!

3.自定义网络

docker network --help
connect    -- Connect a container to a network
create     -- Creates a new network with a name specified by the
disconnect -- Disconnects a container from a network
inspect    -- Displays detailed information on a network
ls         -- Lists all the networks created by the user
prune      -- Remove all unused networks
rm         -- Deletes one or more networks
# 查看docker的所有网络
[root@fedora ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
837647f8ed23   bridge    bridge    local
652ac854120d   host      host      local
07e1ea9c8832   none      null      local

网络模式

bridge :桥接 docker(默认,自己创建也是用bridge模式)

none :不配置网络,一般不用

host :和所主机共享网络

container :容器网络连通(用得少!局限很大)

测试

我们直接启动的命令 --net bridge,而这个就是我们的docker0

bridge就是docker0

docker run -d -P --name tomcat01 tomcat 等价于 => docker run -d -P --name tomcat01 --net bridge tomcat

docker0,特点:默认,域名不能访问。 --link可以打通连接,但是很麻烦!

我们可以 自定义一个网络

[root@fedora ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynetwork
f5a9afb1c2d5f51632c0faefa971125d26dc0d187e2c85fba118ae739b1ad9ae
[root@fedora ~]# docker network ls
NETWORK ID     NAME        DRIVER    SCOPE
837647f8ed23   bridge      bridge    local
652ac854120d   host        host      local
f5a9afb1c2d5   mynetwork   bridge    local
07e1ea9c8832   none        null      local
[root@fedora ~]# docker network inspect mynetwork 
[
    {
        "Name": "mynetwork",
        "Id": "f5a9afb1c2d5f51632c0faefa971125d26dc0d187e2c85fba118ae739b1ad9ae",
        "Created": "2022-06-25T15:16:19.081226162+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
......
......

启动两个alpine,再次查看网络情况

[root@fedora ~]# docker run -it --name alpine01 --net mynetwork alpine
[root@fedora ~]# docker run -it --name alpine02 --net mynetwork alpine

[root@fedora ~]# docker exec alpine01  ping alpine02
PING alpine02 (192.168.0.3): 56 data bytes
64 bytes from 192.168.0.3: seq=0 ttl=64 time=0.203 ms
64 bytes from 192.168.0.3: seq=1 ttl=64 time=0.231 ms

[root@fedora ~]# docker exec alpine02 ping alpine01
PING alpine01 (192.168.0.2): 56 data bytes
64 bytes from 192.168.0.2: seq=0 ttl=64 time=0.415 ms
64 bytes from 192.168.0.2: seq=1 ttl=64 time=0.252 ms

# 在自定义的网络下,alpine01和alpine02可以互相ping通,不用使用--link

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

好处:

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

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

4.网络连通

[root@fedora ~]# docker network connect --help
Usage:  docker network connect [OPTIONS] NETWORK CONTAINER
Connect a container to a network
Options:
      --alias strings           Add network-scoped alias for the container
      --driver-opt strings      driver options for the network
      --ip string               IPv4 address (e.g., 172.30.100.104)
      --ip6 string              IPv6 address (e.g., 2001:db8::33)
      --link list               Add link to another container
      --link-local-ip strings   Add a link-local address for the container

测试两个不同的网络连通

再启动两个alpine 使用默认网络,即docker 0

[root@fedora ~]# docker run -it --name alpine03 alpine
[root@fedora ~]# docker run -it --name alpine04 alpine
# 此时03、04与01、02 ping不通

要将alpine03 连通 alpine01 ,连通就是将 alpine03加到 mynetwork网络

一个容器两个ip(alpine03)

[root@fedora ~]# docker network connect mynetwork alpine03
# 可以ping通alpine03
[root@fedora ~]# docker exec alpine01 ping alpine03
PING alpine03 (192.168.0.4): 56 data bytes
64 bytes from 192.168.0.4: seq=0 ttl=64 time=1.056 ms
64 bytes from 192.168.0.4: seq=1 ttl=64 time=0.242 ms
# 无法ping通alpine04
[root@fedora ~]# docker exec alpine01 ping alpine04
ping: bad address 'alpine04'

docker network connect mynetwork alpine03

就是将alpine03放到了mynetwork网络下

[root@fedora ~]# docker network inspect mynetwork 
[
    {
        "Name": "mynetwork",
 ......
 ......
        "ConfigOnly": false,
        "Containers": {
            "2ce3639012bf666250d52c5824ebc4e3e534e82fbd12deca4ea762bc8cd8741a": {
                "Name": "alpine03",
                "EndpointID": "66be1a83216e63df6f09cdb286022438857212c76b1ebdf8a052b260a1cda8f7",
                "MacAddress": "02:42:c0:a8:00:04",
                "IPv4Address": "192.168.0.4/16", # alpine03 的IP地址
                "IPv6Address": ""
            },
          ......
          ......

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

5.实战:部署Redis集群

 

标签:--,ping,网络,64,172.17,docker,root,Docker
来源: https://www.cnblogs.com/simplerude/p/16410902.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有