目录
一、Docker网络实现原理
二、Docker 的网络模式:
1、host模式
2、container模式
2.1 container模式实操
3、none模式
4、bridge模式
4.1 bridge实操
5、自定义网络
docker run -d --name test1 -P nginx
#(大写P)启动容器时,将容器端口递增映射到主机上(端口范围为32768开始,后面自增)
(宿主机的端口:容器端口)
docker run -d --name test2 -p 55555:80 nginx
#(小写p)启动容器时,将容器端口映射为主机端口的55555端口
//后面都没有加/bin/bash,为啥?
//加了/bin/bash后,会影响到commad(命令),镜像里面的命令默认是启动nginx,加了/bin/bash后,相当于有多条命令,但是它只会执行一台命令,所有就不执行启动nginx的命令。
//如果加了/bin/bash,那怎么启动容器中的nginx呢?
#可以直接进入容器执行nginx启动,或则 docker exec -it 【容器名】 /bin/bash -c "nginx"
可以查看iptables的映射关系
iptables -nL -nat
查看容器日志信息
docker logs 【容器ID】
或者
cd /var/lib/docker/containers/
目录下找到指定的容器ID目录,然后进入找到一个json.log的文件,这里面也会存在日志,平常删除,直接删除这里面即可。
安装Docker时,他会自动创建三个网络:Bridge(默认)、none、hos
docker network ls
#或 都可以查看docker网络列表
docker network list
使用docker run创建Docker容器时,可以用 --net 或 --network 选项指定容器的网络模式
总结:与宿主机共享Network Namespace
总结:多个容器之间共享一个Network Namespace
docker run -itd --name test1 centos:7 /bin/bash
#基于镜像centos:7创建一个名为test1的容器
docker inspect -f '{{.State.Pid}}' test1
#查看容器的pid号
ls -l /proc/pid号/ns
#查看该容器的命名空间编号
docker run -itd --name test2 --net=container:test1 centos:7
#创建test2容器,使用container模式,和test1共享network namespace
dcoker inspect -f '{{.State.Pid}}' test2
#查看test2容器的pid
ls -l /proc/pid号/ns
#查看该容器的命令空间编号
bridge模式是docker的默认网络模式,不用--net参数,就是bridge模式。
相当于Vmware中的 nat 模式,容器使用独立network Namespace,并连接到docker0虚拟网卡。通过docker0网桥以及iptables nat表配置与宿主机通信,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上。
(1)当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
(2)从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。
(3)Docker将 veth pair 设备的一端放在新创建的容器中,并命名为 eth0(容器的网卡),另一端放在主机中, 以 * 这样类似的名字命名,并将这个网络设备加入到 docker0 网桥中。可以通过 brctl show 命令查看。veth
(4)使用 docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL 查看。
docker run -itd --name test3 centos:7 /bin/bash
#创建时,不需要指定网络模式。默认即可
docker inspect test3 |grep -i 'networkmode'
#过滤出网络模式
直接使用bridge模式,是无法支持指定IP运行docker的
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
#创建指定的网桥的ip地址和名称,以及显示的网络模式名称
//docker1为执行ifconfig -a 命令时,显示的网卡名,如果不使用 --opt 参数指定此名称,那你在使用ifconfig -a 命令查看网络信息时,看到的是类似 br-110add5ad5fsef 这样的名字,这显然不好记。
//mynetwork 为执行docker network list 命令时,显示的bridge网络模式名称。
docker run -itd --name test4 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash