二、--link与自定义网络

时间:2021-09-27
本文章向大家介绍二、--link与自定义网络,主要包括二、--link与自定义网络使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
--link(不推荐使用)
思考一个场景,我们编写了一个微服务,项目不重启,数据库ip换掉了,我们希望可以处理这个问题,可以用名字来访问?
1.启动两个容器如下
[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
79bec4d5841a        centos              "/bin/bash"         28 minutes ago      Up 28 minutes                           centos02
95937ebb5ce8        centos              "/bin/bash"         29 minutes ago      Up 29 minutes                           centos01
[root@docker ~]# docker exec -it centos01 ping centos02
ping: centos02: Name or service not known
我们发现不能ping通:
解决办法--link即可解决连接问题,但是反向连接不能ping通
[root@docker ~]# docker run -d -it --name centos03 --link centos01 --link centos02 centos
ed7e71239e34507cd1aa32590df51f0a0fdc335d7d9ef6503c170197fb1ab92e
[root@docker ~]# docker exec -it centos03 ping centos01
PING centos01 (172.17.0.2) 56(84) bytes of data.
64 bytes from centos01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.055 ms
64 bytes from centos01 (172.17.0.2): icmp_seq=2 ttl=64 time=0.043 ms
可以查看网卡信息
[root@docker ~]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "219769a742011931a0b08b03fc00f6135ad1bcabce1cfa93bc68902b532a2a3b",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "79bec4d5841a7f4bba483e0a0107383eea759d863ade5c6bf0d2c7cdf5693950": {
                "Name": "centos02",
                "EndpointID": "0e862a4d7bd09adaed475d9844af2d72a07a412b72534bfdac107af42b9991ef",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "95937ebb5ce8d7571232306218f44d7da65dc6e9aa8b901e8c156315199ec759": {
                "Name": "centos01",
                "EndpointID": "4ed26158cd299b9d834e9b90142e1131e62f0c107124f7c4babd54fa3fa58962",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "ed7e71239e34507cd1aa32590df51f0a0fdc335d7d9ef6503c170197fb1ab92e": {
                "Name": "centos03",
                "EndpointID": "a2eacc59f98083eccfa2ce4f8b00f7d311ab056cd0118b0bdbaad0c88cbbbcf5",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
探索 inspect
其实这个centos03就是配置了centos01-02的配置
#查看hosts配置, 在这里原理发现
[root@docker ~]# docker exec -it centos03 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.2    centos01 95937ebb5ce8
172.17.0.3    centos02 79bec4d5841a
172.17.0.4    ed7e71239e34
本质探究:--link操作就是在hosts配置中增加了一个centos01-2的映射
在真实项目中已经不建议使用--link了
在实际中我们采用自定义网络,不使用docker0
docker的问题:它不支持容器名连接访问
自定义网络
[root@docker ~]# docker network ls #查看所有网卡
docker network rm   删除网卡
[root@docker ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
219769a74201        bridge              bridge                local               
f6b9d84b1f81         host                  host                   local               
47132fb890ac         none                 null                    local
网络模式
bridge :桥接(默认,自己创建网络也推荐使用bridge模式)
none:     不配置网络
host:       和宿主机共享网络
container: 容器网络连通!(使用较少!局限性很大)
测试:
#我们直接启动的命令  --network bridge  ,而这个就是我们的docker0
[root@docker ~]#  docker run -d -P --name centos1 --network bridge centos
#docker0 :默认,域名不能访问,使用--link可以打通连接
#我们可以自定义一个网络
[root@docker ~]# docker network create --help  #帮助命令查看
[root@docker ~]#  docker network create --driver bridge --subnet 192.168.1.0/24 --gateway 192.168.1.1 mynet
2bb4bf4c05391ed5349957522374d4e0a1043b3767f3fa7fe15a6f8754437e0b
[root@docker ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
219769a74201        bridge              bridge              local               
f6b9d84b1f81        host                host                local               
2bb4bf4c0539        mynet               bridge              local               
47132fb890ac        none                null                local  
参数讲解:
--driver bridge :指定模式为桥接
--subnet:          子网地址
--gateway:       网关
[root@docker ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "2bb4bf4c05391ed5349957522374d4e0a1043b3767f3fa7fe15a6f8754437e0b",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.1.0/24",
                    "Gateway": "192.168.1.1"
                }
            ]
        },
        "Internal": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
至此我们自己的网络就创建好了
接下来启动两个容器测试:
[root@docker ~]# docker run -d -it -P --name cenos01  --network mynet centos
0f928c84f9f4615e432198d78a5e72062334041117b5b74ce66e327422dc6f78
[root@docker ~]# docker run -d -it -P --name cenos02  --network mynet centos
6dcaf8d1698263309bb87d5f535981679e73958f7cb63d2fe69a9a3fa74d6808
[root@docker ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "2bb4bf4c05391ed5349957522374d4e0a1043b3767f3fa7fe15a6f8754437e0b",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.1.0/24",
                    "Gateway": "192.168.1.1"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "0f928c84f9f4615e432198d78a5e72062334041117b5b74ce66e327422dc6f78": {
                "Name": "cenos01",
                "EndpointID": "c6a6451c319156074642e6c26d7305977c7619bd5fe3faeac1bab656dc7c81e5",
                "MacAddress": "02:42:c0:a8:01:02",
                "IPv4Address": "192.168.1.2/24",
                "IPv6Address": ""
            },
            "6dcaf8d1698263309bb87d5f535981679e73958f7cb63d2fe69a9a3fa74d6808": {
                "Name": "cenos02",
                "EndpointID": "9346da6d8559ae555dd47a40e4f2c56e8d59f7b7d2fba674ec95f1eaac26d9ba",
                "MacAddress": "02:42:c0:a8:01:03",
                "IPv4Address": "192.168.1.3/24",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
#再次测试ping连接不使用--link也可以ping名字ping通
[root@docker ~]# docker exec -it cenos01 ping cenos02
PING cenos02 (192.168.1.3) 56(84) bytes of data.
64 bytes from cenos02.mynet (192.168.1.3): icmp_seq=1 ttl=64 time=0.045 ms
64 bytes from cenos02.mynet (192.168.1.3): icmp_seq=2 ttl=64 time=0.047 ms
64 bytes from cenos02.mynet (192.168.1.3): icmp_seq=3 ttl=64 time=0.070 ms
我们 自定义的网络docker都已经帮我们维护好了对应的关系推荐使用自定义网络
好处:保证不同的集群使用不同的网络,保证集群是安全和健康的

原文地址:https://www.cnblogs.com/momo6656/p/15342975.html