目录
一、Docker网络实现原理
二、Docker的网络模式
2.1、Host模式
2.2、Container模式
2.3、None模式
2.4、bridge模式
三、自定义网络
3.1、查看网络模式列表
3.2、查看容器详细信息(包含配置、环境、网关、挂载、cmd等信息)
3.3、指定分配容器IP地址
四、暴露端口
五、为容器创建端口映射
docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过Container-IP访问到容器。如果容器希望外部能够访问到,可以通过映射容器端口到宿主机(端口映射),即docker run创建容器的时候,通过-p或者-P参数来启用。访问容器的时候,就通过[宿主机IP]:[容器端口]访问容器
但是如果启动容器的时候使用host模式,那么这个容器不会获得一个独立的Network Namespace,而是和宿主机公钥一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口,此时容器不再拥有隔离的,独立的网络栈,不拥有所有端口资源。
#创建容器web 1,指定网络模式为 host
#因为是host模式,所有宿主机和容器共享ip和端口
docker run -d --name web1 --net=host nginx
#访问宿主机的ip和80端口,则可以访问到web1的nginx服务
curl http://192.168.109.11:80
#基于镜像centos:7 创建一个名为test1的容器
[root@docker ~]# docker run -itd --name test1 centos:7 /bin/bash
a4538d99640aae2a511471ae4e5cb43e037b93d9ca4b1e417f9eb629d0287563
#查看该容器的pid号
[root@docker ~]# docker inspect -f '{{.State.Pid}}' test1
24244
#查看该容器的命名空间编号
[root@docker ~]# ls -l /proc/24244/ns
total 0
lrwxrwxrwx. 1 root root 0 Oct 17 15:03 ipc -> ipc:[4026532568]
lrwxrwxrwx. 1 root root 0 Oct 17 15:03 mnt -> mnt:[4026532566]
lrwxrwxrwx. 1 root root 0 Oct 17 15:03 net -> net:[4026532571]
lrwxrwxrwx. 1 root root 0 Oct 17 15:03 pid -> pid:[4026532569]
lrwxrwxrwx. 1 root root 0 Oct 17 15:03 user -> user:[4026531837]
lrwxrwxrwx. 1 root root 0 Oct 17 15:03 uts -> uts:[4026532567]
#创建test2容器,使用container网络模式,和test1共享network Namespace
[root@docker ~]# docker run -itd --name test2 --net=container:test1 centos:7 /bin/bash
8cd322418164a241409c68336116ff90a241211d6464fbc9312adcfd39883d71
#查看test2容器的pid
[root@docker ~]# docker inspect -f '{{.State.Pid}}' test2
24540
#查看该容器的命令空间编号
[root@docker ~]# ls -l /proc/24540/ns
total 0
lrwxrwxrwx. 1 root root 0 Oct 17 15:25 ipc -> ipc:[4026532642]
lrwxrwxrwx. 1 root root 0 Oct 17 15:25 mnt -> mnt:[4026532640]
lrwxrwxrwx. 1 root root 0 Oct 17 15:25 net -> net:[4026532571]
lrwxrwxrwx. 1 root root 0 Oct 17 15:25 pid -> pid:[4026532643]
lrwxrwxrwx. 1 root root 0 Oct 17 15:25 user -> user:[4026531837]
lrwxrwxrwx. 1 root root 0 Oct 17 15:25 uts -> uts:[4026532641]
bridge模式是docker的默认网络模式,不写--net参数,就bridge模式
相当于VMware中的nat模式,容器使用独立network Namespace,并连接到docker0虚拟网卡。通过docker0网桥以及iptables nat表配置与宿主机通信,此模式会为每一个容器分配Network Namespace,设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。
[root@docker ~]# docker run -itd --name test1 centos:7 /bin/bash
357d3f7aac0c0af56a169e2c31760431acc1b7bc65e454f48c3bce3ffa6765ab
[root@docker ~]# docker inspect test1 | grep -i "networkmode"
"NetworkMode": "default",
docker network ls
docker inspect 容器ID或容器名
[root@docker ~]# docker run -itd --name test2 --network bridge --ip 172.17.0.10 centos:7 /bin/bash
d0b202d7c395685b778e7e71e62651c5e646a006b8bd206a38694aeb67078682
docker: Error response from daemon: user specified IP address is supported on user defined networks only.
#以上会出现报错,因为用户使用的IP地址不被规则所允许,docker0定义的就是按照顺序来,所以需要创建一个
dockers network create --subnet=172.18.0.0/16 mynetwork
自定义完网络,我们再指定IP
docker run -itd --name test3 --network mynetwork --ip=172.18.0.10 centos:7 /bin/bash
两个容器如果端口一致的情况下,暴露出去会产生地址冲突,所以需要再docker0上做一个端口映射,通过ens33暴露出去不同端口就可以了
-p 自定义端口 ( 宿主机端口:容器内端口 )
-P 随机端口 (-P 49153起始 49153到65535)
[root@docker ~]# docker run -itd -p 8080:80 nginx /bin/bash
4d2879a1059c9f6709fc5a3a6a14fd90dc51689b514818271111cb0ee7836242
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d2879a1059c nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp admiring_driscoll
#进入容器开启nginx
docker exec -it 4d2879a1059c /bin/bash -c nginx
浏览器访问
随机映射端口(从32768开始)docker run -d --name 为容器指定名称 -P 镜像
指定映射端口docker run -d --name 为容器指定名称 -p 宿主机端口:容器内端口 镜像
#使用nginx镜像创建容器,名称为web1 ,随机映射端口
docker run -d --name web1 -P nginx
docker ps -a
#使用nginx镜像创建容器,名称为web2,将容器内的80端口映射到宿主机的39999端口
docker run -d --name web2 -p 40000:80 nginx
docker ps -a
#访问
curl http://192.168.130.100:49154
curl http://192.168.130.100:40000
#主机查看端口号
netstat -natp|grep docker
#实际上是通过nat表进行转发的
iptables -nL -t nat