一,Docker数据卷
一,数据卷的概念
Docker引入数据的原因:方便项目的部署和文件的备份,假如没有数据卷我们部署项目,只能通过docker cp从宿主机系统复制项目到容器中,然后在运行项目,但这个过程很繁琐,使用数据卷共享宿主机目录和容器目录,在宿主机操作共享目录容器会实时得到共享数据以及数据通信
Docker引入数据卷的作用:实现宿主机系统与容器之间的文件共享
数据卷的概念:是一个可供一个或多个容器使用的特殊目录,它绕过了UFS提供了很多实用功能
数据卷的特性:
- 数据卷可以在容器之间或容器与宿主机系统之间共享和重用
- 数据卷修改会立即同步
- 对数据的更新,不会影响镜像
- 数据卷默认一直存在,即使容器被删除
数据卷(Volume)类似于一个存在于宿主机的中间层目录,宿主机目录和容器目录都连接这个中间层,当一方改动,两端都会实时同步
二,数据卷的操作
数据卷的操作包括启动容器时创建数据卷,查看数据卷,删除数据卷,查看数据卷的细节,直接创建数据卷
一,创建数据卷
创建数据卷分两种:
- 载容器启动时创建数据卷(创建+挂载)
- 直接创建数据卷(创建)
一,启动容器时创建数据卷
启动时创建数据卷也分为两种情况:
- 指定系统已存在的绝对路径目录创建数据卷(自定义创建数据卷)
- 指定数据卷名(不存在的系统目录)创建数据卷(自动创建数据卷)
一,自定义创建数据卷
命令:docker run -v 宿主机存在的绝对路径:容器中的目录 镜像标识
例:
#在宿主机/home/wql目录创建一个数据卷,并将数据卷挂载到容器/root/volume中 docker run -v /home/wql:/root/volume tom
二,自动创建数据卷
命令:docker run -v 数据卷名称:容器中的目录 镜像标识
例:
#创建一个名为fq的数据卷,并将数据卷挂载到容器/root/volume中 docker run -v fq:/root/volume tom
这种方式没有指定创建的目录只有数据卷名称(数据卷创建时是空的),默认会保存在Docker Root Dir中的lib/volumes目录下(如果不知道Docker Root Dir目录可以通过 docker info查看)
两种方式都对数据卷进行了挂载操作,但两种还是有区别的通过自动创建的数据卷是空的,通过自定义创建的数据卷可以不为空(目录有文件),自定义创建的数据卷也无法被docker ls指令查看到,因为没有数据卷名
注:假如创建数据卷的目录和挂载数据卷的目录都有数据,它们会互相共享
二,直接创建数据卷
命令:docker volume create 数据卷名
例:
#创建一个名为fq的数据卷,并将数据卷挂载到容器/root/volume中 docker run -v fq:/root/volume tom
这种方式和自动创建数据卷逻辑上有些相似(保存位置一样),但这种方式只负责创建数据卷,并没有进行容器挂载,还需要通过命令手动进行挂载有些繁琐(不推荐这种方式)
二,查看数据卷
1,查看所有数据卷:docker volume ls
注:这个指令无法查看到通过自定义方式创建的数据卷(它需要通过数据卷名创建的方式才能显示)
2,查看数据卷的详细信息:docker volume inspect 数据卷名
三,删除数据卷
删除没有挂载的数据卷:docker volume prune
删除指定数据卷:docker volume rm 数据卷名
二,Docker镜像的原理
一,UnionFS联合文件系统
Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
UnionFS的运行特征:一次同时加载多个文件系统,但从表面上看起来只运行一个文件系统,联合加载会把各个文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
UnionFS文件系统类似于开发过程中应用的拆分,将应用拆分成各个模块,上层模块依赖底层模块,但你看到的只是启动了上层模块,底层细节被屏蔽,假如有多个应用,可以共有一些底层模块,并不需要每一个应用都自成体系,减少了应用体积
UnionFS的优点:
- 文件或应用的叠加增加了重用性,总体上减少了文件体积
- 文件或应用的拆分于叠加,减少了耦合
注:在Docker下载单个镜像,会发现应用反而体积增大,因为单个下载没有其他镜像可复用,还需要下载依赖镜像如ContOS操作系统导致的,但本质上镜像多文件总体体积是减少了
二,Docker镜像原理
Docker镜像定义:镜像是一个轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某一个软件所需的所有内容,包括代码,运行所需的库,环境变量和配置文件
Docker镜像本质上是由一层一层的文件系统组成,这种层文件系统就是UnionFS
Docker镜像的最底层是bootfs:
bootfs(boot file system)主要包含bootloader(boot加载器)和kernel(内核),bootloader主要是引导加载kerne,Linux刚启动时会加载bootfs文件系统,这一层与典型的Linux/Unix系统是一样的,包含boot加载器和内核,当boot加载完成之后整个内核就都在内存中了,此时内存的使用权由bootf转交给内核,此时系统会卸载bootfs
rootfs:在bootfs之上包含的就是典型LInux系统中的/dev,/proc,/bin,/etc等标准目录和文件,rootfs就是各种不同操作系统共有的一个文件,比如:CentOS,Ubuntu
1,为什么安装进虚拟机的centos镜像要几个G,而docker才200M?
这也与bootfs有关,在一个精简的OS系统中,rootfs可以很小,只需要包含最基本的命令,工具和程序库即可,因为底层可以直接用宿主机的Kernel(内核),自己只需要提供rootfs就行了,由此对不同的linux发行版,bootfs基本一致,rootfs会有差别,因此不同发行版本可以共用bootfs
2,镜像分层:docker镜像采用UnionFS做为基础,它的镜像也是分层的,底层镜像为上层提供基础,多个上层镜像基于共有底层镜像
镜像分层的优点:共享资源实现资源的复用,比如:有多个镜像都有相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一份base镜像,同时内存中只需加载一份base镜像,就可以为所有的容器服务,而且镜像的每一层都可以被共享
镜像的特点:但容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称为'容器层',容器层之下为'镜像层',镜像层都是之读的
三,Docker网络通信(网桥)
Docker网络通信使用的是Linux的桥接,在宿主机虚拟一个Docker容器网桥(Docker0),Docker启动一个容器时会根据Docker网桥的网段分配分配一个IP地址(Container-IP)给容器,同时Docker网桥是每一个容器的默认网关,因为在同同一宿主机内的容器都接入同一个网敲,这样容器容器之间就能通过容器的Container-IP直接进行通信
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法进行寻址访问的,这也意味着外部网络无法直接通过Container-IP访问容器,如果容器需要外部能够访问,可以通过映射容器端口到宿主机(端口映射)
一,Docker四种网络模式
docker默认有四种网络模式:
- host模式(主机模式)
- container模式(容器模式)
- nono模式
- bridge模式(网桥模式)
Docker网络模式 | 配置 | 说明 |
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时主要以网桥模式进行网络通信,其他模式基本已经被淘汰
一,Host模式
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的,所有现在很少被使用
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好
二,Container模式
该模式指定新创建的容器和已存在的容器共享一个network namespace,而不是和宿主机共享,已存在的容器需要网卡和IP,而新创建的容器则不需要,而是和已存在容器共享IP和端口,两个容器除网络方面,其他如文件系统,进程履历表等还是隔离的
三,None模式
Docker容器拥有自己的Network Namespace,但是并不为Docker容器进行任何网络配置,也就是说,这个Docker容器没有网卡,IP,路由等信息,需要我们自己为Docker容器进行手动添加,配置IP(很麻烦不采用)
这种网络配置下的容器只有lo回环网卡(localhost:127.0.0.1),没有其他网络网卡,none模式可以在容器创建时通过--network=nono来指定,这类网络不能联网,但是最安全的
四,Bridge模式(主流使用)
当Docker进程启动是,会在主机上创建一个名为docker0的虚拟网桥,此主机启动的Docker容器会自动连接到这种虚拟网桥上,虚拟网桥的工作方式和物理交换机类似,这样主机上所有的容器就通过交换机连在一个二层网络中
从docker0子网中分配一个IP地址给容器,并设置docker0的IP地址为容器的默认网关,在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端连接新创建的容器,并命名为etho(容器网卡),另一端连接主机,并将网络设备加入到docker0网桥中,可以通过brctl show命令查看
bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式
二,Docker网络配置
一,自定义网桥
Docker提供了自定义网桥配置,用户可以根据需要自己创建网桥让容器使用,而不需要使系统默认的网桥
注:系统默认是单网桥(docker0),非自定义,容器会默认连接docker0
二,docker网络配置指令
docker通过命令docker network配置各种网络
- connect:将容器连接到网络(--link可以配置容器模式)
- create:创建一个网络
- disconnect:断开容器与网络的连接
- ls:查看网络列表
- inspect:查看网络的详细信息
- prune:删除未使用的网络
- rm:删除指定容器
1,创建网络:docker network create 网络名称
- -d:指定创建网络的模式(bridge,none,host)
- -o:设置驱动程序的默认选项
例:创建bridge模式名为wql的网络
docker network create -d bridge wql
2,容器连接网络(容器模式):docker network connect 网络名称 容器标识
- --alias:为容器添加网络范围的别名
- --ip:指定IP地址
- --link:实现两个容器的互联
1,将运行中的容器ctn1 连接/断连 到网络net1中,
$ docker network connect net1 ctn1 or $ docker network disconnect net1 ctn1
2, 给容器分配指定ip(192.168.10.10)
$ docker network connect --ip 192.168.10.10 net1 ctn1
3,使用--link实现两个容器互连
--link:在启动my-ctn2容器时,建立my-ctn1和my-ctn2容器间的连接,此时会在my-ctn2容器的/etc/hosts中添加域名解析。并且当容器IP变化时,docker会自动维护映射关系
$ docker network connect --link my-ctn1 my-ctn2
3,查看网络列表:docker network ls
4,查看网络详细信息:docker network inspect 网络名称
5,删除指定网络:docker network rm 网络名称
6,删除未使用的网络:docker network prune
容器添加网络的两种方式
- 启动时容器添加网络:docker run --network=网络名称 镜像标识
- 启动后容器添加网络:docker network connect 网络名称 容器标识
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109