Docker基础入门总结

1、什么是Docker

   官方文档描述:“Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.”前端

  一句话归纳容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。docker

  • Docker使用Google公司推出的Go语言进行开发实现,基于Linux内核的cgroup,namespace,以及AUFS类的UnionFS等技术,对进程进行封装隔离,属于操做系统层面的虚拟化技术。 因为隔离的进程独立于宿主和其它的隔离的进程,所以也称其为容器。Docke最初实现是基于LXC。
  • 容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的全部内容:代码、运行时环境、系统工具、系统库和设置。数据库

  • 容器化软件适用于基于Linux和Windows的应用,在任何环境中都可以始终如一地运行。后端

  • 容器赋予了软件独立性,使其免受外在环境差别(例如,开发和预演环境的差别)的影响,从而有助于减小团队间在相同基础设施上运行不一样软件时的冲突。centos

  再来看看容器较为通俗的解释:
  若是须要通俗的描述容器的话,我以为容器就是一个存放东西的地方,就像书包能够装各类文具、衣柜能够放各类衣服、鞋架能够放各类鞋子同样。咱们如今所说的容器存放的东西可能更偏向于应用好比网站、程序甚至是系统环境。bash

              

2、为何要用Docker

  • Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现“这段代码在我机器上没问题啊”这类问题;——一致的运行环境服务器

  • 能够作到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。——更快速的启动时间网络

  • 避免公用的服务器,资源会容易受到其余用户的影响。——隔离性架构

  • 善于处理集中爆发的服务器使用压力;——弹性伸缩,快速扩展app

  • 能够很轻易的将在一个平台上运行的应用,迁移到另外一个平台上,而不用担忧运行环境的变化致使应用没法正常运行的状况。——迁移方便

  • 使用Docker能够经过定制应用镜像来实现持续集成、持续交付、部署。——持续交付和部署

3、Docker容器与虚拟机的区别

   简单来讲: 容器和虚拟机具备类似的资源隔离和分配优点,但功能有所不一样,由于容器虚拟化的是操做系统,而不是硬件,所以容器更容易移植,效率也更高。

  传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操做系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有本身的内核,并且也没有进行硬件虚拟。所以容器要比传统虚拟机更为轻便。

  二者对比图

        

  容器与虚拟机 (VM) 总结

          

  • 容器是一个应用层抽象,用于将代码和依赖资源打包在一块儿。 多个容器能够在同一台机器上运行,共享操做系统内核,但各自做为独立的进程在用户空间中运行 。与虚拟机相比, 容器占用的空间较少(容器镜像大小一般只有几十兆),瞬间就能完成启动 。

  • 虚拟机(VM)是一个物理硬件层抽象,用于将一台服务器变成多台服务器。 管理程序容许多个VM在一台机器上运行。每一个VM都包含一整套操做系统、一个或多个应用、必要的二进制文件和库资源,所以占用大量空间。并且VM启动也十分缓慢 。 

  经过Docker官网,咱们知道了这么多Docker的优点,可是你们也没有必要彻底否认虚拟机技术,由于二者有不一样的使用场景。虚拟机更擅长于完全隔离整个运行环境。例如,云服务提供商一般采用虚拟机技术隔离不一样的用户。而Docker一般用于隔离不一样的应用 ,例如前端,后端以及数据库。就我目前项目而言,对于二者无所谓谁会取代谁,而是二者能够和谐共存。
  容器与虚拟机(VM)二者共存:

          

3、Docker的基本概念

  Docker 中包括三个基本的概念:

  • Image(镜像)
  • Container(容器)
  • Repository(仓库)

            

   Image(镜像)

  镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是 Docker 的核心。
  那么镜像究竟是什么呢?Docker 镜像能够看做是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
  镜像不包含任何动态数据,其内容在构建以后也不会被改变。镜像(Image)就是一堆只读层(read-only layer)的统一视角,也许这个定义有些难以理解,下面的这张图可以帮助读者理解镜像的定义: 
              

  从左边咱们看到了多个只读层,它们重叠在一块儿。除了最下面一层,其余层都会有一个指针指向下一层。这些层是 Docker 内部的实现细节,而且可以在主机的文件系统上访问到。
