浅谈Docker三两事

Docker 究竟是个什么东西呢?咱们在理解 Docker 以前,首先得先区分清楚两个概念,容器和虚拟机。
可能不少人都用过虚拟机,而对容器这个概念比较的陌生。咱们用的传统虚拟机如 VMware , VisualBox 之类的须要模拟整台机器包括硬件。
每台虚拟机都须要有本身的操做系统,虚拟机一旦被开启,预分配给它的资源将所有被占用。
每一台虚拟机包括应用,必要的二进制和库,以及一个完整的用户操做系统。
而容器技术是和咱们的宿主机共享硬件资源及操做系统,能够实现资源的动态分配。
容器包含应用和其全部的依赖包,可是与其余容器共享内核。容器在宿主机操做系统中,在用户空间以分离的进程运行。
容器技术是实现操做系统虚拟化的一种途径,可让您在资源受到隔离的进程中运行应用程序及其依赖关系。
经过使用容器,咱们能够轻松打包应用程序的代码、配置和依赖关系,将其变成容易使用的构建块,从而实现环境一致性、运营效率、开发人员生产力和版本控制等诸多目标。
容器能够帮助保证应用程序快速、可靠、一致地部署,其间不受部署环境的影响。
容器还赋予咱们对资源更多的精细化控制能力,让咱们的基础设施效率更高。
经过下面这幅图,咱们能够很直观的反映出这二者的区别所在:
浅谈Docker三两事
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
而 Linux 容器是 Linux 发展出的另外一种虚拟化技术,简单来说, Linux 容器不是模拟一个完整的操做系统,而是对进程进行隔离,至关因而在正常进程的外面套了一个保护层。
对于容器里面的进程来讲,它接触到的各类资源都是虚拟的,从而实现与底层系统的分离。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。
程序在这个虚拟容器里运行,就好像在真实的物理机上运行同样。有了 Docker,就不用担忧环境问题。
整体来讲,Docker 的接口至关简单,用户能够方便地建立和使用容器,把本身的应用放入容器。容器还能够进行版本管理、复制、分享、修改,就像管理普通的代码同样。
咱们能够从下面这张表格很清楚地看到容器相比于传统虚拟机的特性的优点所在:
浅谈Docker三两事
Docker 的三个基本概念:
浅谈Docker三两事
从上图咱们能够看到,Docker 中包括三个基本的概念:docker

Image(镜像)
Container(容器)
Repository(仓库)
服务器

镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是 Docker 的核心。网络

Image(镜像)
那么镜像究竟是什么呢?Docker 镜像能够看做是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
镜像不包含任何动态数据,其内容在构建以后也不会被改变。镜像(Image)就是一堆只读层(read-only layer)的统一视角,也许这个定义有些难以理解,下面的这张图可以帮助读者理解镜像的定义:
浅谈Docker三两事
从左边咱们看到了多个只读层,它们重叠在一块儿。除了最下面一层,其余层都会有一个指针指向下一层。这些层是 Docker 内部的实现细节,而且可以在主机的文件系统上访问到。
统一文件系统(Union File System)技术可以将不一样的层整合成一个文件系统,为这些层提供了一个统一的视角。
这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。咱们能够在图片的右边看到这个视角的形式。架构

Container(容器)tcp

容器(Container)的定义和镜像(Image)几乎如出一辙,也是一堆层的统一视角,惟一区别在于容器的最上面那一层是可读可写的。
浅谈Docker三两事
因为容器的定义并无说起是否要运行容器,因此实际上,容器 = 镜像 + 读写层。ide

Repository(仓库)学习

Docker 仓库是集中存放镜像文件的场所。镜像构建完成后,能够很容易的在当前宿主上运行。
可是, 若是须要在其余服务器上使用这个镜像,咱们就须要一个集中的存储、分发镜像的服务,Docker Registry(仓库注册服务器)就是这样的服务。
有时候会把仓库(Repository)和仓库注册服务器(Registry)混为一谈,并不严格区分。ui

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 的优点。
咱们从下图能够直观地看到 Docker 的架构:
浅谈Docker三两事
Docker 使用 C/S 结构,即客户端/服务器体系结构。Docker 客户端与 Docker 服务器进行交互,Docker服务端负责构建、运行和分发 Docker 镜像。
Docker 客户端和服务端能够运行在一台机器上,也能够经过 RESTful 、 Stock 或网络接口与远程 Docker 服务端进行通讯。
浅谈Docker三两事
Docker 的核心组件包括:
Docker Client
Docker Daemon
Docker Image
Docker Registry
Docker Container

