Docker速成:新手实践指南


【编者的话】无论你是打算在DevOps开始你的职业生涯,还是已经开始了,如果你的简历上没有列出Docker,那么毫无疑问是时候考虑一下了,因为Docker是任何进入DevOps竞技场的人的关键技能之一。在这篇文章中,我将尽我所能以最简单的方式解释Docker。

在深入探究Docker之前,让我们先看看作为本文初学者指南的一部分,将涵盖哪些主题:
  • 什么是Docker?
  • Docker能解决什么问题
  • 使用Docker的优点和缺点
  • Docker的核心组件
  • 什么是Docker Hub?
  • Docker版本
  • Docker安装
  • Docker入门基础命令
  • 总结


让我们先了解一下,Docker是什么?

简单来说,Docker是一个软件平台,它简化了构建、运行、管理和发布应用程序的过程。它通过虚拟化安装和运行它的计算机的操作系统来实现这一点。

Docker的第一版于2013年发布。

Docker是使用Go编程语言开发的。

目前,Docker所提供的丰富功能已经被一些世界领先的组织和大学广泛接受,如VISA、Paypal、康奈尔大学和印第安那大学等,均已使用Docker来运行和管理他们的应用程序。

现在让我们试着理解这个问题,Docker必须提供解决方案

问题

假设您有三个不同的基于Python的应用程序,它们计划托管在一个服务器上(可以是物理机也可以是虚拟机)。每个应用程序都使用不同版本的Python,以及各自不同的库和依赖项。由于不能在同一台计算机上安装不同版本的Python,因此这会阻止我们在同一台计算机上托管所有三个应用程序。

解决方案

让我们看看如何解决这个问题而不使用Docker。在这种情况下,我们可以通过拥有三台物理机或一台足够强大的物理机来承载和运行三台虚拟机来解决这个问题。

这两个选项都允许我们在每台机器上安装不同版本的Python,以及它们相关的依赖项。

不管我们选择哪种解决方案,购买和维护硬件的相关成本都相当昂贵。

现在,让我们来看看Docker如何成为解决这个问题的一个高效和经济的解决方案。

为了理解这一点,我们需要看看Docker的功能到底有多精确。


安装和运行Docker的机器通常简单地称为Docker主机或主机。

因此,无论何时计划在主机上部署应用程序,它都会在主机上创建一个逻辑实体来承载该应用程序。在Docker术语中,这个逻辑实体称为容器或Docker容器,更精确地说。

Docker容器上没有安装和运行任何操作系统。但它将具有进程表、网络接口和文件系统挂载点的虚拟副本。这些已从承载和运行容器的主机的操作系统继承。

而主机操作系统的内核在运行在其上的所有容器之间共享。

这允许每个容器与同一主机上的其他容器隔离。因此,它支持多个具有不同应用程序需求和依赖关系的容器在同一主机上运行,只要它们具有相同的操作系统需求。

要了解Docker如何有助于解决这个问题,您需要参考下一节,其中讨论了使用Docker的优点和缺点。

简言之,Docker将虚拟化安装和运行它的主机的操作系统,而不是虚拟化硬件组件。

使用Docker的优缺点

使用Docker的优点

使用Docker的一些优势如下:
  • Docker支持具有不同应用程序需求和依赖关系的多个应用程序,只要它们具有相同的操作系统需求,就可以在同一主机上一起托管。
  • 存储优化。大量的应用程序可以托管在同一个主机上,因为容器的大小通常为几兆字节,占用的磁盘空间非常少。
  • 稳健性。容器上没有安装操作系统。因此,与虚拟机(安装并运行完整的操作系统)相比,它消耗的内存非常少。与启动虚拟机所需的几分钟相比,这还将启动时间缩短到几秒钟。
  • 降低成本。Docker在运行它所需的硬件方面要求较低。


使用Docker的缺点

  • 具有不同操作系统要求的应用程序不能托管在同一个Docker主机上。例如,假设有4个不同的应用程序,其中3个应用程序需要基于Linux的操作系统,另一个应用程序需要基于Windows的操作系统。在这种情况下,需要基于Linux的操作系统的3个应用程序可以托管在单个Docker主机上,而需要基于Windows的操作系统的应用程序需要托管在不同的Docker主机上。


Docker的核心部件

Docker引擎是Docker的核心组件之一。它负责Docker平台的整体功能。

