容器
容器就是一个视图隔离、资源可限制、独立文件系统的进程集合。所谓“视图隔离”就是能够看到部分进程以及具有独立的主机名等;控制资源使用率则是可以对于内存大小以及 CPU 使用个数等进行限制。容器就是一个进程集合,它将系统的其他资源隔离开来,具有自己独立的资源视图。
docker简介
- Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
- Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
- Docker 使用客户端-服务器 (C/S) 架构模式:
Docker 命令行工具,是用户使用Docker的主要方式,Docker client与Docker daemon通信并将结果返回给用户,Docker client也可以通过socket或者RESTful api访问远程的Docker daemon- LXC (Linux Container)容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。
- docker底层语言为go语言
相关网站
Docker官网:https://www.docker.com/ Docker hub :https://hub.docker.com/
docker 与传统虚拟化方式优缺点比较---优点
特性 | Docker | 传统虚拟化技术(KVM) |
启动速度 | 非常快(秒级) | 慢(分钟级) |
磁盘使用(模板文件) | 小(MB) | 大(GB) |
性能 | 一般于宿主机 | 比宿主机弱 |
单机系统支持量 | 大(千计) | 小(十计) |
管理及应用 | 更轻松的迁移和扩展 |
docker 与传统虚拟化方式优缺点比较---局限
- Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用
- LXC(Linux Container)是基于cgroup等linux kernel功能的,因此container的guest系统(Guest是指让给客人访问电脑系统的帐户)只能是linux base的
- 隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
- 网络管理相对简单,主要是基于namespace隔离
- cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)
- Docker对disk的管理比较有限
- container随着用户进程的停止而销毁,container中的log等用户数据不便收集
- Docker 隔离性没有传统虚拟化好,KVM等属于完全隔离
摘自:https://baike.baidu.com/item/Docker/13344470?fr=aladdin#1_4
Docker 的底层实现技术
1、namespace 资源隔离
- linux 内核从Linux 2.4.19 版本开始引入namespace的概念。其目的是作系统资源隔离,通过特定的方法使得namespace中的进程看起来拥有自己的全局系统资源(global system resource)。
linux内核中共实现的六种隔离:
- mount namespaces :Linux 2.4.19版本内核引入;主要用于隔离文件系统挂载点;使每个容器看上去都有整个文件系统
- UTS namespaces : LInux 2.6.19版本内核引入;主要用于隔离nodename和domainname两个系统标识;使每个容器都有自己的hostname和domainname
- IPC namespaces :Linux 2.6.19版本内核引入;主要用于隔离信号量,消息队列,共享内存;使只有在同一个IPC namespace 的进程之间才能互相通信; IPC(Inter-Process Communication,进程间通信)
- PID namespaces :Linux2.6.24版本内核引入;主要用于隔离进程ID;使每个PID namespace 中的进程可以有其独立的PID,每个容器可以有PID为1的root进程;同一进程在不同PID namespace中有不同的PID;容器中每个进程都有两PID 容器中的PID和宿主机中的PID
- Network namespaces:Linux2.6.29版本内核引入;主要用于隔离系统网络资源;使每个容器都有其独立的网络设备,IP地址,端口号,IP路由表等
- User namespaces
2、cgroup 资源限额
- cgroup (Control Group)Linux 操作系统通过 cgroup 可以设置进程使用 CPU、内存 和 IO 资源的限额。
[root@k8s-master /sys/fs/cgroupcgroup]# ls
blkio cpu cpuacct cpu,cpuacct cpuset devices freezer hugetlb memory net_cls net_cls,net_prio net_prio perf_event pids rdma systemd
在 /sys/fs/cgroup/memory/docker 目录中,Linux 会为每个容器创建一个 cgroup 目录,以容器长ID 命名:
╭─root@du-z ~
╰─➤ ls /sys/fs/cgroup/memory/docker/196ddbdaa07a5ebdc33cd78a6a575a13cc9319bfe46ed537872b9b960ea4e86b
cgroup.clone_children memory.memsw.failcnt
cgroup.event_control memory.memsw.limit_in_bytes
cgroup.procs memory.memsw.max_usage_in_bytes
memory.failcnt memory.memsw.usage_in_bytes
memory.force_empty memory.move_charge_at_immigrate
memory.kmem.failcnt memory.numa_stat
memory.kmem.limit_in_bytes memory.oom_control
memory.kmem.max_usage_in_bytes memory.pressure_level
memory.kmem.slabinfo memory.soft_limit_in_bytes
memory.kmem.tcp.failcnt memory.stat
memory.kmem.tcp.limit_in_bytes memory.swappiness
memory.kmem.tcp.max_usage_in_bytes memory.usage_in_bytes
memory.kmem.tcp.usage_in_bytes memory.use_hierarchy
memory.kmem.usage_in_bytes notify_on_release
memory.limit_in_bytes tasks
memory.max_usage_in_bytes
3、联合文件系统
Docker三核心
Docker Image(镜像)
- 文件的层次结构,以及包含如何运行容器的元数据, Dockerfile中的每条命令都会在文件系统中创建一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上。
- Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接实现。
- docker本地镜像的存放位置:Linux系统默认存放在/var/lib/docker/image/
Docker Container(容器)
- 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境,Docker 利用容器来运行应用。
- docker容器文件的存放位置:Linux系统默认存放在/var/lib/docker/containers/
Docker Hub/Registry(仓库)
- 仓库是集中存放镜像文件的场所,仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
- 仓库分为public registry和private registry
- 目前,最大的公开仓库是 Docker Hub(docker公司运营),存放了数量庞大的镜像供用户下载。
- Docker仓库用来保存我们的images,当我们创建了自己的image之后我们就可以使用push命令将它上传到公有或者私有仓库,这样下次要在另外一台机器上使用这个image时候,只需要从仓库上pull下来即可。
Docker 部署安装
docker-ce | 社区免费版 |
docker-ee | 企业收费版 |
第一步:注册阿里云账号并在阿里云“容器镜像服务”中获得加速
第二步:下载阿里云网站新版docker-ce
具体操作:
# vim docker-sbeed.sh
...
#!/bin/bash
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
mv docker-ce.repo /etc/yum.repos.d
yum install docker-ce -y
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
...
# bash docker-sbeed.sh