docker 的网络管理
"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 系统,则流程如下:
评论