docker安装使用
容器:
- 容器提供一个基本得独立环境。实现容器隔离。资源限制
- 主要解决应用层面问题,应用快速部署,高效管理
虚拟机:
- 提升服务器资源利用率
- 提供一个完全隔离得环境
Docker是什么?
使用最广泛得开源容器引擎
一种操作系统级得虚拟化技术
依赖于linux内核特性:Namespace(资源隔离)和Cgroup(资源限制)
为什么使用容器?
1.上线流程繁琐
开发-->测试-->申请资源-->审批-->部署-->测试等环节
2.资源利用率低
普遍服务器利用率低,造成过多浪费
3.扩容/缩容不及时
业务高峰期扩容流程繁琐,上线不及时
4.服务器环境臃肿
服务器越来越臃肿,对维护、迁移带来困难
5环境不一致性
Docker应用场景
1.应用程序打包和发布
2.应用程序隔离
3.持续集成
4.部署微服务
5.快速搭建测试环境
6.提供pass产品(平台即服务)
安装docker,安装依赖包
#yum install -y yum-utils
添加docker软件包源
#yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装docker CE
#yum -y install docker-ce
启动docker服务并设置开机启动
Systemctl start docker
Systemctl enable docker
镜像是什么?
一个分层存储的文件,不是一个单一的文件
一个软件的环境
一个镜像可以创建N个容器
一种标准化的交付
一个不包含linux内核而又精简的linux操作系统
镜像从哪里来
Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,docker工具默认从这个公共镜像库下载镜像
配置镜像加速器
vim /etc/docker/daemon.json
{
"registry-mirrors":["https://b9pmyelo.mirror.aliyuncs.com"]
}
镜像与容器联系
当启动一个新的容器时,docker会加载只读镜像,并在其之上添加一个读写层,即容器层
1.Docker命令最后一个指定镜像
2.默认镜像版本latest
3.分层下载
/var/lib/docker/overlay2/ 镜像存储目录
/var/lib/docker/containers/ 容器目录
rootfs:根文件系统
bootfs:引导文件系统
镜像管理的常用命令
ls 列出镜像
build 构建镜像来自dockefile
history 查看镜像历史
inspect 显示一个或多个镜像详细信息
pull 从镜像仓库拉取镜像
push 推送一个镜像到镜像仓库
rm 移除一个或多个镜像
prune 移除没有被标记或者没有任何容器引用的镜像
tag 创建一个引用源镜像标记目标镜像
export 导出容器文件系统tar归档文件
import 导入容器文件系统tag归档文件创建镜像
save 保存一个或多个镜像到一个tar归档文件
load 加载镜像来自tar归档或标准输入
创建容器常用选项
-i,-interactive 交互式
-t,tty 分配一个伪终端
-d,-detach 运行容器到后台
-e,-env 设置环境变量
-p,-publish list 发布容器端口到主机
-P,-publish-all 发布容器所有EXPOSE的端口到宿主机
--name string 指定容器主机名
-h,-hostname 设置容器主机名
--ip string 指定容器ip,只能用于自定义网络
--network 连接容器到一个网络
--mount mount 将文件系统附加到容器
-v,-volume list 绑定挂载一个卷
--restart string 容器退出时重启策略,默认no,可选值:[always|on-failure]
# docker images #查看镜像
# docker search 镜像名称 #搜索镜像
#docker rmi 镜像名称:镜像标签 #删除镜像
#docker pull 镜像名称:镜像标签 #下载镜像
# docker push 要上传的镜像名称:镜像标签 #上传镜像
# docker save -o 文件名称.tar 新镜像名称:镜像标签 # 备份镜像
# -o选项指定将镜像备份到哪个文件
备份多个镜像
docker save $(docker images | grep -v REPOSITORY | awk 'BEGIN{OFS=":";ORS=" "}{print $1,$2}') -o haha.tar
# docker load -i 备份文件名称.tar #恢复镜像
# docker inspect 镜像名称:镜像标签 #查看镜像信息
# docker history 镜像名称:镜像标签 #查看镜像的制作历史
# docker cp 本机文件路径 容器id:容器内路径 #该命令可以将真机的某个文件上传到容器中的某个路径下
# docker cp 容器id:容器内路径 本机文件路径 #该命令可以将容器中的某个文件下载到真机的某个路径下
示例:
docker run -d -e ABC=123 -e CDE=456 -p 8888:80 --name nginx -h web --restart=always nginx
restart是设置服务器开启后容器自动启动
--dns,hosts 修改hosts
--add-host ,resolv.conf 修改resolv.conf
容器资源限制
-m,--memory 容器可以使用的最大内存量
--memory-swap 允许交换到磁盘的内存量
--memory-swappiness=<0-100> 容器使用SWAP分区交换的百分比(0-100,默认为-1)
--oom-kill-disable 禁用OOM Killer
--cpus 可以使用的cpu数量
--cpuset-cpus 限制容器使用特定的CPU核心,如(0-3,0,1)
--cpu-shares cpu共享(相对权重)
镜像怎么高效存储?联合文件系统(UnionFS)
引入联合文件系统,将镜像多层文件联合挂载到容器文件系统
镜像是只读的,类似共享形式让多个容器使用,如果要在容器里修改文件,即镜像里的文件,该怎么办?
引入写时复制(copy-on-write),需要修改文件操作时,会先从镜像里把要写的文件复制到自己的文件系统中进行修改
默认创建的容器使用宿主机的所有资源
示例:
内存限制:
允许容器最多使用500M内存和100M的swap,并禁用OOM killer:
docker run -d --name nginx03 --memory=”500m” --memory-swap=”600m” --oom-kill-disable nginx
Cpu限制:
允许容器最多使用一个半的cpu:
docker run -d --name nginx04 --cpus=”1.5” nginx
允许容器最多使用50%的cpu:
docker run -d --name nginx05 --cpus=”.5” nginx
docker stats 容器id 查看资源的限制状态
docker update 更新容器配置
docker update -m=”512m” 容器id
docker run -d -m="512m" nginx
docker stats 713245
docker update -m="518m" 713245
docker stats 713245
容器实现核心技术:Namespace
在容器化中,一台物理计算机可以运行多个不同操作系统,那就需要解决”隔离性“,彼此感知不到对方存在,有问题互不影响
Linux内核从2.4.19版本开始引入namespace概念,其目的是将特定的全局系统资源通过抽象方法使得namespace中的进程看起来拥有自己隔离的资源,docker就是借助这个机制实现容器资源隔离。
Linux的namespace机制提供了6中不同命名空间
IPC:隔离进程间通信
MOUNT:隔离文件系统挂载点
NET:隔离网络协议栈
PID:隔离进程号,进程命名空间是一个父子结构,子空间对父空间可见
USER:隔离用户
UTS:隔离主机名和域名
容器实现核心技术:CGroups
Docker利用namespace实现了容器之间资源隔离,但namespace不能对容器资源限制,引入CGroups,限制容器资源
CGroups:所有的任务就是运行在系统中的一个进程,而CGroups以某种标准将一组进程为目标进行资源分配和控制。列如cpu、内存、带宽等,并且可以动态配置。
CGroups主要功能:
限制进程组使用的资源数量:可以为进程组设定资源使用上限,列如内存
进程组优先级控制:可以为进程组分配特定cpu、磁盘io吞吐量
记录进程使用的资源数量:列如使用记录某个组使用的cpu时间
进程组控制:可以将进程组挂起和恢复
ls /sys/fs/cgroup/ -l 查看cgroups可控制的资源
Blkio:对块设备的io进行限制
容器实际资源限制位置:
/sys/fs/cgroups/<资源名>/docker/<容器id>
docker核心组件之间关系
Docker daemon:docker守护进程,负责与docker clinet交互,并管理镜像容器
Containerd:是一个最简单守护进程,向上给docker daemon提供接口,向下通过containerd-shim结合runC管理容器
runC:一个命令行工具,它根据oci标准来创建和运行容器
ps -ajxf | grep docker 查看进程树
Namespace
命名空间,linux内核提供的一种对进程资源隔离的机制,列如进程、网络、挂载点等资源
CGroups
控制组,linux内核提供的一种对进程组限制资源的机制;例如cpu、内存等资源
UnionFS
联合文件系统,支持将不同位置的目录挂载到同一虚拟文件系统。形成一种分层的模型

浙公网安备 33010602011771号