docker安装使用

容器:

  1. 容器提供一个基本得独立环境。实现容器隔离。资源限制
  2. 主要解决应用层面问题,应用快速部署,高效管理

虚拟机:

  1. 提升服务器资源利用率
  2. 提供一个完全隔离得环境

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工具默认从这个公共镜像库下载镜像

地址:https://hub.docker.com

配置镜像加速器

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     交互式

-ttty            分配一个伪终端

-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-301

--cpu-shares                      cpu共享(相对权重)

 

镜像怎么高效存储?联合文件系统(UnionFS

引入联合文件系统,将镜像多层文件联合挂载到容器文件系统

 

镜像是只读的,类似共享形式让多个容器使用,如果要在容器里修改文件,即镜像里的文件,该怎么办?

引入写时复制(copy-on-write),需要修改文件操作时,会先从镜像里把要写的文件复制到自己的文件系统中进行修改

 

默认创建的容器使用宿主机的所有资源

示例:

内存限制:

允许容器最多使用500M内存和100Mswap,并禁用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就是借助这个机制实现容器资源隔离。

 

Linuxnamespace机制提供了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 daemondocker守护进程,负责与docker clinet交互,并管理镜像容器

 

Containerd:是一个最简单守护进程,向上给docker daemon提供接口,向下通过containerd-shim结合runC管理容器

 

runC:一个命令行工具,它根据oci标准来创建和运行容器

 

 

 

ps -ajxf | grep docker 查看进程树

 

Namespace

 

命名空间,linux内核提供的一种对进程资源隔离的机制,列如进程、网络、挂载点等资源

 

CGroups

 

控制组,linux内核提供的一种对进程组限制资源的机制;例如cpu、内存等资源

 

UnionFS

 

联合文件系统,支持将不同位置的目录挂载到同一虚拟文件系统。形成一种分层的模型

 

 

 

 

posted @ 2020-09-07 13:26  翟超  阅读(174)  评论(0)    收藏  举报