主机虚拟化是隔离最完全的,可是因为多隔了一个虚拟的操做系统,性能会慢一些。html
隔离没有主机虚拟化强,可是因为没有多余的虚拟的操做系统,全部的docker都运行在一个内核之上,性能会好。node
无论什么样的虚拟化如下信息都须要是各自独立的:linux
缩写 | 说明 |
---|---|
uts | 主机名和域名 |
mount | 挂载点(文件系统) |
IPC | 信号量,消息队列和共享内存 |
PID | 进程ID |
network | 网卡,tcp套接字,网络设备,端口等 |
user | 用户和用户组 |
要想实现以上功能nginx
必须使用linux内核提供namespace功能,经过系统调用(clone(),setns()等)。c++
主机虚拟化:在建立系统的时候,就能够指定使用几个cpu,多大的内存等外设。web
容器虚拟化:经过linux内核提供的control groups(Cgroups)功能,来控制各个容器,使用多少cpu,内存等。redis
Cgroups能够控制如下设备:docker
缩写 | 说明 |
---|---|
blkio | 块设备IO |
cpu | CPU |
cpuacct | CPU资源使用报告 |
cpuset | 多处理器平台上的CPU集合 |
devices | 设备访问 |
freezer | 挂起或恢复任务 |
memory | 内存用量和报告 |
perf_event | 对cgroup中的任务进行统一性能测试 |
net_cls | cgroup中的任务建立的数据报文的类别识别符 |
容器级虚拟化确定比主机级虚拟化的隔离能力低。shell
理由:容器级虚拟化,是在同一个内核之上的;主机级虚拟化自己就是在不一样的内核上。json
那些系统调用是须要写程序的,不是谁都能用的好。因此要有一个便于使用的现成的工具就行了。
这些现成的工具备个名字:LXC(LinuX Container),这些工具包含下面的命令(这些命令须要额外安装:sudo apt install lava-lxc-mocker,sudo apt install lxc-utils):
当用上面的命令建立好生成环境后,如何迁移,坏了如何恢复,如何建立成百上千的生成环境,仍是个棘手的问题。
docker把整个环境打包成一个镜像文件,之后再使用的时候,直接把镜像文件拿过来就可使用。好比你想使用一个ubuntu环境,那就能够找到一个安装了ubuntu的docker镜像文件。好比你想使用nginx环境,那就能够找到一个安装了nginx的docker镜像文件。
从运维角度看:假如某个安装了nginx的docker环境出现问题了,运维人员要去调查,首先运维人员要先进入到这个docker环境,调查也须要工具(好比ps,top等),这些工具若是docker里没有安装的话,还须要额外安装,对运维人员来讲很麻烦。若是一个软件系统由不少docker组成,那么每一个docker里都要安装调试工具。
从开发角度看:任何语言,只要在一个环境上开发,而后打成docker,就能够在任意支持docker的操做系统环境上运行了,这是极大的便利。真正达到了一次开发处处部署,运行。
从软件部署角度看:因为每一个docker里基本就一个core进程,要把这些进程编排到一块儿,也不容易。
从系统角度看:假设你的软件使用的操做系统是ubuntu,web服务器是nginx,缓存是redis。那么你就须要一个ubuntu的docker,nginx的docker,redis的docker。想象一下nginx的docker和redis的docker里其实也是有操做系统的,再加上ubuntu操做系统,就有了3个操做系统,产生了浪费。因此docker必须解决这个问题。采用【分层构建,联合挂载】。
也就是说让nginx的docker和redis的docker里不包含操做系统,让nginx的docker和redis的docker使用的操做系统是ubuntu的docker里的ubuntu操做系统。
从编排角度看:一个软件系统里包括不少别的子系统,每一个子系统里有若干的进程,每一个进程基本都是一个docker,这些子系统有执行的前后顺序,和依赖关系,如何组织好这一大堆的docker是个难点。全部就出现了一堆的docker编排工具,最厉害的就是Kubernetes (这个单词来自于希腊语,含义是舵手或领航员。K8S是它的缩写,用“8”字替代了“ubernete”这8个字符。)。K8S的创造者,是众人皆知的行业巨头——Google。 K8S并非一件全新的发明。它的前身,是Google本身捣鼓了十多年的Borg系统。 Google为了代表之后本身独自作大,创建了CNCF组织,ibm,aws等也加入其中,让K8S健康发展
还有下面的编排工具:
docker是C/S架构的,server端是个守护进程,经过unix socket和client通讯,因此server端和client端必须在同一台物理机器上。client和server通讯的应用层协议是https。docker先从registry下载镜像(imags)文件,而后加载镜像文件到container里。而后client端就能够操做了。
1,docker deamon:server端守护进程。
2,docker clinet:客户端。
3,docker registries:docker仓库,目前就是docker hub。国内访问docker hub很慢。可使用阿里的加速,可是必须注册成为阿里的开发者,阿里才会提供加速连接。你们要想一个问题,每一个镜像都有版本,好比nginx有不少版本,如何特定到具体版本呢,docker经过,仓库名:版本号来肯定惟一一个镜像。好比想要nginx1.15的docker镜像,那么就使用【nginx:1.15】。因此能够看出来,仓库名就是应用程序的名字。
对docker object均可以进行增删改查操做,经过restful方式
1,备份
$ mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
2,编辑/etc/yum.repos.d/CentOS-Base.repo
参考清华的内容
3,以后运行yum makecache生成缓存
$ sudo yum makecach
1,去清华镜像下载docker-ce.repo
文件。并保存在目录:/etc/yum.repos.d/
下
2,修改docker-ce.repo
文件,把【download.docker.com】替换成【mirrors.tuna.tsinghua.edu.cn/docker-ce】
3,执行yum repolist
,若是以下,发现有docker-ce。
Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile repo id repo name status base/7/x86_64 CentOS-7 - Base 10,097 docker-ce-stable/x86_64 Docker CE Stable - x86_64 56 extras/7/x86_64 CentOS-7 - Extras 305 updates/7/x86_64 CentOS-7 - Updates 738 repolist: 11,196
4, 执行docker安装命令:sudo yum install docker-ce
注意:这里的名字是【docker-ce】,不是【docker】
5,因为默认的docker仓库在国外,访问速度慢,因此配置一个国内的docker加速器。
建立文件: /etc/docker/daemon.json
把下面内容加进去。
//docker cn的加速镜像 { "registry-mirrors": ["https://registry.docker-cn.com"] }
国内的docker 镜像:
6,启动/从新启动docker 守护(daemon)进程
# systemctl start docker.service # systemctl restart docker.service
7,docker 老版本命令再也不推荐使用
新版本把命令作了大的分类,以下:
Management Commands: builder Manage builds config Manage Docker configs container Manage containers context Manage contexts engine Manage the docker engine image Manage images network Manage networks node Manage Swarm nodes plugin Manage plugins secret Manage Docker secrets service Manage services stack Manage Docker stacks swarm Manage Swarm system Manage Docker trust Manage trust on Docker images volume Manage volumes
老版本使用create命令时,用docker create
,新版本也可使用这个命令。新版本把命令都归类了,因此建立容器的话,用docker container create
也是和老版本的docker create
的功能是同样的,推荐仍是使用新版本的命令。如今是为了兼容老版本,因此老版本的命令还保留着。
9,检查docker是否安装成功:docker version
或者docker info
# docker info
结果以下:说明docker安装成功了!
Client: Debug Mode: false Server: Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 19.03.2 Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 894b81a4b802e4eb2a91d1ce216b8817763c29fb runc version: 425e105d5a03fabd737a126ad93d62a9eeede87f init version: fec3683 Security Options: seccomp Profile: default Kernel Version: 3.10.0-957.el7.x86_64 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x86_64 CPUs: 1 Total Memory: 3.701GiB Name: localhost.localdomain ID: D7NH:N5X6:KM6Y:Q6L4:TEUV:BWSG:X3YH:LLMZ:UEC3:T2ID:A6RB:2XSF Docker Root Dir: /var/lib/docker Debug Mode: false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Registry Mirrors: https://registry.docker-cn.com/ Live Restore Enabled: false
Storage Driver: overlay2
上面说的【采用分层构建,联合挂载】要能过被使用的话,必须是【overlay2】
Registry Mirrors:https://registry.docker-cn.com/
说明上面设置的加速器生效了。