主机虚拟化是隔离最彻底的,但是由于多隔了一个虚拟的操作系统,性能会慢一些。
隔离没有主机虚拟化强,但是由于没有多余的虚拟的操作系统,所有的docker都运行在一个内核之上,性能会好。
不管什么样的虚拟化以下信息都需要是各自独立的:
缩写 | 说明 |
---|---|
uts | 主机名和域名 |
mount | 挂载点(文件系统) |
IPC | 信号量,消息队列和共享内存 |
PID | 进程ID |
network | 网卡,tcp套接字,网络设备,端口等 |
user | 用户和用户组 |
要想实现以上功能
必须使用linux内核提供namespace功能,通过系统调用(clone(),setns()等)。
主机虚拟化:在创建系统的时候,就可以指定使用几个cpu,多大的内存等外设。
容器虚拟化:通过linux内核提供的control groups(Cgroups)功能,来控制各个容器,使用多少cpu,内存等。
Cgroups可以控制以下设备:
缩写 | 说明 |
---|---|
blkio | 块设备IO |
cpu | CPU |
cpuacct | CPU资源使用报告 |
cpuset | 多处理器平台上的CPU集合 |
devices | 设备访问 |
freezer | 挂起或恢复任务 |
memory | 内存用量和报告 |
perf_event | 对cgroup中的任务进行统一性能测试 |
net_cls | cgroup中的任务创建的数据报文的类别识别符 |
容器级虚拟化肯定比主机级虚拟化的隔离能力低。
理由:容器级虚拟化,是在同一个内核之上的;主机级虚拟化本身就是在不同的内核上。
那些系统调用是需要写程序的,不是谁都能用的好。所以要有一个便于使用的现成的工具就好了。
这些现成的工具有个名字: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/
说明上面设置的加速器生效了。
原文:https://www.cnblogs.com/xiaoshiwang/p/11962435.html