docker创建之初有以下网络模式
root@vvkt7whznuckhiz2-0723575:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
136aaf557ff8 bridge bridge local
7de00a5707e9 host host local
e84b7ddf13c5 none null local
查看系统内Docker网桥配置
root@vvkt7whznuckhiz2-0723575:~# ip a
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:bf:6d:35:16 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:bfff:fe6d:3516/64 scope link
valid_lft forever preferred_lft forever
系统IP地址详解
root@vvkt7whznuckhiz2-0723575:~# ip addr
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
# local network
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether fa:16:3e:80:22:6a brd ff:ff:ff:ff:ff:ff
inet 192.168.1.9/24 brd 192.168.1.255 scope global dynamic eth0
valid_lft 84731sec preferred_lft 84731sec
inet6 fe80::f816:3eff:fe80:226a/64 scope link
valid_lft forever preferred_lft forever
# ethernet 以太网
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:8a:6f:a8:29 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
# docker 虚拟网络层
网络模式的介绍
bridge 为每一个容器分配,设置IP地址,并且将容器链接到一个docker0的虚拟网桥,dockers网络连接的默认模式
host 容器不会虚拟自己的网卡,配置IP等,而是使用宿主机的IP地址和端口
none 容器有独立的Network namespace,但并没有对其进行任何网络设置,比如分配veth_pair和网桥连接,IP地址等
container 新建容器不会船舰自己的网卡和配置自己的IP,而是和一个指定的容器共享IP,端口范围等;
1.1. bridge桥接网络模式
在该模式中,Docker 守护进程创建了一个虚拟以太网桥docker0, 新建的容器会自动桥接到这个接口,附加在其上的热呢网卡之间都能自动转发数据包。
默认情况下,守护进程会创建一堆对等的虚拟设备接口veth_pair, 将其中的一个接口设置为容器的etho接口(容器网卡),另外一个接口放在宿主机的命令空间中,以类似的vethxx的名字命名,从而将宿主机上的所有容器都连接到这个内部网络上
比如我运行一个基于busybox镜像的容器,构建为bbox01, 查看ipaddr:
busybox被称为嵌入式Linux的瑞士军刀,整合了很多很小的unix下的通用功能到一个小的可执行文件中。
执行命令
# 创建容器
docker run -it --name bbox01 busybox
ip addr
# 另开一个连接,在系统内查看
ip addr
# 安装工具包
sudo apt install bridge-utils
# 查看桥接模式的设备
root@vvkt7whznuckhiz2-0723575:~# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02428a6fa829 no vetha04eec4
docker network inspect bridge # docker命令查看使用bridge桥接模式创建的容器
网络模式示意图
[官网:网络模式]:Use bridge networks | Docker Documentation
1.2. host网络模式
概念
● host网络模式需要在创建容器时通过参数--net host 或者--network host 指定;
● 采用host网络模式的Docker Container,可以直接使用宿主机的IP地址与外界进行通信,若宿主机的ethQ是一个公有 IP,那
么容器也拥有这个公有IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行NAT转换;
● host网络模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
创建主机并且查看网络
docker run -it --name bbox02 --network host busybox
1.3. none网络模式
概念
● none网络模式是指禁用网络功能,只有lo接口pocal的简写,代表127.0.0.1, 即localhost本地环回接口。在创建容器时通过参数--net none或者--network none 指定;
● none 网络模式即不为Docker Container创建任何的网络环境,容器内部就只能使用loopback网络设备,不会再有其他的网络资源。
可以说none模式为Docke Container 做了极少的网络设定,但是俗话说得好“少即是多”,在没有网络配置的情况下,作
为Docker开发者,才能在这基础做其他无限多可能的网络定制开发。
这也恰巧体现了Docker 设计理念的开放。比如我基于none 网络模式创建了一个基于busybox 镜像构建的容器bbox03 ,查看ip addr :
# 创建命令
docker run -it --name bbox03 --net none busybox
IP地址比对
1.4. container网络模式
概念
●Container 网络模式是Docker 中-种较为特别的网络的模式。在创建容器时通过参数--net container :已运行的容器名
称|ID或者--network container:已运行的容 器名称|ID指定;
●处于这个模式下的Docker容器会共享- 个网络栈,这样两个容器之间可以使用localhost高效快速通信。
Container网络模式即新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样
两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是隔离的。
# 创建新的容器,指定被共享网络的容器
docker run -it --name bbox05 --network container:bbox01 busybox
# 分别进入两个容器查看IP地址
docker exec -it bbox01 sh
# 创建共享之前,首先启动被网络依赖的容器,共享方式创建的容器,IP地址跟随被依赖容器
图示
地址比较
1.5. link
121
12
123
概念
1. 虽然Docker提供的默认网络使用比较简单,但是为了保证各容器中应用的安全性,在实际开发中更推荐使用自定义的网络进行容器管理,以及启用容器名称到IP地址的自动DNS解析.
2. 从Docker1.10版本开始,```docker daemon```实现了一个内嵌的```DNS server```,使容器可以直接通过容器名称进行通信。方法很简单,只要在创建容器时使用```--name```为容器命名即可。
3. 但是使用```Docker DNS```有个限制:只能在```user-defined```网络中使用。也就是说,默认的```bridge```网络是无法使用DNS的,所以我们就需要自定义网络。
产生业务需求的原因
# 共同使用桥接模式,需要多个容器同时启动,每暂停一次,关联容器就会重新分配一次内部IP地址,变址对于网络通信是极为不利的
# 以下通过容器之间直接的互相ping来演示这种弊端[bbox05 ping bbox01]
## server 1
docker exec -it bbox01 sh
ip addr
## server 2
docker run -it --name bbox05 busybox
ping 172.17.0.3
## server 1
docker stop bbox01
## server 2
docker exec -it bbox05 sh
ping 172.17.0.3
实现步骤
先行创建一个自定义网络
root@vvkt7whznuckhiz2-0723575:~# docker network create custom-network
5cfe6a90020f23b95eacd76f3588c84842b431cec04f35074a66e0abbdcaae89
查看已创建的网络
root@vvkt7whznuckhiz2-0723575:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
63ec19dbd16b bridge bridge local
5cfe6a90020f custom-network bridge local
7de00a5707e9 host host local
e84b7ddf13c5 none null local
俩台主机分别使用自定义网络创建容器
## server 1
docker run -it --name bbox06 --net custom-network busybox
ip addr
ping 172.18.0.3
## server 2
docker run -it --name bbox07 --net custom-network busybox
ip addr
ping 172.18.0.3
连接网络
通过docker network connect 网络名称 容器名称 为容器连接新的网络模式
root@vvkt7whznuckhiz2-0723575:~# 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
root@vvkt7whznuckhiz2-0723575:~#
命令示例
docker network connect custom-network bbox05
断开网络
通过docker network disconnect 网络名称 容器名称
断开网络
docker network disconnect custom-network bbox05
移除网络
通过docker network rm 网络名称
断开网络
docker network rm custom-network
12现场保存
svim /etc/sysconfig/network-scripts/ifcfg-ens32
TYPE=Ethernet
BOOTPROTO=static
NAME=ens32
DEVICE=ens32
ONBOOT=yes
IPADDR=192.168.10.11
NETMASK=255.255.255.0
GATEWAY=192.168.10.2
DNS1=192.168.10.2
DNS2=114.114.114.114
DNS3=8.8.8.8
12
root@vvkt7whznuckhiz2-0723575:/etc/netplan# 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether fa:16:3e:80:22:6a brd ff:ff:ff:ff:ff:ff
inet 192.168.1.9/24 brd 192.168.1.255 scope global dynamic eth0
valid_lft 85767sec preferred_lft 85767sec
inet6 fe80::f816:3eff:fe80:226a/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:a8:83:87:39 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:a8ff:fe83:8739/64 scope link
valid_lft forever preferred_lft forever
10: br-5cfe6a90020f: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:56:dc:f5:d5 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-5cfe6a90020f
valid_lft forever preferred_lft forever
inet6 fe80::42:56ff:fedc:f5d5/64 scope link
valid_lft forever preferred_lft forever
原始配置
network:
ethernets:
eth0:
dhcp4: true
dhcp6: true
version: 2
补充—DaoCloud
网址:
[镜像市场]:Hub · DaoCloud
国内付费镜像服务,可以快速拉取