Docker引擎是基于客户机-服务器的应用程序,由3个主要组件组成:
  1. 服务器
  2. REST API
  3. 客户端




服务器运行一个名为dockerd(Docker守护进程)的守护进程,它只是一个进程。它负责在Docker平台上创建和管理Docker图像、容器、网络和卷。

REST API用来定义应用程序如何与服务器交互协议,并指示它完成它们的工作。

客户端是一个命令行界面,用来实现用户使用命令与Docker交互。

Docker术语

让我们快速看看与Docker相关的一些术语。

docker images和docker containers是在使用docker时每天都会遇到的两个基本概念。

简单来说,Docker镜像是一个包含应用程序的模板,包含在Docker上运行该应用程序所需的所有依赖项。

另一方面,如前所述,Docker容器是一个逻辑实体。更准确地说,它是Docker镜像的一个运行实例。

什么是Docker Hub?

Docker Hub是官方的在线存储库,可以在其中找到所有可供使用的Docker镜像。

Docker Hub还允许存储和发布自定义镜像,根据要求,可以设置为公开或私有。

请注意:免费用户只能将一个Docker镜像保留为私有。如果希望保持一个以上的docker镜像并设置为私有,需要订阅一个付费订购计划。

Docker版本

Docker有两种不同版本,如下所示:
  • 社区版(CE)
  • 企业版(EE)


社区版适用于单个开发人员和小型团队。与企业版相比,它提供的功能有限。

另一方面,企业版适用于大型团队和在生产环境中使用Docker。

企业版进一步分为三个版本,如下所示:
  • 基础版
  • 标准版
  • 高级版


安装Docker

在我们着手处理Docker之前,我们需要知道的最后一件事就是安装Docker。

以下是官方Docker CE安装指南的链接。您可以按照这些指南在您的机器上安装Docker,因为它们既简单又直接。
  • CentOS Linux
  • Debian Linux
  • Fedora Linux
  • Ubuntu Linux
  • Microsoft Windows
  • MacOS


想跳过安装步骤,直接前往Docker实操?

为了防止你觉得懒得安装Docker,或者你的计算机上没有足够的资源,不必担心,以下是解决此问题的方法。

你可以访问Play with Docker,它是Docker的在线游乐场。它允许用户立即执行docker命令,而不必在您的机器上安装任何东西。最好的部分是它的使用简单,免费提供。

Docker命令

期待已久Docker命令开始了。

docker create

第一个命令是docker create命令。

这个命令用来创建一个新的容器。

此命令的语法如下所示:
docker create [options] IMAGE [commands] [arguments]

请注意:方括号内的任何内容都是可选的。这适用于本文的所有命令。

使用此命令的一些示例如下所示:
$ docker create fedora

02576e880a2ccbb4ce5c51032ea3b3bb8316e5b626861fc87d28627c810af03

在上面的例子中,docker create命令将使用最新版的fedora镜像创建一个新的容器。

在创建容器之前,它将检查Fedora的最新官方镜像是否在Docker主机上可用。如果Docker主机上没有最新的镜像,那么它将继续从Docker Hub下载Fedora镜像,然后再创建容器。如果Fedora镜像已经存在于Docker主机上,它将使用该镜像并创建容器。

如果容器创建成功,Docker将返回容器ID。例如,在上面的示例中,02576E880A2CBB4CE5C51032EA3B3BB8316E5B626861FC87D28627C810AF03是Docker返回的容器ID。

每个容器都有一个唯一的容器ID。我们使用其容器ID来对容器执行各种操作,例如启动、停止、重新启动等。

现在,让我们参考docker create命令的另一个例子,它有选项和要传递给它的命令。
$ docker create -t -i ubuntu bash

30986b73dc0022dbba81648d9e35e6e866b4356f026e75660460c3474f1ca005

在上面的示例中,docker create命令使用Ubuntu映像创建一个容器(如前所述,如果在Docker主机上该镜像不可用,将继续并在创建容器之前从docker hub下载最新的镜像)。

选项-t和-i指示Docker为容器分配一个终端,以便用户可以与容器交互。它还指示Docker在容器启动时执行bash命令。

docker PS

我们将看到的下一个命令是docker ps命令。

docker ps命令允许查看在docker主机上运行的所有容器。
$ docker ps

CONTAINER ID IMAGE  COMMAND CREATED        STATUS            PORTS NAMES30986b73dc00 ubuntu "bash"  45 minutes ago Up About a minute                 elated_franklin