这张图展现了 Docker 客户端、服务端和 Docker 仓库(即 Docker Hub 和 Docker Cloud ),默认状况下 Docker 会在 Docker 中央仓库寻找镜像文件。
这种利用仓库管理镜像的设计理念相似于 Git ,固然这个仓库是能够经过修改配置来指定的,甚至咱们能够建立咱们本身的私有仓库。
Docker 提供了一套简单实用的命令来建立和更新镜像,咱们能够经过网络直接下载一个已经建立好了的应用镜像,并经过 Docker RUN 命令就能够直接使用。
当镜像经过 RUN 命令运行成功后,这个运行的镜像就是一个 Docker 容器啦。
容器能够理解为一个轻量级的沙箱,Docker 利用容器来运行和隔离应用,容器是能够被启动、中止、删除的,这并不会影响 Docker 镜像。
咱们能够看看下面这幅图:
浅谈Docker三两事
Docker 客户端是 Docker 用户与 Docker 交互的主要方式。当您使用 Docker 命令行运行命令时,Docker 客户端将这些命令发送给服务器端,服务端将执行这些命令。
Docker 命令使用 Docker API 。Docker 客户端能够与多个服务端进行通讯。
咱们将剖析一下 Docker 容器是如何工做的,学习好 Docker 容器工做的原理,咱们就能够本身去管理咱们的容器了。
Docker Daemon 的架构以下所示:
浅谈Docker三两事
Docker Daemon 能够认为是经过 Docker Server 模块接受 Docker Client 的请求,并在 Engine 中处理请求,而后根据请求类型,建立出指定的 Job 并运行。
Docker Daemon 运行在 Docker Host 上,负责建立、运行、监控容器,构建、存储镜像。
运行过程的做用有如下几种可能:

向 Docker Registry 获取镜像。
经过 GraphDriver 执行容器镜像的本地化操做。
经过 NetworkDriver 执行容器网络环境的配置。
经过 ExecDriver 执行容器内部运行的执行工做。

下图能够很直观地看到 Docker Daemon 的启动流程:
浅谈Docker三两事
默认配置下,Docker Daemon 只能响应来自本地 Host 的客户端请求。若是要容许远程客户端请求,须要在配置文件中打开 TCP 监听。
咱们能够照着以下步骤进行配置:
一、编辑配置文件/etc/systemd/system/multi-user.target.wants/docker.service,在环境变量 ExecStart 后面添加 -H tcp://0.0.0.0,容许来自任意 IP 的客户端链接。
浅谈Docker三两事
二、重启 Docker Daemon:
systemctl daemon-reload
systemctl restart docker.service
三、咱们经过如下命令便可实现与远程服务器通讯:
docker -H 服务器IP地址 info

Docker Image

Docker 镜像能够看做是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
镜像不包含任何动态数据,其内容在构建以后也不会被改变。咱们可将 Docker 镜像当作只读模板,经过它能够建立 Docker 容器。
镜像有多种生成方法:
A、从无到有开始建立镜像
B、下载并使用别人建立好的现成的镜像
C、在现有镜像上建立新的镜像
咱们能够将镜像的内容和建立步骤描述在一个文本文件中,这个文件被称做 Dockerfile ,经过执行 docker build命令能够构建出 Docker 镜像。

Docker Registry

Docker Registry 是存储 Docker Image 的仓库,它在 Docker 生态环境中的位置以下图所示:
浅谈Docker三两事
运行 docker push、docker pull、docker search 时,其实是经过 Docker Daemon 与 Docker Registry 通讯。

Docker Container