统一文件系统(Union File System)技术可以将不一样的层整合成一个文件系统,为这些层提供了一个统一的视角。这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。咱们能够在图片的右边看到这个视角的形式。

  镜像有多种生成方法:

  • 从无到有开始建立镜像

  • 下载并使用别人建立好的现成的镜像

  • 在现有镜像上建立新的镜像

   咱们能够将镜像的内容和建立步骤描述在一个文本文件中,这个文件被称做 Dockerfile ,经过执行 docker build命令能够构建出 Docker 镜像。


  Container(容器)
  容器(Container)的定义和镜像(Image)几乎如出一辙,也是一堆层的统一视角,惟一区别在于容器的最上面那一层是可读可写的。 

              

  因为容器的定义并无说起是否要运行容器,因此实际上,容器 = 镜像 + 读写层。


  Repository(仓库)
  Docker 仓库是集中存放镜像文件的场所。镜像构建完成后,能够很容易的在当前宿主上运行。
  可是, 若是须要在其余服务器上使用这个镜像,咱们就须要一个集中的存储、分发镜像的服务,Docker Registry(仓库注册服务器)就是这样的服务。
  有时候会把仓库(Repository)和仓库注册服务器(Registry)混为一谈,并不严格区分。
  Docker 仓库的概念跟 Git 相似,注册服务器能够理解为 GitHub 这样的托管服务。
  实际上,一个 Docker Registry 中能够包含多个仓库(Repository),每一个仓库能够包含多个标签(Tag),每一个标签对应着一个镜像。
  因此说,镜像仓库是 Docker 用来集中存放镜像文件的地方,相似于咱们以前经常使用的代码仓库。
  一般,一个仓库会包含同一个软件不一样版本的镜像,而标签就经常使用于对应该软件的各个版本 。
  咱们能够经过<仓库名>:<标签>的格式来指定具体是这个软件哪一个版本的镜像。若是不给出标签,将以 Latest 做为默认标签。
  仓库又能够分为两种形式:

  • Public(公有仓库)
  • Private(私有仓库)

  Docker Registry 公有仓库是开放给用户使用、容许用户管理镜像的 Registry 服务。
  通常这类公开服务容许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
  除了使用公开服务外,用户还能够在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 镜像,能够直接使用作为私有 Registry 服务。
  当用户建立了本身的镜像以后就可使用 Push 命令将它上传到公有或者私有仓库,这样下次在另一台机器上使用这个镜像时候,只须要从仓库上 Pull 下来就能够了。
  以上咱们主要把 Docker 的一些常见概念如 Image,Container,Repository 作了详细的阐述,也从传统虚拟化方式的角度阐述了 Docker 的优点。

4、Docker的架构

  咱们从下图能够直观地看到 Docker 的架构: 
            

  Docker 使用 C/S 结构,即客户端/服务器体系结构。Docker 客户端与 Docker 服务器进行交互,Docker服务端负责构建、运行和分发 Docker 镜像。
  Docker 客户端和服务端能够运行在一台机器上,也能够经过 RESTful 、 Stock 或网络接口与远程 Docker 服务端进行通讯。 
          

  这张图展现了 Docker 客户端、服务端和 Docker 仓库(即 Docker Hub 和 Docker Cloud ),默认状况下 Docker 会在 Docker 中央仓库寻找镜像文件。
  这种利用仓库管理镜像的设计理念相似于 Git ,固然这个仓库是能够经过修改配置来指定的,甚至咱们能够建立咱们本身的私有仓库。

5、Docker经常使用命令

  咱们能够经过 docker -h 去查看命令的详细的帮助文档。在这里会讲一些平常咱们可能会用的比较多的一些命令。 
              

例如,咱们须要拉取一个 Docker 镜像,咱们能够用以下命令:

docker pull image_name

image_name 为镜像的名称,而若是咱们想从 Docker Hub 上去下载某个镜像,咱们可使用如下命令:

docker pull centos:latest

cento:lastest 是镜像的名称,Docker Daemon 发现本地没有咱们须要的镜像,会自动去 Docker Hub 上去下载镜像,下载完成后,该镜像被默认保存到 /var/lib/docker 目录下。
接着咱们若是想查看主机下存在多少镜像,咱们能够用以下命令:

docker images

咱们要想知道当前有哪些容器在运行,咱们能够用以下命令:

docker ps -a

-a 是查看当前全部的容器,包括未运行的。咱们该如何去对一个容器进行启动,重启和中止呢?
咱们能够用以下命令:

docker start container_name/container_id

docker restart container_name/container_id

docker stop container_name/container_id

这个时候咱们若是想进入到这个容器中,咱们可使用 attach 命令:

docker attach container_name/container_id

那若是咱们想运行这个容器中的镜像的话,而且调用镜像里面的 bash ,咱们可使用以下命令:

docker run -t -i container_name/container_id /bin/bash

那若是这个时候,咱们想删除指定镜像的话,因为 Image 被某个 Container 引用(拿来运行),若是不将这个引用的 Container 销毁(删除),那 Image 确定是不能被删除。
咱们首先得先去中止这个容器:

docker ps

docker stop container_name/container_id

而后咱们用以下命令去删除这个容器:

docker rm container_name/container_id

而后这个时候咱们再去删除这个镜像:

docker rmi image_name

经常使用的 Docker 相关的命令就讲到这里为止了,咱们在后续的文章中还会反复地提到这些命令。

 

参考文献:

https://docs.docker.com/engine/docker-overview/

https://mp.weixin.qq.com/s/9--UJYVJXVr92RCX36R6Vg

 

                                --- END ---