docker 简单介绍与安装

主机虚拟化(vmware,visual box等)

  • type-Ⅰ
  • type=Ⅱ

主机虚拟化是隔离最完全的,可是因为多隔了一个虚拟的操做系统,性能会慢一些。html

容器虚拟化(docker等)

隔离没有主机虚拟化强,可是因为没有多余的虚拟的操做系统,全部的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

linux内核都提供了上述的隔离能力所用到的系统调用了,那还有docker什么事呢?

那些系统调用是须要写程序的,不是谁都能用的好。因此要有一个便于使用的现成的工具就行了。

这些现成的工具备个名字:LXC(LinuX Container),这些工具包含下面的命令(这些命令须要额外安装:sudo apt install lava-lxc-mocker,sudo apt install lxc-utils):

  • lxc-create:假如在red hat上安装一个utuntu。lxc-create提供了不少模板,对应不一样的linux发行版,而后根据模板去远程仓库里找相应的包,下载到本地后,进行安装。

当用上面的命令建立好生成环境后,如何迁移,坏了如何恢复,如何建立成百上千的生成环境,仍是个棘手的问题。

docker就是解决上面问题的。它就是LXC的二次封装。注意它不是容器技术,容器技术是linux内核的。它只是把容器技术简化,容易使用而已。

docker把整个环境打包成一个镜像文件,之后再使用的时候,直接把镜像文件拿过来就可使用。好比你想使用一个ubuntu环境,那就能够找到一个安装了ubuntu的docker镜像文件。好比你想使用nginx环境,那就能够找到一个安装了nginx的docker镜像文件。

  • lxc的主要用途是隔离了一个系统
  • docker主要用途是隔离一个用户进程,好比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健康发展

    还有下面的编排工具:

    • nmp
    • machine+swarm+compose
    • mesos+marathon

docker结构图:

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 objects

对docker object均可以进行增删改查操做,经过restful方式

  • imags:镜像文件。注意:它是只读的,很重要。好比nginx镜像,你能够随意使用它,可是不能改里面的东西。由于有多是多个别的进程使用它,若是不是只读的,别其中一个进程修改了内容,那就影响了其余的进程,也就失去了隔离的意义。
  • contains:加载镜像,运行后,产生的进程。
  • imags/和contains的关系:images就是一个存放在硬盘上的可执行程序(好比是/bin/ls);contains则是运行/bin/ls的进程,能够运行屡次,运行完,进程就结束消失了,可是/bin/ls仍是存在。因此它俩的关系就是,程序和进程的关系。
  • network:网络
  • volumes:contains运行时,使用的存储介质(卷)
  • plugin:插件。

centos7的yum源替换成清华大学的源

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

在centos7下安装docker

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 镜像:

  • docker cn
  • 阿里云加速器
  • 中国科技大学

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/

    说明上面设置的加速器生效了。

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

相关文章
相关标签/搜索