四种网络模式
host模式 --net=host 容器和宿主机共享Network,namespace
container模式 --net=container:NAME_or_ID 容器和另外一个容器共享Network namespace。kubernetes中的pod就是多个容器共享一个Network namespace
none模式 --net=none 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接,配置IP等。
bridge模式 --net=bridge 默认为该模式
可以通过docker network ls进行查看
可以通过docker network inspect 来查看相关信息
Bridge网络模式
安装docker时会自动创建一个docker0网桥,运行容器时,可以使用docker run --network=选项指定容器应连接到哪个网络,否则Docker守护进程默认将容器连接到docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。
Docker随机分配一个本地未占用的私有网段(在PFC1918中定义)中的一个地址给docker0接口。此后启动容器内的网口也会自动分配一个同一网段的地址。docker0的IP地址则为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中(bridge模式示意如下图所示),可以通过brctl show查看。
通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker就创建了在主机和容器之间一个虚拟共享网络。
注:bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看
也可以自定义网桥:
docker network create -d bridge my-bridge
Host网络模式
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口,但是,容器的其他方面,如文件系统、进程、列表等还是和宿主机隔离的。Host模式示意图如下所示。
docker run --network=host
Container网络模式
docker run --network container:b1
这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他如文件系统、进程列表等还是隔离的,两个容器的进程可以通过lo网卡设备通信
None网络模式
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息,只有lo网络接口,需要我们自己为Docker容器添加网卡、配置等。
不参与网络通信,运行于此类容器中的进程仅能访问本地环回接口;仅适用于进程无须网络通信的场景中,例如:备份、进程诊断及各种离线任务等。None模式示意图如下所示。
docker run --network=none
外部访问Docker容器(docker run -p/-P指令)
1.当使用-P标记时,Docker会随机映射一个49000~49000的端口到内部容器开放的网络端口。
2.-p则可以指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器。支持的格式有hostPort:containerPort、ip:hostPort:containerPort、ip::containerPort。
将容器的5000端口映射到指定地址127.0.0.1的5000端口上
docker run -it -d -p 127.0.0.1:5000:5000 docker.io/centos:latest /bin/bash
将容器的4000端口映射到127.0.0.1的任意端口上
docker run -it -d -p 127.0.0.1::4000 docker.ip/centos:latest /bin/bash
将容器的80端口映射到宿主机的8000端口上
docker run -itd -p 8000:8000 docker.ip/centos:latest /bin/bash
查看映射端口配置:docker port CONTAINER_ID
Docker容器间通信
使用link方式使容器间可以相互通信
docker run --link可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以相互通信,并且接收容器可以获取源容器的一些数据,如源容器的环境变量
docker run --name bbs -p 80:80 --link MySQL:mysql -d --restart=always docker.io/y109/discuz