介绍
什么是 Docker?
维基百科将Docker定义为
一个开源项目,通过在 Linux 上提供操作系统级虚拟化的额外抽象层和自动化,在容器内自动部署软件应用程序。
简单来说,Docker 是一种工具,它允许开发人员、系统管理员等轻松地将他们的应用程序部署在沙箱(称为容器)中,以在主机操作系统(即 Linux)上运行。Docker 的主要优势在于,它允许用户将应用程序及其所有依赖项打包到一个标准化单元中以进行软件开发。与虚拟机不同,容器没有高开销,因此可以更有效地使用底层系统和资源。
什么是容器(containers)?
当今的行业标准是使用虚拟机 (VM) 来运行软件应用程序。VM 在来宾操作系统(guest operating system)中运行应用程序,该操作系统在由服务器主机操作系统提供支持的虚拟硬件上运行。
VM 非常擅长为应用程序提供完整的进程隔离:主机操作系统中的问题很少会影响来宾操作系统中运行的软件,反之亦然。但是这种隔离需要付出巨大的代价——为来宾操作系统使用虚拟化硬件所花费的计算开销是巨大的。
容器采用不同的方法:通过利用主机操作系统的低级机制,容器以一小部分计算能力提供大部分虚拟机隔离。
为什么要使用容器?
容器提供了一种逻辑打包机制,其中应用程序可以从它们实际运行的环境中抽象出来。这种解耦使得基于容器的应用程序能够轻松且一致地部署,无论目标环境是私有数据中心、公共云还是开发人员的个人笔记本电脑。这使开发人员能够创建与其余应用程序隔离并可在任何地方运行的可预测环境。
从操作的角度来看,除了可移植性容器之外,容器还可以对资源进行更精细的控制,从而提高基础架构的效率,从而更好地利用计算资源。
Docker 的谷歌搜索趋势
由于这些好处,容器和 Docker已被广泛采用。Google、Facebook、Netflix 和 Salesforce 等公司利用容器来提高大型工程团队的工作效率并提高计算资源的利用率。事实上,谷歌认为容器消除了对整个数据中心的需求。
本教程将教我什么?
本教程旨在成为让您接触 Docker 起始站。除了揭开 Docker 的神秘面纱之外,它还将为您提供在云上构建和部署自己的 web 应用程序的实践经验。我们将使用Amazon Web Services部署一个静态网站,并使用Elastic Beanstalk和Elastic Container Service在EC2上部署两个动态Web 应用程序。即使之前没有部署经验,本教程也应该是开始所需的全部内容。
入门
本文档包含一系列的几个部分,每个部分都解释了 Docker 的一个特定方面。在每个部分中,我们将键入命令(或编写代码)。本教程中使用的所有代码都可以在Github 存储库中找到。
先决条件
除了基本熟悉命令行和使用文本编辑器之外,本教程不需要任何特定技能。本教程用于git clone
在本地克隆存储库。如果你的系统上没有安装 Git,要么安装它,要么记得从 Github 手动下载 zip 文件。有开发 Web 应用程序的经验会有所帮助,但不是必需的。随着我们继续本教程,我们将使用一些云服务。如果您有兴趣跟随,请在以下每个网站上创建一个帐户:
设置您的计算机
在计算机上设置所有工具可能是一项艰巨的任务,但幸运的是,随着 Docker 变得稳定,在喜欢的操作系统上启动和运行 Docker 变得非常容易。
直到几个版本之前,在 OSX 和 Windows 上运行 Docker 还是很麻烦的。然而,最近 Docker 投入了大量资金来改善其用户在这些操作系统上的入门体验,因此现在运行 Docker 轻而易举。在入门的码头工人指南详细介绍了有关设置指令的Mac,Linux的和的Windows。
完成安装 Docker 后,通过运行以下命令来测试您的 Docker 安装:
$ docker run hello-world
Hello from Docker.
This message shows that your installation appears to be working correctly.
...
HELLO WORLD
Busybox
现在已经完成了所有设置,是时候动手实践一下。在本节中,将在系统上运行一个Busybox容器并体验该docker run
命令。
首先,在终端中运行以下命令:
$ docker pull busybox
注意:根据在系统上安装 docker 的方式,您可能会
permission denied
在运行上述命令后看到错误。如果使用的是 Mac,请确保 Docker 引擎正在运行。如果使用的是 Linux,请在docker
命令前加上sudo
. 或者,您可以创建一个 docker 组来解决此问题。
该pull
命令从Docker 注册表中获取 busybox映像并将其保存到我们的系统中。您可以使用该命令查看系统上所有图像的列表。docker images
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
busybox latest c51f86c28340 4 weeks ago 1.109 MB
Docker Run
现在基于这个镜像运行一个 Docker容器。为此,将使用全能docker run
命令。
$ docker run busybox
$
什么也没有输出,这是一个错误吗?不是的。在幕后,发生了很多事情。当您调用run
时,Docker 客户端会找到映像(在本例中为 busybox),加载容器,然后在该容器中运行命令。当运行时docker run busybox
,我们没有提供命令,所以容器启动了,运行了一个空命令然后退出。让我们尝试一些更令人兴奋的事情。
$ docker run busybox echo "hello from busybox"
hello from busybox
最后我们看到了一些输出。在这种情况下,Docker 客户端尽职尽责地echo
在busybox 容器中运行命令,然后退出它。如果你注意到了,所有这一切都发生得很快。想象一下启动一个虚拟机,运行一个命令然后杀死它。现在你知道为什么他们说容器很快了!好的,现在是时候查看docker ps
命令了。该docker ps
命令显示当前正在运行的所有容器。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
由于没有容器正在运行,看到一个空行。尝试一个更有用的变体:docker ps -a
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
305297d7a235 busybox "uptime" 11 minutes ago Exited (0) 11 minutes ago distracted_goldstine
ff0a5c3750b9 busybox "sh" 12 minutes ago Exited (0) 12 minutes ago elated_ramanujan
14e5bd11d164 hello-world "/hello" 2 minutes ago Exited (0) 2 minutes ago thirsty_euclid
所以在上面看到的是我们运行的所有容器的列表。请注意,该STATUS
列显示这些容器在几分钟前退出。
您可能想知道是否有一种方法可以在容器中运行多个命令。让我们现在试试:
$ docker run -it busybox sh
/ # ls
bin dev etc home proc root sys tmp usr var
/ # uptime
05:45:21 up 5:58, 0 users, load average: 0.00, 0.01, 0.04
运行run
带有-it
标志的命令会将我们附加到容器中的交互式 tty。现在可以根据需要在容器中运行任意数量的命令。花一些时间运行最喜欢的命令。
危险:如果您特别喜欢冒险,可以
rm -rf bin
在容器中尝试。确保在容器中而不是在笔记本电脑/台式机中运行此命令。这样做会使任何其他命令如ls
,uptime
不起作用。一旦一切都停止工作,可以退出容器(键入exit
并按 Enter),然后使用docker run -it busybox sh
命令再次启动它。由于 Docker 每次都会创建一个新容器,所以一切都应该重新开始工作。
对强大docker run
命令的探索之旅到此结束,这很可能是最常使用的命令。花一些时间来适应它是有道理的。要了解有关 的更多信息run
,请使用docker run --help
查看它支持的所有标志的列表。随着继续深入,我们将看到更多的docker run
.
在继续之前,下面讨论删除容器。我们在上面看到,即使我们通过运行退出后,我们仍然可以看到容器的残余docker ps -a
。在本教程中,您将运行docker run
多次,留下杂散的容器会占用磁盘空间。因此,根据经验,我会在处理完容器后清理它们。为此,可以运行该docker rm
命令。只需从上面复制容器 ID 并将它们粘贴到命令旁边即可。
$ docker rm 305297d7a235 ff0a5c3750b9
305297d7a235
ff0a5c3750b9
删除时,应该会看到 ID 回显给您。如果要一次性删除一堆容器,复制粘贴 ID 可能会很乏味。在这种情况下,您可以简单地运行 -
$ docker rm $(docker ps -a -q -f status=exited)
此命令删除所有状态为 的容器exited
。如果您想知道,该**-q
标志仅-f
根据提供的条件**返回数字 ID 和过滤器输出。最后一件有用的事情是--rm
可以传递给docker run
它的标志,一旦它退出就会自动删除容器。对于一次性 docker 运行,--rm
flag 非常有用。
在 Docker 的更高版本中,docker container prune
可以使用该命令来实现相同的效果。
$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
4a7f7eebae0f63178aff7eb0aa39f0627a203ab2df258c1a00b456cf20063
f98f9c2aa1eaf727e4ec9c0283bcaa4762fbdba7f26191f26c97f64090360
Total reclaimed space: 212 B
最后,还可以通过运行删除不再需要的镜像docker rmi
。
术语
在上一节中,使用了很多 Docker 特定的行话,这可能会让一些人感到困惑。所以这里总结一下在 Docker 生态系统中经常使用的术语。
- Image(镜像) - 构成容器基础的应用程序蓝图。在上面的演示中,使用
docker pull
命令来下载busybox镜像。 - Containers(容器)- 从 Docker 镜像创建并运行实际应用程序。使用
docker run
下载的 busybox 镜像创建了一个容器。可以使用该docker ps
命令查看正在运行的容器列表。 - Docker Daemon - 在主机上运行的后台服务,用于管理构建、运行和分发 Docker 容器。守护进程是在客户端与之对话的操作系统中运行的进程。
- Docker Client - 允许用户与守护程序交互的命令行工具。更一般地说,也可以有其他形式的客户端 - 例如向用户提供 GUI 的Kitematic。
- Docker Hub - Docker 镜像的注册表。可以将注册表视为所有可用 Docker 映像的目录。如果需要,可以托管自己的 Docker 注册表并使用它们来拉取镜像。