它只显示当前在Docker主机上运行的容器。

如果要查看在此Docker主机上创建的所有容器,无论其当前状态如何,例如它们是否正在运行或退出,则需要包括选项-a,该选项依次显示在此Docker主机上创建的所有容器。
$ docker ps -a

CONTAINER ID IMAGE  COMMAND     CREATED           STATUS       PORTS NAMES30986b73dc00 ubuntu “bash”      About an hour ago Up 29 minutes elated_franklin02576e880a2c fedora “/bin/bash” About an hour ago Created hungry_sinoussi

在继续之前,让我们尝试理解docker ps命令的输出。

CONTAINER ID :由字母数字字符组成的唯一字符串,与每个容器关联。

IMAGE :用于创建此容器的Docker映像的名称。

COMMAND:启动容器时需要执行的任何特定于应用程序的命令。

CREATED:显示创建此容器后经过的时间。

STATUS:显示容器当前状态以及当前状态下经过的时间。

如果容器正在运行,它将随时间段一起显示为up(例如,up约1小时或up 3分钟)。

如果容器停止,则它将显示为退出,后面是圆括号内的退出状态代码,以及经过的时间段(例如,3周前退出(0)或15秒前退出(137),其中0和137是退出代码)。

PORTS:显示为容器定义的任何端口映射。

NAME:除了容器ID,每个容器还被分配一个唯一的名称。我们可以使用容器ID或其唯一名称来引用容器。Docker自动为它创建的每个容器分配一个唯一的愚蠢的名称。但是,如果要为容器指定自己的名称,可以通过将-name(双连字符名称)选项包括到docker create或docker run(稍后我们将查看docker run命令)命令来实现。

希望以上信息可便于理解docker ps命令输出的含义。

docker start

下一个命令是docker start命令。

此命令启动任何已停止的容器。

此命令的语法如下所示:
docker start [options] CONTAINER ID/NAME [CONTAINER ID/NAME…]

我们可以通过指定容器ID的前几个唯一字符或指定其名称来启动容器。

使用此命令的一些示例如下所示:
$ docker start 30986

以上案例,Docker采用了容器ID启动容器:
$ docker start elated_franklin

然而这个例子是通过容器名字来启动名为elated_franklin的容器。

docker stop

列表中的下一个命令是docker stop命令。

此命令停止任何正在运行的容器。

此命令的语法如下所示:
docker stop [options] CONTAINER ID/NAME [CONTAINER ID/NAME…]

它类似于docker start命令。

可通过指定容器ID的前几个唯一字符或指定其名称来停止容器。

使用此命令的一些示例如下所示:
$ docker stop 30986

在上面的示例中,Docker将停止从容器ID 30986开始的容器。
$ docker stop elated_franklin

而在本例中,Docker将停止名为elated_Franklin的容器。

docker restart

下一个命令是docker restart命令。

此命令重新启动任何正在运行的容器。

此命令的语法如下所示:
docker restart [options] CONTAINER ID/NAME [CONTAINER ID/NAME…]

我们可以通过指定容器ID的前几个唯一字符或指定其名称来重新启动容器。

使用此命令的一些示例如下所示:
$ docker restart 30986

在上面的示例中,Docker将从容器ID 30986开始重新启动容器。
$ docker restart elated_franklin

而在本例中,Docker将重新启动名为elated_Franklin的容器。

docker run

下一个命令是docker run命令。

此命令首先创建容器,然后启动容器。简而言之,这个命令是docker create和docker start命令的组合。

此命令的语法如下所示:
docker run [options] IMAGE [commands] [arguments]

它的语法类似于docker create命令。

使用此命令的一些示例如下所示:
$ docker run ubuntu

30fa018c72682d78cf168626b5e6138bb3b3ae23015c5ec4bbcc2a088e67520

在上面的例子中,Docker将使用最新的Ubuntu镜像创建容器,然后立即启动容器。

如果执行上述命令,它将启动容器并立即停止它——我们根本没有机会与容器进行交互。

如果我们想与容器交互,那么我们需要指定选项:docker run命令的-i t(连字符后跟i和t),可通过输入适当的命令与容器交互。下面是一个相同的例子。
$ docker run -it ubuntu

root@e4e633428474:/#

要从容器中出来,需要在终端中键入exit。

docker rm

