【Docker学习】1.基础入门


1 什么是Docker?

Docker是一款由Go语言编写,遵从Apache2.0协议开源的应用容器引擎,其容器完全使用沙箱机制,相互之间无任何接口。

Docker可以让开发者打包他们的应用以及依赖包到一个轻量级可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化

2 主要组成

先上图,一览下这个牛掰的开源引擎。

Docker架构示意图
  • Docker 使用客户端-服务器体系结构(C/S)。
  • Docker ClientDocker Daemon通信,后者负责构建、运行和分发 Docker 容器的繁重工作。
  • Docker Client和Docker Daemon可以在同一系统上运行,也可以将 Docker Client连接到远程 Docker Daemon。
  • Docker Client和Docker Daemon使用 REST APIUNIX 套接字网络接口进行通信。
  • 另一个 Docker Client是 Docker Compose,它允许您使用由一组容器组成的应用程序。

2.1 Docker Client

Docker Client,即客户端( docker ),是许多 Docker 用户与 Docker 交互的主要方式。当您使用诸如 docker run 之类的命令时,客户端会将这些命令发送到 dockerd 即Docker Daemon,后者会执行这些命令。该 docker 命令使用 Docker API

Docker 客户端可以与多个守护程序进行通信。

2.2 Docker Daemon

Docker Daemon,守护程序( dockerd )侦听 Docker API 请求并管理 Docker 对象,例如映像、容器、网络和卷。

守护程序还可以与其他守护程序通信以管理 Docker 服务。

2.3 Docker Image

即Docker镜像,相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

2.4 Docker Container

即容器,是通过镜像来创建。

容器和镜像的关系,可以类比看做面向对象程序设计中的对象和类的关系。镜像是静态的定义,是容器的源代码,而容器是镜像运行时的实体。

容器可以被创建、启动、停止、删除、暂停等。

2.5 Docker Registry

即注册表,也称作“代码仓库”,其保存了各种镜像。分公有私有

Docker Hub是任何人都可以使用的公共注册表,默认情况下,Docker 会在 Docker Hub 上查找映像。您甚至可以运行自己的私有注册表。

使用 docker pulldocker run命令时,Docker 会从配置的注册表中提取所需的映像。使用docker push命令时,Docker 会将映像推送到配置的注册表。

3 应用场景

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

4 优缺点

4.1 简化程序

开发者只需将自己的应用打包至可移植的容器当中,发布出去,其他使用者便可无差别的获取并使用,简化了开发流程。这种虚拟化方式,大大减少了沟通成本,更加方便开发者管理应用。

4.2 节省开支

传统通过服务器一步一步按照文档部署的历史已经渐渐退出舞台,运维或开发人员无需太多软件、插件安装来完善某个应用的部署环境,简单通过命令或操作台即可完成与开发者同样的应用部署,加上现有的云计算,既合理又充分利用了有限的资源,无需太多考虑其他硬件管理问题,改变了过去高性能必然高价格的思维定势,同时也改变了虚拟化的方式。

4.3 一致性

正如上节所说,使用者可以得到开发者同样的部署过程和应用运行环境,基本不会再出现“我机子上运行没问题,为何你那里就不行?”类似这种灵魂质问的问题。非常契合Docker的理念:一处构建,处处运行,也非常适合CI/CD,简化了开发流程。

4.4 隔离性

正如本文开头介绍docker所说的,docker容器完全使用沙箱机制,相互之间并无任何接口,所以可以起到隔离作用,比如这个项目需要MySQL5.2,那个项目需要用到MySQL5.7,甚至8.0+的版本,如果按照传统的物理机器部署方式,估计运维要疯了,如果服务器虚拟机不够,真的又要浪费一笔不小的运维开支,增加了企业成本。

另外,版本隔离也是能够通过docker简单实现且更加便利快捷,特别的,不同环境的应用隔离,使得开发、测试、预生产、生产环境互不影响,且可以实现无差别切换

4.5 更轻松的迁移

由于Docker确保了执行环境的一致性,使得应用的迁移更加容易.

Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。

因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的。

4.6 镜像问题

目前docker镜像并没有统一的标准,造成很多诸如版本混乱,功能阉割,这里不是批评多样性的问题,主要是指OS,很多工具要么被阉割,要么库包不全。

例如调试的时候需要 curl,wget,telnet,nslookup 等工具在镜像中没有。甚至 ps, top, free, find, netstat, ifconfig 命令都没有。

4.7 安装位置不统一

学习过Linux的都知道,文件管理是多么重要,对于docker而言,有的时候如果不看docker file,你很难知道其安装目录究竟在哪里。

另外引用下之前知乎网友对docker的缺点总结,仅此作为参考,总之,docker还不是完美的,完美的也不会总是存在。看你怎么用?用在什么地方?一句话,合适才是最好的。

Docker并不是全能的,设计之初也不是KVM之类虚拟化手段的替代品,简单总结几点:

1)Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用。

2)LXC是基于Cgroup等Linux kernel功能的,因此Container的Guest系统只能是Linux base的。

3)隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库。网络管理相对简单,主要是基于namespace隔离。

4)cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)。

5)docker对disk的管理比较有限。

6)container随着用户进程的停止而销毁,container中的log等用户数据不便收集。

文章作者: Kezade
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Kezade !
评论
  目录