容器级虚拟化
1、容器的分类
lxc:linux container
openvz
docker
2、虚拟化分类
硬件级虚拟化
kvm,xen:有独立的操作系统,完全隔离的。最底层是硬件,再上一层是内核,再上层是虚拟出来的独立的虚拟主机,是完全隔离的。
库级别虚拟化:wine
最底层是硬件,上一层是内核,再上一层是库。
应用级虚拟化
jvm,java的虚拟技术,只是提供程序的运行环境。
3、Docker介绍
3.1、Docker:设计所需要的3个核心技术
NameSpace:名称空间
内核级别完成环境隔离,
chroot机制,
PID NameSpace:隔离PID号,都是独立的PID,linux2.6.24开始使用。
Network NameSpace:linux 2.6.29开始引用。网络设备,网络栈,端口等网络资源隔离。
User NameSpace:用户和用户组资源隔离,linux 3.8,docker依赖于linux内核的3.10
IPC NameSpace:进程间通信技术名称空间。进程间通信隔离。信号量,消息队列和共享内存的隔离,linux 2.6.19
UTS NameSpace:linux 2.6.19,主机名和域名的隔离。
Mount NameSpace:已识别的挂载文件系统隔离。挂载点资源隔离机制。linux 2.4.19
API:clone(),setns(),unshare(),主要调用接口。
CGroup
linxu Control Group,控制组,内核级功能,linux 2.6.24引用
限制,控制与分离一个进程组群的资源。配比资源,一个进程使用了CPU和内存的一部分资源。
资源:CPU,内存,IO
功能:
Resource limitation:资源限制,
Priorltization: 优先级控制。
Accounting:审计和统计,主要为计费。
Control: 挂起进程,恢复进程。
/sys/fs/cgroup:基于单根树状结构层级分配机制。
lssubsys -m
mount
CGroup子系统:subsystem
blkio:设定块设备的IO限制;
cpu: 设定cpu的限制。
cupacct: 报告cgroup中使用的CPU资源。
cpuset: 为cgroup中的进程分配cpu和内存资源。
memory: 设定内存的使用限制。
devices: 控制cgroup中的任务对设备的访问。
freezer: 挂起或回复cgroup中的任务。
net_cls: (classid),使用等级级别标识符,来标记网络数据包,以实现基于tc完成对不同cgroup种产生的流量控制。
perf_event: 性能控制相关的事件。使用后使cgroup中的任务可以进行统一的性能测试。
hugetlb: 转换后援缓冲器,对HugeTLB 系统进行限制,大页(大内存页)系统(减少内存分配的次数),默认内存页是4K,可以使用大页改变为2M。
CGroup中的术语:
task(任务):进程或线程;一个任务,只能属于一个cgroup。可以迁移。
cgroup: 一个控制组,一个独立的资源控制单位。可以包含一个或多个子系统。
subsystem: 子系统,需要关联至cgroup上。
hierarchy: 资源组的层级结构,树状结构。
AUFS: UnionFS(联合文件系统),在ubuntu的内核中引入。
UnionFS: 把不同的物理位置的目录合并到同一个目录中。实质:例如有1个目录test1另外有1个目录lufei1,其中test1和test2中有fstab的文件,lufei1 中有linux.txt文件,当使用UnionFS文件系统合并后,如果test1和test2在前边,则fstab文件是可读可写的,lufei1对这个文件只是可读,当lufei1在前边时,则linux.txt文件是可读可写的,fstab是可读的。
Another UFS,Alternatlve UFS, Adanced UFS,日本人写的高级UnionFS版本,docker强依赖于AUFS。CentOS不支持这种机制,但支持UFS功能。
Device mapper: 为底层设备提供抽象功能。
linux 2.6内核引入的最重要的技术之一,用于在内核中支持逻辑卷管理的通用设备映射技术,与AUFS原理相同。
Mappend Device
Mapping Table: 虚拟设备到物理设备之间的映射路径。
Target Device
C/S:
Docker Client:客户端发起docker相关请求。是用户使用docker的主要接口,docker client与docker daemon通信并将结构返回给用户。
Docker Server:容器运行的节点。docker deamon:运行于宿主机上,是docker守护进程,用户可通过docker client与其交互。
image:
镜像文件是只读的,用来创建container,一个镜像可以运行多个container;镜像文件可以通过dockerfile文件创建,也可以从docker hub/registry下载。
repository
存放镜像文件。可以网络上的,也可以是本局域网的。
公共创库:docker hub/registry
私有创库:docker registry
docker container: docker的运行实例,容器是一个隔离环境。
另外两个重要组件:
docker link:
docker volume: 存储持久化文件。
解决方案:
lxc:linux containers
openvz:
libcontainer:叫新系统版本(Cent OS 7)的docker使用的核心组件。
4、centos7安装docker
自动安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 官网安装
curl -sSL https://get.daocloud.io/docker | sh 国内 daocloud 一键安装命令
手动安装
卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
使用 Docker 仓库进行安装
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker
设置仓库
安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
yum install -y yum-utils device-mapper-persistent-data lvm2
使用以下命令来设置稳定的仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 官方仓库,较慢
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 阿里仓库
yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo 清华大学仓库
安装 Docker Engine-Community
yum -y install docker-ce docker-ce-cli containerd.io
列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序。
yum list docker-ce --showduplicates | sort -r
启动:sudo systemctl start docker
Docker 镜像加速
vim /etc/docker/daemon.json
{"registry-mirrors":["https://reg-mirror.qiniu.com/"]}
或者
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"hosts": [
"tcp://0.0.0.0:2375",
"unix:///var/run/docker.sock"
]
}
systemctl daemon-reload
systemctl restart docker
二进制安装:
wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz
tar zxvf docker-19.03.9.tgz
mv docker/* /usr/bin
开机自启配置
cat > /usr/lib/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF
mkdir /etc/docker
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"hosts": [
"tcp://0.0.0.0:2375",
"unix:///var/run/docker.sock"
]
}
EOF
systemctl daemon-reload
systemctl start docker
systemctl enable docker
systemctl status docker