Docker网络管理机制实例解析+创建自己Docker网络

来源:互联网 发布:淘宝达人cps是什么意思 编辑:程序博客网 时间:2024/06/08 09:23

实例解析Docker网络管理机制(bridge network,overlay network),介绍Docker默认的网络方式,并创建自己的网络桥接方式,将开发的容器添加至自己新建的网络,提高Docker网络安全和通信.

1.给自己的docker (Dcoker1.12GA)容器起个名称

给docker名称的好处是: 
- 容易记 
- 可以通过特殊命令,使得名称可以在容器和容器之间使用

1.1.查看docker已经存在的镜像

wxl@wxl-pc:~$ docker images
  • 1
  • 1

这里写图片描述

1.2.选择training/webapp这个镜像,通过–name命令设置名称

wxl@wxl-pc:~$ docker run -d -P --name wangxiaoleiweb training/webapp python app.py
  • 1
  • 1

最后一行可以看到wangxiaoleiweb已经命名成功

这里写图片描述

可以使用docker inspect通过刚刚设置的名称来查看wangxiaoleiweb

wxl@wxl-pc:~$ docker inspect wangxiaoleiweb
  • 1
  • 1

这里写图片描述

1.3.删除docker名称,docker的名称都是唯一的,即一但使用了就不能在另一个镜像使用该名称,可以删除后重新命名.(只删除名字,镜像不会被删除)

#停止运行中的镜像wxl@wxl-pc:~$ docker stop wangxiaoleiweb#删除自定义的名称docker rm wangxiaoleiwebwebwxl@wxl-pc:~$ docker rm webwebwxl@wxl-pc:~$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEcentos              latest              50dae1ee8677        2 weeks ago         196.7 MBhello-world         latest              c54a2cc56cbb        4 weeks ago         1.848 kBtraining/webapp     latest              6fae60ef3446        14 months ago       348.8 MBtraining/sinatra    latest              49d952a36c58        2 years ago         447 MB
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2.默认的容器的网络

2.1.Docker通过网络驱动(network driver),默认网络驱动分别是桥接(bridge)和覆盖(overlay)两种.

#查看Docker默认的三种网络wxl@wxl-pc:~$ docker network lsNETWORK ID          NAME                DRIVER              SCOPE7f6b9cbd3eec        bridge              bridge              local               0cb106f52e66        host                host                local               cfb50541161b        none                null                local
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

为一个容器桥接网络

wxl@wxl-pc:~$ docker run -itd --name=networktest ubuntu:14.042a433c9467d3d35474daa544dcac665ecc4b71b202b82d0bd59049f7d52e397f
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3
wxl@wxl-pc:~$ docker network inspect bridge[    {        "Name": "bridge",        "Id": "7f6b9cbd3eece7301d196363b5250c44fd0b275f3c3d38a952af2ad8b2fd38c2",        "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": {            "2a433c9467d3d35474daa544dcac665ecc4b71b202b82d0bd59049f7d52e397f": {                "Name": "networktest",                "EndpointID": "d0b94ec934b390784faa5ad8946e9ba6031afe4467889e1f7fe0eda5d79deac1",                "MacAddress": "02:42:ac:11:00:02",                "IPv4Address": "172.17.0.2/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": {}    }]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

可以看到通过检查网络可以看到容器的IP地址,名称等信息.

2.2.从网络中删除某个容器,可以通过该容器的网络名称,容器名称,id来作为删除的标示,但是通过网络名称是方便的,如networktest

wxl@wxl-pc:~$ docker network disconnect bridge networktest
  • 1
  • 1

再用docker network inspect bridge会发现已经没有networktest信息了

3.自定义容器的网络

容器的网络(network)是用来隔离容器和容器之间或者网络与网络之间的方法,所以,所以我们通过建立网络来隔离容器.其中,内置的bridge网络是无法删除的.

3.1.创建网络

Docker Engine 支持两种网络桥接网络(bridge network)和覆盖网络(overlay network),桥接的网络局限于单个主机运行的Docker Engine,而覆盖网络可以包含多个主机.

wxl@wxl-pc:~$ docker network create -d bridge my-bridge-network3bfde1ba62a75e38236517f4f0731f48c281cec107e976039773be134968c453
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

其中,-d指使用Dockerbridge(桥接)方式的网络,如果没有加默认的也是桥接网络. 
通过docker network ls来查看已经创建好的网络

这里写图片描述

3.2.将一个容器添加至新创建的网络中

#这里创建了一个db的容器(若本地没有该镜像会自动拉取)wxl@wxl-pc:~$ docker run -d --network=my-bridge-network --name db training/postgres
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

通过inspect命令查看已经添加至网络的db容器

wxl@wxl-pc:~$ docker inspect --format='{{json .NetworkSettings.Networks}}'  db{"my-bridge-network":{"IPAMConfig":null,"Links":null,"Aliases":["237e0f7060b6"],"NetworkID":"3bfde1ba62a75e38236517f4f0731f48c281cec107e976039773be134968c453","EndpointID":"33516faca38c0f76bd2c6ebb6e8c2574c62e242d5a0c10b77c49e14b2549f3e5","Gateway":"172.18.0.1","IPAddress":"172.18.0.2","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:12:00:02"}}
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

3.3.通过ping的方式验证网络连通性,将两个容器(db容器和web容器)从不同的网络,放置同一个网络.

3.3.1.把training/webapp容器命名为web,方便后续操作

wxl@wxl-pc:~$ docker run -d --name web training/webapp python app.py8f12cfaaedda2b348bef437fa2eeed19ef69ad07cd98aa72e0c2113710413e6f
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

3.3.2.查看web容器的ip

wxl@wxl-pc:~$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web172.17.0.2
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

3.3.3.进入db容器并且尝试ping一下web容器,发现是ping不通,ctrl+c终止ping,如下图

#进入db容器wxl@wxl-pc:~$ docker exec -it db bash#首次尝试ping web容器root@237e0f7060b6:/# ping 172.17.0.2PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.^C--- 172.17.0.2 ping statistics ---24 packets transmitted, 0 received, 100% packet loss, time 23183msroot@237e0f7060b6:/# exit
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这里写图片描述

3.3.4.现在,将web容器添加至db容器的网络(即my-bridge-network),然后在ping,即可ping通

wxl@wxl-pc:~$ docker network connect my-bridge-network web
  • 1
  • 1
#再次进入db容器wxl@wxl-pc:~$ docker exec -it db bash#ping web容器,发现已经可以ping通root@237e0f7060b6:/# ping web                                                  PING web (172.18.0.3) 56(84) bytes of data.64 bytes from web.my-bridge-network (172.18.0.3): icmp_seq=1 ttl=64 time=0.097 ms64 bytes from web.my-bridge-network (172.18.0.3): icmp_seq=2 ttl=64 time=0.110 ms64 bytes from web.my-bridge-network (172.18.0.3): icmp_seq=3 ttl=64 time=0.109 ms^C--- web ping statistics ---3 packets transmitted, 3 received, 0% packet loss, time 1998msrtt min/avg/max/mdev = 0.097/0.105/0.110/0.010 ms
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

这里写图片描述

可见,不同的容器在不同的网络是可以起到隔离作用的,所以,自定义一个网络可以保证容器和容器之间通信安全.

原创粉丝点击