下一个命令-如果想删除一个容器,使用docker rm命令。

此命令的语法如下所示:
docker rm [options] CONTAINER ID/NAME [CONTAINER ID/NAME...]

使用示例如下:
$ docker rm 30fa elated_franklin

在上面的例子中,我们要求Docker在一个命令中删除2个容器。要删除的第一个容器使用其容器ID指定,要删除的第二个容器使用其名称指定。

请注意:容器需要处于停止状态才能被删除。

docker images

docker images是列表中的下一个命令。

这个命令列出了Docker主机上的所有Docker镜像。
$ docker images

REPOSITORY  TAG      IMAGE          CREATED        SIZEmysql       latest   7bb2586065cd   38 hours ago   477MBhttpd       latest   5eace252f2f2   38 hours ago   132MBubuntu      16.04    9361ce633ff1   2 weeks ago    118MBubuntu      trusty   390582d83ead   2 weeks ago    188MBfedora      latest   d09302f77cfc   2 weeks ago    275MBubuntu      latest   94e814e2efa8   2 weeks ago    88.9MB

让我们来理解下docker images命令的输出。

REPOSITORY:这表示Docker镜像的唯一名称。

TAG:每个图像都与一个唯一的标签相关联。标记基本上代表图像的一个版本。标记通常使用一个单词或一组数字或字母数字字符的组合来表示。

IMAGE ID:由字母数字字符组成的唯一字符串,与每个图像关联。

CREATED:显示创建此图像后经过的时间。

SIZE:显示图像的大小。

docker rmi

列表中的下一个命令是docker rmi命令。

docker rmi命令允许从docker主机中删除一个映像。

此命令的语法如下所示:
docker rmi [options] IMAGE NAME/ID [IMAGE NAME/ID...]

使用示例如下:
docker rmi mysql

以上命令从Docker主机上删除名为MySQL的镜像。
docker rmi httpd fedora

上面的命令从Docker主机中删除名为httpd和fedora的镜像。
docker rmi 94e81

上面的命令从Docker主机中删除以图像ID 94E81开头的镜像。
docker rmi ubuntu:trusty

上面的命令从Docker主机中删除名为Ubuntu的带有trusty标签的镜像。

这些是一些基本Docker命令。还有更多的Docker命令需要探索。

总结

Docker虽然已经存在了很长一段时间,但最近才引起了人们的注意。一些顶级科技公司,如 Google、Amazon Web Services(AWS)、Intel、Tesla and Juniper Networks,都有自己定制的容器引擎版本。这些公司主要依赖于它们来构建、运行、管理和分发应用程序。

Docker是一个非常强大的容器引擎,在高效地构建、运行、管理和发布应用程序方面,它提供了很多功能。

刚刚在一个非常高的水平上看到了Docker。关于Docker还有很多东西要学习,比如:
  • Docker命令(更强大的命令)
  • Docker Images(构建定制化镜像)
  • Docker网络(设置和配置网络)
  • Docker服务(对使用相同镜像的容器进行分组)
  • Docker堆栈(对应用程序所需的服务进行分组)
  • Docker Compose(用于管理和运行多个容器的工具)
  • Docker Swarm(对运行Docker的一台或多台机器进行分组和管理)
  • 还有更多…


如果你发现Docker很迷人,并且对它感兴趣,那么我建议你参加下面列出的课程。他们提供了非常丰富的信息,而且直截了当。

如果你是一个初学者,那么建议参加这门专为初学者设计的课程

如果你对Docker有一些很好的了解,并且对基础知识很有信心,并且想扩大你的知识面,那么建议你参加这门课程 ,这门课程的目的是更深入地探讨与Docker相关的高级话题。

Docker是一项面向未来的技能,并且正在不断发展。

把你的时间和金钱花在学习Docker上会非常值得。


希望你觉得这篇文章很有信息性。请随意分享。这对我很重要。

在说再见之前……

让我们保持联系,单击此处输入您的电子邮件地址(如果上面的小部件没有显示在您的屏幕上,请使用此链接)。

非常感谢你抽出宝贵的时间来阅读这篇文章。

免责声明:所有产品和公司名称都是其各自持有人的商标™或注册®商标。使用它们并不意味着它们有任何认可。此帖中可能有附属链接。

原文链接:Docker Simplified: A Hands-On Guide for Absolute Beginners(翻译:Chilly)

0 个评论

要回复文章请先登录注册