写点什么

docker 的网络管理

  • 2022 年 4 月 30 日
  • 本文字数:4549 字

    阅读完需:约 15 分钟

"Name": "d1",


"EndpointID": "6e636282db32ad08c23cd7260a7ff98cd68fb471f7aea368cc237531be88bcce",


"MacAddress": "02:42:ac:11:00:02",


"IPv4Address": "172.17.0.2/16",


"IPv6Address": ""


},


"83817192b3ad981916fbd4a5233f6938ed39fadbe397e808ce6fe9cae2d3ef37": {


"Name": "db",


"EndpointID": "ffbac933c7a2af9073beda2836832a547811567396b3c43a074213bfb3c6b860",


"MacAddress": "02:42:ac:11:00:03",


"IPv4Address": "172.17.0.3/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": {}


}


]


[root@ccx ~]#

[](()新建一个 docker_bridge 网络【也称自定义网桥】

  • 创建命令:docker network create -d 网络类型 --subnet=自定义网段/24 自定义网络名称


如下:我创建一个 10.1.0.0/24 的 bridge 网段,名称为 mynet


[root@ccx ~]# docker network create -d bridge --subnet=10.1.0.0/24 mynet


4c69134c1f738325131234723aa53411bc356fd6f903340cd50ccbb337cfa05f


[root@ccx ~]# docker network list


NETWORK ID NAME DRIVER SCOPE


e6ee3d8294cd bridge bridge local


7fbf0d1de452 host host local


4c69134c1f73 mynet bridge local


9ead5d6edce5 none null local


[root@ccx ~]#


[root@ccx ~]# docker network inspect mynet


[


{


"Name": "mynet",


"Id": "4c69134c1f738325131234723aa53411bc356fd6f903340cd50ccbb337cfa05f",


"Created": "2021-06-18T16:45:59.696990876+08:00",


"Scope": "local",


"Driver": "bridge",


"EnableIPv6": false,


"IPAM": {


"Driver": "default",


"Options": {},


"Config": [


{


"Subnet": "10.1.0.0/24"


}


]


},


"Internal": false,


"Attachable": false,


"Containers": {},


"Options": {},


"Labels": {}


}


]


  • 命令参数记不得不要紧,我们可以通过 man 查看参数这些的

找到 docker-network-create 这行

[root@ccx ~]# man -k docker | grep netwo


docker-network-connect (1) - connect a container to a network


docker-network-create (1) - create a new network


docker-network-disconnect (1) - disconnect a container from a network


docker-network-inspect (1) - inspect a network


docker-network-ls (1) - list networks


docker-network-rm (1) - remove one or more networks


[root@ccx ~]# # 然后执行下面条命令


[root@ccx ~]# man docker-network-create


#下翻,其中有一行是 $ docker network create \ 这个开头,下面就有说明参数了


$ docker network create \


--driver=bridge \


--subnet=172.28.0.0/16 \


--ip-range=172.28.5.0/24 \


--gateway=172.28.5.254 \


br0

[](()通过自定义的 bridge 网络创建一个容器

  • 参数:--network=网络名称【docker network list 查看】


如:我通过上面我自己创建的网络 mynet 创建一个 centos 容器


创建成功以后看到的 ip 就是自定义的网络 ip 了。


[root@ccx ~]# docker run -dit --name=d2 --restart=always --network=mynet hub.c.163.com/library/centos


8991f9ffe2cfe419de9aac2e48a3ac046d04b21b9d64c04dfb3431f154874748


[root@ccx ~]#


[root@ccx ~]# docker inspect d2 | grep IPA


"SecondaryIPAddresses": null,


"IPAddress": "",


"IPAMConfig": null,


"IPAddress": "10.1.0.2",


[root@ccx ~]#


[](()host 网络说明




  • docker 的 host 网络是共享主机网络的, host 没有自己的网络空间。

  • 该模式将禁用 Docker 容器的网络隔离。因为容器共享了宿主机的网络命名空间,容器和宿主机具有相同的 IP 地址 172.17.119.96 直接暴露在公共网络中。因此,你需要通过端口映射(port mapping)来进行协调。该模式比 bridge 模式更快(因为没有路由开销),但是它将容器直接暴露在公共网络中,是有安全隐患的。

[](()创建一个指定网络位 host 的容器

  • 因为这个 host 是共享的主机网络,所以也就没有自己创建 docket_host 网络的意义,直接使用即可。

  • 如,我使用 host 网络创建一个 b1 的容器,查看 ip


因为上面的 centos 镜像没有 ipconfig 命令,所以我使用了 busybox 镜像【这个镜像很小,但命令较全,适合做测试用,但需要注意的是这个镜像使用的 cmd 是 sh ,而非 bash 了】


[root@ccx ~]# docker images


REPOSITORY TAG IMAGE ID CREATED SIZE


docker.io/busybox latest 69593048aa3a 10 days ago 1.24 MB


docker.io/nginx latest d1a364dc548d 3 weeks ago 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 133 MB


hub.c.163.com/library/wordpress latest dccaeccfba36 3 years ago 406 MB


hub.c.163.com/library/centos latest 328edcd84f1b 3 years ago 193 MB


hub.c.163.com/library/mysql latest 9e64176cd8a2 4 years ago 407 MB


[root@ccx ~]# docker run -dit --name=b1 --restart=always --network=host docker.io/busybox


f2de84bfa8ed2f507d34ca3ace92e74637a02dcfbc6c890ab6a989da45471d5c


[root@ccx ~]# docker exec -it b1 sh


/ # ifconfig

下面内容太多了,所以我删了许多,只保留了现有 ip 的选项

ens33 Link encap:Ethernet HWaddr 00:0C:29:04:51:6B


inet addr:192.168.159.128 Bcast:192.168.159.255 Mask:255.255.255.0


inet6 addr: fe80::1d92:633a:8803:17b2/64 Scope:Link


UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1


RX packets:31256 errors:0 dropped:0 overruns:0 frame:0


TX packets:10374 errors:0 dropped:0 overruns:0 carrier:0


collisions:0 txqueuelen:1000


RX bytes:30645011 (29.2 MiB) TX bytes:1304944 (1.2 MiB)


ens34 Link encap:Ethernet HWaddr 00:0C:29:04:51:75


inet addr:192.168.159.129 Bcast:192.168.159.255 Mask:255.255.255.0


inet6 addr: fe80::59c4:bb33:e5bb:ee6c/64 Scope:Link


UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1


RX packets:1354 errors:0 dropped:0 overruns:0 frame:0


TX packets:42 errors:0 dropped:0 overruns:0 carrier:0


collisions:0 txqueuelen:1000


RX bytes:87936 (85.8 KiB) TX bytes:7136 (6.9 KiB)

下面是我主机上看到的 ip 信息

[root@ccx ~]# ip a


1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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


inet6 ::1/128 scope host


valid_lft forever preferred_lft forever


2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000


link/ether 00:0c:29:04:51:6b brd ff:ff:ff:ff:ff:ff


inet 192.168.159.128/24 brd 192.168.159.255 scope global noprefixroute dynamic ens33


valid_lft 1087sec preferred_lft 1087sec


inet6 fe80::1d92:633a:8803:17b2/64 scope link noprefixroute


valid_lft forever preferred_lft forever


3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000


link/ether 00:0c:29:04:51:75 brd ff:ff:ff:ff:ff:ff


inet 192.168.159.129/24 brd 192.168.159.255 scope global noprefixroute dynamic ens34


valid_lft 1602sec preferred_lft 1602sec


inet6 fe80::59c4:bb33:e5bb:ee6c/64 scope link noprefixroute


valid_lft forever preferred_lft forever


4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default


link/ether 02:42:c8:57:ce:6c brd ff:ff:ff:ff:ff:ff


inet 172.17.0.1/16 scope global docker0


valid_lft forever preferred_lft forever


inet6 fe80::42:c8ff:fe57:ce6c/64 scope link


valid_lft forever preferred_lft forever

[](()host 模式应用

  • 这个可以直接用于 nginx 容器,这样我们访问主机 ip,就相当于访问容器了。


[root@ccx ~]# docker run -dit --name=web --restart=always --network=host docker.io/nginx


ab8cc63f0c17e3049338f0a0224a9f0a0aa2b3293e1107698e101985f8d20b4e


[root@ccx ~]# docker ps


CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES


ab8cc63f0c17 docker.io/nginx "/docker-entrypoin..." 6 seconds ago Up 6 seconds web


[root@ccx ~]#


  • 此时在浏览器中输入服务器 ip 就可以直接看到 nginx 中内容了


如果输入主机 ip 打不开,去主机上关闭防火墙:systemctl stop firewalld


Welcome to nginx!


If you see this page, the nginx web server is successfully installed and working. Further configuration is required.


For online documentation and support please refer to nginx.org.


Commercial support is available at nginx.com.


Thank you for using nginx.


[](()container 模式说明(一般缓存使用,在同一台机器访问比较快)




  • 我的这个主机上没有这个网络,这是我查资料看到的,可以了解一下。

  • 在理解了 host 模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。


[](()none 网络说明




  • 这个模式没啥要说明的,主要用于测试使用,这个创建出来的容器没有任何 IP,不能和主机互通。

  • 但可以进入容器,自行配置

[](()创建一个指定网络位 none 的容器

这个过程应该没啥好说明的了,直接看下面代码内容吧


[root@ccx ~]# docker run -it --name=c1 --restart=always --network=none docker.io/busybox


/ # ifconfig


lo Link encap:Local Loopback


inet addr:127.0.0.1 Mask:255.0.0.0


inet6 addr: ::1/128 Scope:Host


UP LOOPBACK RUNNING MTU:65536 Metric:1


RX packets:0 errors:0 dropped:0 overruns:0 frame:0


TX packets:0 errors:0 dropped:0 overruns:0 carrier:0


collisions:0 txqueuelen:1000


RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)


/ # exit


[root@ccx ~]#


[](()查看容器 ip 的方法


========================================================================


[](()方式一




  • 第一种是进入容器使用命令查看


如果容器是自带 bash 的,如 centos 系统,则流程如下:

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
docker的网络管理_程序员_爱好编程进阶_InfoQ写作社区