Docker 最重要的概念及其命令的速成课程
在Twitter上关注我,很高兴接受您对主题或改进的建议/Chris
我写这篇文章就是为了你,你刚刚空降到一个周一开始的项目,到周五下午就只有两个小时的空闲时间,而你却感觉自己一团糟。我理解你的感受,我经历过无数次。别担心,读完这篇文章后,你会对代码和 Docker 的运作方式,尤其是他们在会议上讨论的内容,有更深入的了解。

简而言之:本文旨在为Docker 的五篇系列文章做铺垫。本文旨在阐明错误的思维模式如何阻碍您正确学习 Docker。我通过讲述我学习 Docker 的故事来传达这一点。如果您是来学习 Docker 的,对这篇包含一些实用命令的故事不感兴趣,那么请点击阅读五篇系列文章,因为这可能更符合您的预期。
还在吗?太好了,故事时间到了。
这个故事旨在让你从宏观层面了解最重要的概念以及与之相关的命令。我把这个故事写成一系列亲身经历的故事,供我自己和你的娱乐,让你见证无知是如何慢慢变成知识的。你们中的一些人可能不知道IT职业中没有容器和Docker,但我记得那些单体应用,Pepperidge Farm也记得:
此外,我们还会涵盖那些不太顺利的第一周,甚至是第一个乐于复制粘贴Docker 命令的项目。然而,你真的应该考虑真正地学习它,尤其是如果你想要编写 API 或处理更大的解决方案。可以看看我为此专门写的这个系列:
Docker 五部分系列,不过现在,就当是星期五下午吧,继续阅读吧 :)
资源
我最后在本文中提到了一些值得进一步深入研究的概念:
- 云端 Docker 快速概览:如果您正在阅读本文,您正在寻找 Docker 的入门知识,但在某些时候,您需要了解如何在生产环境中继续使用它。这个生产环境很可能在某个时候就是云端。
- 我的 Docker 系列文章(共 5 部分)
周一早上——这只是一个剧本
好的。你刚开始着手新项目,对 Docker 一无所知,他们就建议你安装 Docker。你点击这个页面的安装链接,根据你的操作系统,安装不同的组件。
此时,您仍然不明白发生了什么,但您已经安装了 Docker。
模拟还是不模拟,这是个问题?
你的新同事很可能给了你一份脚本,可能是长脚本,也可能是短脚本。它可能看起来有点奇怪,但别担心,我懂你的意思。我第一次拿到这样的脚本时,它看起来像这样:
docker run -d -p 8000:3000 --name my-container --link mysql-db:mysql chrisnoring/node
公平地说,它甚至更长。但即使是上面的命令也足以让我感到困惑。
我运行了脚本,结果发现一切正常。当我说“正常”时,它启动了一堆端点,我的前端应用程序最终会与这些端点通信。
我觉得很棒。这就是你用它来模拟端点的原因?
当时我非常专注于前端,在我的世界里,我只希望后端人员和我能够达成一个契约,一个大家都同意的 JSON 模式,这样我就能安心工作了。当然,Docker 的功能远不止于此,但根据你在团队中的角色,你可能需要一段时间才能意识到它的价值。
我运行了它,但出了点问题
运行该脚本意味着它迟早会崩溃,当它出现错误时,你需要知道它崩溃的原因。我就是这种情况,这也是我对一些基本概念和一些非常有用的命令的介绍。好吧,我不记得是我的电脑睡着了,还是出了什么问题导致我的一个或多个端点宕机了。它宕机了,无法响应。就在那时,我那些更精通 Docker 的同事告诉我,
找出哪些容器处于启动状态,哪些处于关闭状态。只需重启故障容器即可。
当然,我当时就像个问号。我只知道如何在终端里复制粘贴脚本。这时,一位同事告诉我,只需运行以下命令:
docker ps
然后我看到了这样的列表:
您还可以运行:
docker ps -a
这样你就可以获得更多详细信息。
然后只需输入如下内容即可调出容器:
docker run -p 8000:3000 chrisnoring/node
我就像“啊哈”一样,把命令复制到记事本里。我突然知道怎么列出一些容器,如果不存在就显示出来。当时我就纳闷,什么是容器?
好的,那时我已经了解到:
- 复制粘贴,我可以直接复制粘贴那个较长的命令,然后就可以显示所有内容
- docker ps,显示所有正在运行的容器
- docker ps -a,显示所有容器,甚至存在的容器和一些详细信息
- docker run,启动一个容器,其中包含一些额外的命令,例如端口和图像名称
这个项目的剩余部分都是这样。我的意思是,我专注于前端,感觉不需要 Docker。
我不懂 Docker,你能教我吗?
我已经设法仅通过复制粘贴命令就完成了上述项目,是的,这是可以做到的。毕竟,我从事纯前端工作,并不觉得我需要了解这些。在某些情况下确实如此,但总的来说,知识就是力量。
所以几年后,我最终接手了一个完全基于微服务的项目,就像其他项目一样。Docker 被大量使用,我像往常一样开始做前端,然后我决定写一些后端,因为我了解 Node.js 和 Express,而且我了解这两种技术。那时,仅仅复制粘贴一些命令是不够的。我需要一些能够正常运行的端点,并包含真实的数据来模拟真实的环境。
突然间,它不仅仅是模拟端点,而是创建一个类似于生产环境的环境。
我首先要说的是,这是如何运作的,我们如何启动我们的服务?
只需输入
docker-compose up
即可,答案是
我当时就想,呃...Docker,Docker Compose,同样的东西,不同的东西,我习惯使用的长脚本在哪里,让一切启动并运行?
旁白:没有长篇的剧本。
我不明白这是什么意思。为什么是 Docker Compose,而不是 Docker 之类的?我跟同事说过。
我的同事说,我们从头开始吧。我们从 Docker 开始吧。
基础知识
首先你需要知道的是,有一种东西叫做镜像、容器和一个Dockerfile
。你可以用命令从 Dockerfile 构建镜像docker build
。它Dockerfile
就像一个镜像的配方,包含你需要的操作系统、要安装的库、要使用的变量等等。这时,他给我看了一个Dockerfile
。当然,我不记得它具体是什么样子了,但我可以给你看一个类似的:
// Dockerfile
FROM node:latest
WORKDIR /app
COPY . .
ENV PORT=3000
RUN npm install
EXPOSE 3000
ENTRYPOINT ["node", "app.js"]
从上图可以看到,我们首先使用以下FROM
命令选择一个名为 Node 的操作系统镜像。这是一个安装了 Node.js 的 Ubuntu 镜像。它会从 Docker Hub(一个中央仓库)下载:
接下来是使用 WORKDIR 在应用程序中设置工作目录。
之后,我们使用 COPY 命令将文件从当前位置复制到 docker 容器中。之后,我们使用 ENV 命令设置环境变量。
接下来,我们在终端中使用 RUN 调用命令,在本例中安装 package.json 文件中指定的每个库。
接下来,最后,我们打开端口 3000,以便我们可以通过 EXPOSE 从外部与容器进行通信。
最后,我们用 ENTRYPOINT 启动一个程序。
以上就是Dockerfile
,让我们来构建我们的镜像。我们使用docker build
,如下所示:
docker build -t chrisnoring/node-app:latest .
上述代码做了两件事:首先,-t
用名称标记镜像chrisnoring/node-app:latest
;其次,我们在 Dockerfile 末尾用 , 指出了它的位置.
。此时,它会读取 Dockerfile,拉取操作系统,并开始将每个命令作为一层添加到镜像之上。我们称之为分层文件系统。我们可以在下面看到它的具体运行情况:
我们看到两件事表明了这一点,其一是Step 1/7
。它将 Dockerfile 中的每个命令作为一个步骤执行。此后,它开始执行Removing intermediate container...
。这意味着它会根据上一个镜像层(您的最新指令 )创建一个临时容器。然后,它会在完成每个层级的操作后开始删除它们。最后一层会使用您在 中指定的名称进行标记docker build
。
运行/停止容器
好的,现在我们有了一个镜像,其中包含了我们需要的所有东西,包括操作系统、环境文件、应用程序等等。但我们需要根据镜像创建一个容器。我们可以这样调用:
docker run -p 8005:3000 chrisnoring/node-app
上面的代码首先会用 在我们的边和容器之间创建一个开口,-p
语法如下-p [our port]:[container port]
。然后我们说什么是图像,也就是chrisnoring/node-app
。
这将打开一个容器,我们可以从端口进行导航8005
,如下所示:
好的,我们了解了docker run
,那么启动和停止呢?
如果您已经有一个正在启动并运行的容器,您可以使用 来停止它docker stop [container id]
。最简单的方法是使用 找到它的容器 ID docker ps
。您无需输入完整的容器 ID,只需输入前 3-4 个字符即可。这应该会关闭您的容器。此时,它仍然存在,因此您可以轻松地使用 来启动它docker start [container id]
。
Docker Compose
好的,您已经教会了我 Docker 的基础知识,包括镜像、容器和 Dockerfile。那么 Docker Compose 呢?
Docker Compose 是一款适用于拥有多个容器的工具。要使用它,您需要定义一个docker-compose.yml
。您可以在其中指定所有服务、如何构建它们、它们如何关联、它们需要哪些变量等等。虽然您仍然需要为每个服务使用 Dockerfile,但 Docker Compose 是一种在一组镜像和容器上执行操作的方法。
这次谈话持续了数周,在这个过程中我学到了很多东西……:)
概括
正如你所见,我最初完全没有使用过 Docker。后来我开始把它当成一些复制粘贴的命令来用,最后我恍然大悟,意识到我需要它。这最终促成了这篇 5 部分指南的诞生。
我希望我讲述的这段旅程能够帮助你们了解不正确地学习一门技术会带来哪些后果,并最终让你们掌握它,这意味着你们的工具箱里会增添一项宝贵的工具。我知道你们中的许多人在某种程度上会,或者可能正在追随我的脚步。所以,请阅读我的五篇系列文章,我保证,你们会看到曙光。
文章来源:https://dev.to/azure/a-crash-course-to-the-most-important-docker-concepts-and-their-commands-4eio