docker是什么:开源的应用容器引擎。基于go语言开发的。主要是运行在linux系统当中的开源的轻量级的“虚拟机”。
docker的容器技术可以在一台主机上轻松的为任何应用创建一个轻量级的,可移植的,自给自足的容器
docker大的宿主机是linux系统。集装箱可以理解为相互隔离的容器(组件,应用程序APP)每个容器都是一个独立的应用程序
docker的设计宗旨:build,ship,and run any app anywhere
build:封装好的程序,只要部署即可使用。一次封装
ship and run any app:一次封装完成之后的app,可以在任何环境运行
anywhere:任意宿主机
一次封装,到处运行
封装,发布,部署,运行,维护,运行,销毁
可以一整套的方式管理应用程序的生命周期
docker为什么受欢迎
1、随时随地随处都可以用,灵活 ,再复杂的应用也可以实现容器化
2、轻量级,小型的,不完整的,最小化封装的程序,与宿主机共享内核
3、可互换性,可以随时的升级更新
4、便携式,本地可以构建,在云平台上也可以实现部署,在任何地方运行
5、可拓展,自动分发容器副本。
6、可堆叠,在一个宿主机上可以创建不同版本的同一容器,也可以是多个相同版本的同一容器
linux的命令空间
namespace 是一种内核的特性。允许将一组系统资源隔离,在一个命名空间中的进程在系统当中可以拥有独立的资源。
namespace的六项隔离措施:
1、UTS(命名空间) 系统调用参数:CLONE_NEWUTS,隔离内容:主机与域名,在UTS这个命名空间当中创建进程,进程可以看到自己的主机名和域名,与其他进程分割开
2、IPC 系统调用参数:CLONE_NEWIPC,隔离内容:信号量,消息队列,共享内存,在IPC这个命名空间之中,进程可以拥有一个独立的进程间通信资源。
3、PID 系统调用参数:CLONE_NEWPID,隔离内容:每个进程都有自己独立的进程号空间
4、network 系统调用参数:CLONE_NEWNET 隔离内容:网络设备,网络栈,以及端口
每个进程都有一个自己独立的网络资源。端口号。
5、mount 系统调用的参数:CLONE_NEWNS 隔离内容:挂载点,在mount这个命名空间之中,每个进程或者设备都有自己的文件系统挂载点,相互之间互不干扰
6、user CLONE_NEWUSER, 隔离不同的用户和用户组。
基于这六个隔离项,实现了容器和容器之间,以及容器和宿主机之间
docker的核心组件:
镜像:是docker的基础,最小单位,类似于虚拟机的ISO文件,一个镜像就是一个可执行的包,包里面包含了运行这个程序的所有内容(代码,配置文件,环境变量)
docker镜像也是一个压缩包,不是一个解压的文件,是一个环境部署的脚本,甚至包含了完整的操作系统
容器:docker的容器就是基于镜像运行起来的实例,可以启动,停止,删除,每一个容器都是相互隔离的,互不可见。
仓库:保存镜像,所有的镜像都是从仓库中拉取的,可以有两种,一个是公有仓库,一个是私有仓库
docker与虚拟机之间的区别:
特性 |
docker |
虚拟机 |
启动速度 |
秒级 |
分钟级 |
计算能力损耗 |
几乎无 |
损耗50% |
性能 |
接近于原生系统 |
弱于原生系统 |
系统支持量 |
磁盘足够上千个 |
硬件系统来看(几十个) |
隔离性 |
资源隔离 |
完全隔离 |
安全性 |
安全性差 |
安全性高 |
docker安装完毕之后,客户端和服务端都在一起,都运行在一台机器上
overlay2:docker使用的文件系统驱动
overlayFS:overlay file system :联合文件系统,用于适配宿主机的文件系统,可以自动识别
lowerDir
upperDir
MergeDir
worDie
1、docker的镜像进行操作
docker search 镜像名称
lowerDir:底层目录,docker的底层文件系统。是一个或者多个镜像文件的根文件系统
UpperDir:可写层:可以在容器运行时,在容器内进行写操作,实现容器的可写性
MergerDir:合并目录:lowerdir和upperDir合并起来,就是容器的文件系统,用户看到的也就是这个合并的视图
workDir:工作目录:处理文件系统的变更,当在容器内进行写操作时,overlayfs使用workdir来追踪文件系统的变更
一个镜像如果有多个标签,删除时,只是删除镜像,只剩最后一个,删除的就是镜像本身
如果镜像已经被容器使用,要先停止容器,再删除容器,最后再删除镜像。
docker create -it centoss:7 /bin/bash
-i:让容器开启标准输入,接受用户的输入命令
-t:给这个容器分配一个终端,一个虚拟的伪终端
-it:形成一个宿主机和容器之间形成一个可以交互shell命令行
-d:可以让创建的容器以守护进程在后台运行,容器所运行的程序
docker 镜像 三大核心
镜像 容器 仓库
docker search 搜索
docker pull nginx:版本号 获取镜像
docker images 查看系统内的镜像
docker rmi 删除镜像 如正在运行 可加 -f 强制删除 (删除了正在运行容器的镜像对容器会有影响么)
docker tag nginx:1.22.0(在镜像中已有标签) nginx:guoqi(给他新的标签)硬连接(复制了镜像)
docker save-o /opt/nginx.tar (一般用xxx.tar) 这个镜像要已存在
docker load -i xxx.tar
docker push pplok1230/nginix:guoqi
pplok:1230:dockerhup的用户名 镜像名称和标签
docker容器
-i
-t
-d
-itd:表示后台运行指定程序,而且创建一个交互式的shell,用户输入操作命令
docker run -itd nginx:1.22.0 --name test1 /bin/bash
如果容器中没有可执行命令,容器创建完成之后将会立刻退出
docker exec -it 容器名/容器ID
docker ps 只显示正在运行的容器
docker ps -a 显示所有容器 ,包括没有运行的容器
docker export -o guoqi.tar 容器名/容器id
docker import guoqi.tar --nginx:guoqi(尽量不要重复标签名)
docker cp 容器名/容器 ip:/etc/nginx/nginx.conf
docker的资源控制:
对容器使用宿主机的资源进行限制
CPU 内存 磁盘I/O
docker使用linux自带的功能cgroup
control grouos 是linux内核系统提供的一种可以限制,记录,隔离进程所使用的物理资源的机制
docker借助这个机制,来实现资源的控制
cgroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,分配控制的机制来实现资源控制
host:容器和宿主机共用一个网络命名空间
container容器和容器之间共用一个网络命令空间
其他的资源依然是隔离的
1、CPU资源控制:
linux通过CFS(completely Fair Scheduler 完全公平调度器),来调度各个进程对cpu的使用。CFS的调度100ms
我们也可以自定义容器的调度周期。以及在这个周期时间之内各个容器能够使用CPU的调度时间
--cpu-period 设置容器调度cpu的周期
--cpu-quota 设置在每个周期内,容器可以使用cpu时间
可以配置使用
CFS周期的有效范围:1ms -1s --cpu-period 1000-1000000
容器使用cpu的配额时间必须大于1ms --cpu-quota的值,必须是>=1000
cat cpu.cfs_period_us
100000
CFS调度周期的长度,微妙,在每个周期内,容器可以使用指定比例的CPU时间
设置容器占用cpu的权重比:需要多个容器才能生效
--cpu-shares 指定容器占用cpu份额高。模式权重1024.设置的值只能是1024的倍数
--cpu-shares是给每个容器使用cpu设置了相对的权重,权重高的,可以使用cpu的资源更多
磁盘I/O配置:
读
写
限制容器在磁盘上的读速度
oflag=direct
在使用dd获取空字符集是从文件系统的缓存当中输入,速度是比较快的,禁用文件系统缓存,直接把数据写入磁盘,可以更真实的测试设备的性能,模拟直接写入
清理docker占用的磁盘空间
删除创建容器时的缓存,以及无用的数据卷