目录
1.docker网络
loopback:回环网卡、TCP/IP网卡是否生效
docker 0 :容器的网关,绑定物理网卡,负责做NAT地址转换、端口映射
docker 0 本身也是一种容器
veth对是成对出现的虚拟接口/网卡
作用是将两个不同的名称空间进行连接
1.在宿主机中
docker0 网桥是每个容器的默认网关
2.在docker容器中
在docker内部不能直接使用ifconfig这个命令,必须要先yum install -y net-tools,才能查看容器的IP
每个/bin/bash都是一个进程
[root@fbb3a20e294d /]# yum install -y net-tools
[root@fbb3a20e294d /]# ifconfig
2.host模式
不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。与宿主机共享网络名称空间/网络协议栈,IP共享、端口范围共享
网络性能好,隔离性和安全性不好
网络之间的通讯可以使用container
-
没有独立的IP地址
-
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace,容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
-
一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、iptable规则 等都与其他的Network Namespace隔离。
3.container模式——重点
多个容器之间共享一个network namespaces,多个容器公用一个IP和端口范围
container模式至少需要两个容器
container 创建的容器不会创建自己的网卡、设置IP等,而是和一个指定地容器共享IP、端口范围
3-5万
在同一个名称空间,两个容器共享同一个network namespace(实现端口不冲突)
container模式指定新创建的容器和已经存在的一个容器共享一个network namespace,而不是和宿主机共享,新创建的容器不会创建自己的网卡,配置自己的ip,而是和一个指定地容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表还是隔离的。(两个容器的进程可以通过lo0网卡设备通信)
多个容器使用同一个网卡,如果想要不同的IP的话,可以开启第二个网卡
4.none模式
关闭了容器的网络问题
自闭空间,无网卡,无需网络连接
这种网络模式下容器只有lo0回环网口,没有其他的网卡。none模式可以在容器创建时通过-network=none参数指定
none模式的网络无法联网,但是封闭的网络能很好的保证容器的安全性
可以作为①仓库使用②挂载
5.bridge模式(默认模式)
bridge模式是docker的默认网络模式,不用--net
参数,就是bridge模式。
bridge桥接,默认模式,在不指定网络模式的情况下创建容器,默认使用此模式,通过Veth对连接容器与dockero0网桥,网桥分配给容器IP,同时docker 0作为“局域网”内容器的网关,最后和宿主机网卡进行通讯,同时,通过iptables规则将容器IP/port映射出去,用于与宿主机网卡交互
-
bridge模式会为每一个容器分配,设置IP等,并将容器连接到一个docker虚拟网桥,通过docker0网桥及iptables的net表配置与宿主机通信。
-
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
-
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看
-
bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看
iptables容器网络管理,做iptables规则,地址映射和端口映射。将容器和物理网卡进行连接。
6.网络配置
1.查看网络模式列表
#查看网络模式列表
[root@docker conf]# docker network ls
#container模式需要有两个容器
2.查看容器信息
#查看容器信息(包含配置、环境、网关、挂载、cmd等信息)
docker inspect + 容器id
[root@docker conf]# docker inspect fbb3a20e294d
3.指定分配容器IP地址
#指定分配容器IP地址
[root@docker conf]# docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:7 /bin/bash
会报错,不能使用自己定义的IP地址,只能遵循它自定义的IP地址。状态是created
4.自定义网络固定IP地址
#自定义网络固定IP地址
[root@docker ~]# docker network create --subnet=172.18.0.0/16 oyyy
[root@docker ~]# docker run -itd --name test2 --network oyyy --ip 172.18.0.85 centos:7 /bin/bash
[root@docker ~]# docker network ls
7.暴露端口
-p | 自定义端口(宿主机端口:容器内端口) |
---|---|
-P | 随机端口(随机端口范围49153--65535) |
1.自定义端口
[root@docker conf]# docker run -itd -p 123:80 nginx:latest /bin/bash
[root@docker conf]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10143cb0250b nginx:latest "/docker-entrypoint.…" 24 seconds ago Up 23 seconds 0.0.0.0:123->80/tcp, :::123->80/tcp condescending_raman
fbb3a20e294d centos:7 "/bin/bash" 3 hours ago Up 3 hours compassionate_wilbur
0a55baad7fd1 nginx:latest "/docker-entrypoint.…" 4 hours ago Up 4 hours 80/tcp gracious_shamir
[root@docker conf]# systemctl stop firewalld
[root@docker conf]# setenforce 0
[root@docker conf]# docker exec -it 10143cb0250b /bin/bash -c nginx ##开启nginx服务
[root@docker conf]# curl 192.168.68.30:123
2.随机端口
[root@docker ~]# docker run -itd -P nginx:latest /bin/bash
[root@docker ~]# docker exec -it ef213cc78bcc /bin/bash -c nginx
8.特权模式
[root@docker conf]# docker run -itd --name centos_v1 --privileged=true centos:7 /sbin/init
此时进入容器内部就可以使用外部命令了
[root@docker ~]# docker exec -it centos7_v1 /bin/bash
总结
-
Host : 与 宿主机共享网络名称空间/网络协议栈,IP 共享、端口范围共享
-
Container: 多个容器之间共享一个network namespaces,多个容器公用一个IP和端口范围
-
None : 自闭空间,无网卡,无需网络连接
-
Bridge: 桥接, 默认模式,在不指定网络模式的情况下创建容器,默认使用此模式, 通过Veth对连接容器与docker0网桥,网桥分配IP给容器,同时docker0作为“局域网”内容器的网关,最后和宿主机网卡进行通讯, 同时,通过IPtables规则将容器IP/port映射出去,用于与宿主机网卡交互