网络作用介绍
host模式 -net= host 容器和宿主机共享Network namespace(网络名称空间)
containeb模式 -net=container.NAME_or_ID 容器和另外一个容器共享Network namespace(共享ip地址和端口范围)
none模式 -net= none 容器有独立的Network namespace,但并没有对其进行任何网络设置,无法与外部进行交互。如分配veth pair和网桥连接,配置IP等。
bridge模式 -net= bridge (默认为该模式)
注:docker 0为虚拟网桥,所有的容器会连接到虚拟网桥上(因为虚拟网桥为它们的虚拟网关),虚拟网桥会结合iptable的规则去进行地址映射,把容器地址段映射为宿主机的地址段,用于和宿主机通讯,最后让宿主机连接外网。
Docker的四种网络介绍
host
1. 在容器内部创建的两个容器A,B,通过docker
0(相当于小型的局域网,为内部容器的网关)进行内部通信;与外部通信地址映射Nat模式物理网卡ens33
2. 如果两个内部容器的服务不同,但端口一样,进行外部通信时,进行端口映射成不同的端口进行通信
container
1. 创建的容器不会创建自己的网卡、设置IP等,而是和一个指定地容器共享IP、端口范围
2. 这个模式指定新创建的容器和已经存在的一个容器共享一network
namespace,而不是和宿主机共享,新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定地容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表还是隔离的。两个容器的进程可以通过loo网卡设备通信
None
1. 该模式关闭了容器的网络功能
2. 这种网络模式下容器只有lo回环网口,没有其他的网卡。none 模式可以在容器创建时通过-network=none参数指定
3. 这种类型的网络无法联网,但是封闭的网络能很好的保证容器的安全性,提高了安全性。
Bridge
1. 此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker虛拟网桥,通过docker0网桥及iptables的nat表配置与宿主机通信
2. 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中
3. 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端挂载在新创建的容器中,并命名为ethO(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。
docker自定义网络
查看网络列表命令
语法: docker network ls
[root@server1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
4c67ba8a5d4b bride bridge local
bfbf3cdaf20a host host local
f5b7dfaba49b none null local
根据镜像创建容器并指定ip地址
因为本地有镜像直接进行操作
[root@server1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f6d0b4767a6c 8 weeks ago 133MB
nginx web f6d0b4767a6c 8 weeks ago 133MB
centos latest 300e315adb2f 3 months ago 209MB
centos 7 8652b9f0cb4c 3 months ago 204MB
注:会报错来自守护程序的错误响应,仅在用户定义的网络上支持用户指定的IP地址
root@server1 ~]# docker run -it --name test1 --network bridge --ip 172.17.0.10 centos:7 /bin/bash
Unable to find image 'centos:7' locally
7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:0f4ec88e21daf75124b8a9e5ca03c37a5e937e0e108a255d890492430789b60e
Status: Downloaded newer image for centos:7
docker: Error response from daemon: user specified IP address is supported on user defined networks only.
[root@server1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
add1da23d5f8 centos:7 "/bin/bash" 3 minutes ago Created test1
8ce50b325e19 nginx:latest "/docker-entrypoint.…" 26 minutes ago Up 25 minutes 80/tcp vigorous_haibt
注:创建运行容器手动指定IP地址,不允许,没有权限,违背ip地址分配规则按顺序配置
[root@server1 ~]# docker start add1da23d5f8
Error response from daemon: user specified IP address is supported on user defined networks only
Error: failed to start containers: add1da23d5f8
根据镜像创建容器不指定ip地址
[root@server1 ~]# docker run -itd --name test2 --network bridge centos:7 /bin/bash
28b409b7507edb0b5985a0acd80f1da806b9e6c7b2044b4c2c32481508a193d6
[root@server1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
28b409b7507e centos:7 "/bin/bash" 8 seconds ago Up 7 seconds test2
add1da23d5f8 centos:7 "/bin/bash" 5 minutes ago Created test1
查看已运行容器状态
[root@server1 ~]# docker exec -it 28b409b7507e /bin/bash
[root@28b409b7507e /]# yum -y install net-tools
[root@28b409b7507e /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.3 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:03 txqueuelen 0 (Ethernet)
RX packets 3355 bytes 13183087 (12.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2704 bytes 149691 (146.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
自定义网络固定IP
[root@server1 ~]# docker network create --subnet=172.18.0.0/16 bbb
db0e21443c081aceb3077e147f95a4f0926c54ec8fa9868443d8a6c0a06c4e8e
[root@server1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
db0e21443c08 bbb bridge local
278425c8e611 bridge bridge local
5e6ecd8fa0b5 host host local
cd3e31ebb750 none null local
[root@server1 ~]# docker run -itd -name test3 --network bbb --ip 172.18.0.100 centos:7 /bin/bash
unknown shorthand flag: 'n' in -name
See 'docker run --help'.
'少- --name'
[root@server1 ~]# docker run -itd --name test3 --network bbb --ip 172.18.0.100 centos:7 /bin/bash
e6b17bafdb947d3875127146739facda85432a1fb057b7887ecc7618b6fde59e
[root@server1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e6b17bafdb94 centos:7 "/bin/bash" 8 seconds ago Up 8 seconds test3
28b409b7507e centos:7 "/bin/bash" 7 minutes ago Up 7 minutes test2
add1da23d5f8 centos:7 "/bin/bash" 13 minutes ago Created test1
8ce50b325e19 nginx:latest "/docker-entrypoint.…" 36 minutes ago Up 36 minutes 80/tcp vigorous_haibt
查看容器网络地址
[root@e6b17bafdb94 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.100 netmask 255.255.0.0 broadcast 172.18.255.255
ether 02:42:ac:12:00:64 txqueuelen 0 (Ethernet)
RX packets 3829 bytes 13210252 (12.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3556 bytes 195904 (191.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1 (Local Loopback)
RX packets 90 bytes 8150 (7.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 90 bytes 8150 (7.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
测试网关,网桥网关
[root@e6b17bafdb94 /]# ping 172.18.0.1
PING 172.18.0.1 (172.18.0.1) 56(84) bytes of data.
64 bytes from 172.18.0.1: icmp_seq=1 ttl=64 time=0.060 ms
64 bytes from 172.18.0.1: icmp_seq=2 ttl=64 time=0.041 ms
[root@e6b17bafdb94 /]# ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from 172.17.0.1: icmp_seq=2 ttl=64 time=0.041 ms
64 bytes from 172.17.0.1: icmp_seq=3 ttl=64 time=0.041 ms