docker 简单介绍与安装

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

  • type-Ⅰ
  • type=Ⅱ

主机虚拟化是隔离最彻底的,但是由于多隔了一个虚拟的操作系统,性能会慢一些。

容器虚拟化(docker等)

隔离没有主机虚拟化强,但是由于没有多余的虚拟的操作系统,所有的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中的任务创建的数据报文的类别识别符

隔离能力对比

容器级虚拟化肯定比主机级虚拟化的隔离能力低。

理由:容器级虚拟化,是在同一个内核之上的;主机级虚拟化本身就是在不同的内核上。

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

posted @ 2019-11-30 14:38  小石王  阅读(614)  评论(0编辑  收藏  举报