Docker 容器就是 Docker 镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。
Docker Container 提供了系统硬件环境,咱们可使用 Docker Images 这些制做好的系统盘,再加上咱们所编写好的项目代码,Run 一下就能够提供服务啦。
如今咱们再经过 hello-world 这个例子来体会一下 Docker 各个组件是如何协做的。
容器启动过程以下:

1、Docker 客户端执行 docker run 命令。
2、Docker Daemon 发现本地没有 hello-world 镜像。
3、Daemon 从 Docker Hub 下载镜像。
4、下载完成,镜像 hello-world 被保存到本地。
5、Docker Daemon 启动容器

具体过程能够看以下这幅演示图:
浅谈Docker三两事
咱们能够经过 Docker Images 能够查看到 hello-world 已经下载到本地:
浅谈Docker三两事
咱们能够经过 Docker Ps 或者 Docker Container ls 显示正在运行的容器,咱们能够看到,hello-world 在输出提示信息之后就会中止运行,容器自动终止,因此咱们在查看的时候没有发现有容器在运行。
浅谈Docker三两事

**Dockerfile 是什么???**

Dockerfile 是自动构建 Docker 镜像的配置文件,用户可使用 Dockerfile 快速建立自定义的镜像。Dockerfile 中的命令很是相似于 Linux 下的 Shell 命令。
咱们能够经过下面这幅图来直观地感觉下 Docker 镜像、容器和 Dockerfile 三者之间的关系:
浅谈Docker三两事
Dockerfile 能够自定义镜像,经过 Docker 命令去运行镜像,从而达到启动容器的目的。Dockerfile 是由一行行命令语句组成,而且支持已 # 开头的注释行。
咱们能够将 Dockerfile 分为四个部分:

基础镜像(父镜像)信息指令 FROM。
维护者信息指令 MAINTAINER。
镜像操做指令 RUN 、EVN 、ADD 和 WORKDIR 等。
容器启动指令 CMD 、ENTRYPOINT 和 USER 等。

Dockerfile经常使用命令:
FROM
FROM 是用于指定基础的 images ,通常格式为 FROM or FORM :。

全部的 Dockerfile 都应该以 FROM 开头,FROM 命令指明 Dockerfile 所建立的镜像文件以什么镜像为基础,FROM 之后的全部指令都会在 FROM 的基础上进行建立镜像。能够在同一个 Dockerfile 中屡次使用 FROM 命令用于建立多个镜像。
MAINTAINER
MAINTAINER 是用于指定镜像建立者和联系方式,通常格式为 MAINTAINER。
COPY
COPY 是用于复制本地主机的(为 Dockerfile 所在目录的相对路径)到容器中的。当使用本地目录为源目录时,推荐使用 COPY 。通常格式为 COPY。
RUN
RUN 用于容器内部执行命令。每一个 RUN 命令至关于在原有的镜像基础上添加了一个改动层,原有的镜像不会有变化。通常格式为 RUN。
EXPOSE
EXPOSE 命令用来指定对外开放的端口。通常格式为 EXPOSE[...]。
ENTRYPOINT
ENTRYPOINT 可让你的容器表现得像一个可执行程序同样。一个 Dockerfile 中只能有一个 ENTRYPOINT,若是有多个,则最后一个生效。
ENTRYPOINT 命令也有两种格式:
一、ENTRYPOINT ["executable", "param1", "param2"] :推荐使用的 Exec 形式。
二、ENTRYPOINT command param1 param2 :Shell 形式。
CMD
CMD 命令用于启动容器时默认执行的命令,CMD 命令能够包含可执行文件,也能够不包含可执行文件。
不包含可执行文件的状况下就要用 ENTRYPOINT 指定一个,而后 CMD 命令的参数就会做为 ENTRYPOINT 的参数。
CMD 命令有三种格式:
一、CMD ["executable","param1","param2"]:推荐使用的 exec 形式。二、CMD ["param1","param2"]:无可执行程序形式。三、CMD command param1 param2:Shell 形式。一个 Dockerfile 中只能有一个 CMD,若是有多个,则最后一个生效。而 CMD 的 Shell 形式默认调用 /bin/sh -c 执行命令。

相关文章
相关标签/搜索