目录
一、Docker的网络模式
1、四种模式简介
2、docker容器的虚拟网关
3、Docker自定义网络
二、docker数据卷与数据卷容器
1、数据卷
2、数据卷容器
3、容器互联
总结
一、Docker的网络模式 1、四种模式简介
◆Host模式:-net=host;容器和宿主机共享Network namespace(网络名称空间/网络协议栈)
◆Container模式:-net=container:NAME or ID;多个容器共享一 个Network namespace 。
◆None模式:-net=none;容器有独立的Network namespace,但并没有对其进行任何网络设置,如
分配veth pair和网桥连接,配置IP等(自闭空间)
◆Bridge模式:-net=bridge(默认为该模式);默认模式通过Veth对连接容器与docker0网桥,网桥分配
给容器IP,同时docker 0作为“局域网”内容器的网关,最后和宿主机网卡进行通讯
注意:以上不需要动手配置,真正需要配置的是自定义网络。
①、HOST 模式,
host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。如果启动容器
的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机
共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主
机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿
主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是dockerhost上已经使用
的端口就不能再用了,网络的隔离性不好。
②、container模式
container 创建的容器不会创建自己的网卡、设置IP等,而是和一个指定地容器共享IP、端口范
围。这个模式指定新创建的容器和已经存在的一个容器共享一个network namespace,而不是和宿
主机共享。 同样,两个容器除了网络方面,其他的如文件系统、进程列表还是隔离的。(两个容器
的进程可以通过loo网卡设备通信)
③、None模式
None :该模式关闭了容器的网络功能,这种网络模式下容器只有lo回环网口,没有其他的网卡。
none 模式可以在容器创建时通过- -network=none参数指定,这种类型的网络无法联网,但是封闭
的网络能很好的保证容器的安全性。
④、Bridge模式
此模式会为每一个容器分配、设置IP 等,并将容器连接到一个docker虚拟网桥,通过docker0 网桥
及iptables 的nat表配置与宿主机通信。当Docker进程启动时,会在主机上创建一个名为docker0的
虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交
换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。从docker0子网中分配一
个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth
pair设备,Docker将veth pair设备的一端放在新创建的容器
中,并命名为etho(容器的网卡),另一端放在主机中,以vethxxx,这样类似的名字命名,并将这
个网络设备加入到docker0 网桥中。可以通过brctl show命令查看。
bridge模式是docker 的默认网络模式,不写-net参数,就是 bridge模式。使用docker run -p时,
docker实际是在iptables,做了DNAT规则,实现端口转发功能。可以使用jptables. -t nat -vnL查看。
2、docker容器的虚拟网关◆loopback:回环网卡、TCP/IP网卡是否生效
◆virtual bridge:linux自身继承了一个虚拟化功能(kvm架构),是原生架构的一个虚拟化平台,安装
了一个虚拟化平台之后就会系统就会自动安装虚拟网卡
(示例:安装workstation ( 虚拟化平台)之后,会在网络适配器中会多出VMnet1、VMnet8、
VMnet0)
◆docker 0:容器的网关,绑定物理网卡,负责做NAT地址转换、端口映射;docker0本身也是一种
容器
◆veth对:一组虚拟设备,用户连接两个不同的名称空间;宿主机内就是veth
3、Docker自定义网络①查看容器使用网络和ip
docker network ls #查看网络列表
docker inspect 容器id #查看容器信息(包含配置、环境、网关、挂载、cmd等信息)
[root@docker ~]# docker network ls # DRIVER列就是容器使用的网络模式 NETWORK ID NAME DRIVER SCOPE 97bd4f3630dc bridge bridge local 9e70dbb388c1 host host local 4029f649ef49 none null local [root@docker ~]# docker inspect 97bd4f3630dc #详细信息中有IP地址及对应的网关 [ …… { "Subnet": "172.17.0.0/16", "Gateway": "172.17.0.1" } ……
②自定义网络固定IP
#首先,先自定义网络模式对应的172.18.0.0/16的网段 [root@docker ~]# docker network create --subnet=172.18.0.0/16 mynetwork --name:指定容器的名字 --network:指定容器的网络类型 --ip:指定ip地址 #接着,网络模式内加入指定的ip地址 [root@docker ~]# docker run -itd --name test --network mynetwork --ip 172.18.0.100 centos:latest /bin/bash Unable to find image 'centos:latest' locally latest: Pulling from library/centos a1d0c7532777: Pull complete Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 Status: Downloaded newer image for centos:latest 3bfc8e1a7fd414165ef1b70d43cbb37c1beb00f2ff05ed1a5f873695ac8ab528 [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest ea335eea17ab 8 days ago 141MB registry latest b8604a3fe854 13 days ago 26.2MB centos 7 eeb6ee3f44bd 2 months ago 204MB centos latest 5d0da3dc9764 2 months ago 231MB [root@docker ~]# docker inspect test #查看IP,以改变 [ …… "Gateway": "172.18.0.1", "IPAddress": "172.18.0.100", …… [root@docker ~]# #注意:直接指定默认的网络模式创建容器会报错,会提示我们只能遵守默认的分配地址方式;无法指定。 [root@docker ~]# docker run -itd --name test1 --network bridge --ip 172.19.0.2 centos:latest /bin/bash 9b26e42a733aee367efdc9cddedf68cfb1b5ceb2df412ce764c3237dc29aefa8 docker: Error response from daemon: user specified IP address is supported on user defined networks only. [root@docker ~]#
③端口映射、暴露端口、以及在宿主机环境执行容器命令
一般情况下docker容器创建启动后已经是一台独立的名称空间了,一台独立的主机,它默认监听的
是80端口;此时,我们需要将它与原宿主机联系到一起,就需要将自己的80端口暴露给宿主机;
即在它们之间做一个映射;这样,我们就可以通过宿主机管理docker容器了。
-p自定义端口(小写。宿主机端口:容器内端口)
-P随机端口 (大写。范围规定为49153起始-到-65535结束)
docker run -itd -P 333:80 nginx /bin/bash (docker 0 )
docker run -itd -p nginx /bin/bash
#在宿主机环境执行容器内命令
docker exec -it 容器ID /bin/bash -c 'nginx'
docker exec 容器ID/容器name执行的命令
#登陆容器的三种方式
docker run -it 会创建前台进程,但是会在输入exit后终止进程。
dockerattach会通过连接stdin,连接到容器内输入输出流,会在输入exit后终止容器进程.
docker exec -it 会连接到容器,可以像SSH一 样进入容器内部,进行 *** 作,可以通过exit退出容器,不影响容器运行。
访问指定的端口333
访问随机生成的端口
二、docker数据卷与数据卷容器
在创建数据卷和数据卷容器的时候,如果挂载目录不存在,则会自动创建。
数据管理 *** 作,方便查看容器内产生的数据,实现①宿主机与容器之间的数据共享;②容器与容器
之间的数据共享。
宿主机与容器中的数据的两种管理方式●数据卷;●数据卷容器。
1、数据卷#将宿主机目录/var/www挂载到容器中的/data1上,并进入该容器。-v绑定一个卷 [root@docker ~]# docker run -v /var/www:/data-1 --name test -it centos: [root@d70f9a0d3d42 /]# cd /data-1/ #在容器环境中查看/data-1/目录 [root@d70f9a0d3d42 data-1]# ls [root@d70f9a0d3d42 data-1]# echo 'this is test' > abc.txt #创建一个文件 [root@d70f9a0d3d42 data-1]# cat abc.txt this is test [root@d70f9a0d3d42 data-1]# #此时我们退出容器环境,返回宿主机查看/var/www目录下 [root@docker ~]# cd /var/www/ [root@docker www]# ls abc.txt [root@docker www]# cat abc.txt #可以看到成功挂载 this is test [root@docker www]#
注意:将容器内部的配置文件目录,挂载到宿主机指定目录下。作用是什么呢?
拿nginx来说:
①修改配置文件例如,nginx.conf /usr/ local/nginx/conf/nginx.conf 挂载到 /container_ nginx/conf/nginx . conf
②容器内部产生的日志,如何收集将容器内部存方日志文件的目录挂载到宿主机指定目录下/container nginx/1og/access_ 1og/access_ 1og
③传入变量,挂载到宿主机,在宿主机上添加变量内容,将变量放入共享目录,在容器中/etc/profile 直接加载就可以export xxdir=/data/data1/xx.
2、数据卷容器让两个容器之间实现数据共享,容器之间挂载叫做数据卷容器。
#首先,创建数据卷容器,共享data01和data02两个挂载目录 [root@docker ~]# docker run --name juan -v /data01 -v /data02 -it centos:7 /bin/bash [root@243fae8c0a17 /]# echo 'this is test' > /data01/123.txt #分别在两个共享目录下创建文件 [root@243fae8c0a17 /]# echo 'this is test2' > /data02/def.txt [root@243fae8c0a17 /]# cat /data01/123.txt this is test [root@243fae8c0a17 /]# cat /data02/def.txt this is test2 [root@243fae8c0a17 /]# #接着,创建新容器并指定使用容器juan暴露出来的挂载点 [root@docker ~]# docker run -it --volumes-from juan --name rqj centos:7 /bin/bash [root@18a372a4c13e /]# ls #根目录下查看,有共享的两个文件 anaconda-post.log bin data01 data02 dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [root@18a372a4c13e /]# cat /data01/123.txt #两个共享目录下也有共享的文件 this is test [root@18a372a4c13e /]# cat /data02/def.txt this is test2 [root@18a372a4c13e /]#
注:数据卷是挂载在宿主机上的;数据卷容器是通过–volumes-from实现容器与容器之间的挂载。
3、容器互联相当于在两个容器之间使用link建立一个隧道,使得传输速度更快,降 低丢包率等(尤其在elk集群
中相对重要)
[root@docker ~]# docker run -itd -P --name ss1 centos /bin/bash //创建并运行容器取名web1,端口号自动映射 [root@docker ~]# docker run -itd -P --name ss2 --link ss1:ss1 centos /bin/bash //创建并运行容器取名web2,链接到web1和其通信 进ss2容器ping ss1 [root@docker ~]# docker exec -it 0c67f7bc3ab1 /bin/bash [root@0c67f7bc3ab1 /]# ping 172.17.0.3 PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data. 64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.484 ms 64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.058 ms 64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.058 ms ……
可以ping的通,容器互联主要是为了各个容器服务之间交互。
总结1、常见的四种docker网络模式
Host :与宿主机共 享网络名称空间/网络协议栈。IP共享、端口范围共享。
Container:多 个容器之间共享一个 network namespaces。
None :自闭空间,无网卡,无需网络连接。
Bridge:桥接,默认模式,在不指定网络模式的情况下创建容器,默认使用此模式,通过Veth对连
接容器与dockerO网桥,网桥分配给容器IP,同时docker0作为“局域网”内容器的网关,最后和宿主机
网卡进行通讯,同时,通过iptables规则将容器IP/port映射出去,用于与宿主机网卡进行交互。
2、数据卷、数据卷容器
数据卷:方便管理容器中的①配置文件②日志管理(elk收集)③定义容器内执行的脚本(注意:
脚本进行备份、变更处理时,一定要用绝对路径和判断)④运行时传入文件。
数据卷容器:方便两容器之间进行交互,两个服务需要通过某个文件交互,可以通过挂载数据卷容
器方便其 *** 作。
容器互联:一般用于elk日志收集时logstash~到es集群交互,可以使其降低丢包率,加快传输速
度。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)