docker网络模式和数据卷(二)

docker网络模式和数据卷(二),第1张

docker网络模式和数据卷(二)

目录

一、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集群交互,可以使其降低丢包率,加快传输速

度。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5618758.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存