Docker入门
我们都听过那句令人头疼的话:“但它在我的机器上运行正常。”无论简单还是复杂,依赖关系都是任何开发环境不可或缺的组成部分。
依赖项的版本或安装方式稍有不同,就可能导致开发出现严重问题。而 Docker 正是解决这一问题的利器。
Docker 能够帮助用户在不同机器上以一致的方式构建和部署应用程序。在今天的文章中,我们将构建并使用你的第一个 Docker 镜像。虽然对于个人项目来说,这似乎是一个不必要的步骤,但对于任何开发团队而言,Docker 都至关重要。
什么是 Docker?
Docker 是一个平台,它使您能够独立于所使用的基础架构来管理应用程序的开发、运行和发布。Docker 使用隔离的环境,并在其中安装特定于应用程序的依赖项来运行应用程序。这些隔离的环境被称为容器。
Docker 使我们能够同时运行多个容器。由于容器之间相互隔离,我们无需担心容器间的相互干扰。因此,Docker 容器可以同时在不同的隔离环境中运行不同版本的软件。另一个好处是,我们无需在主机上安装同一软件的多个版本,从而避免资源浪费。
Docker 容器是根据预先编写的指令构建的。这些指令包含在 Docker 镜像中。Docker 镜像是由开发者创建的模板,它包含在 Docker 容器中运行应用程序所需的应用程序代码、库、工具和其他依赖项,这使得 Docker 镜像具有可移植性和平台无关性。
可供公众使用的 Docker 镜像可在 Docker Hub ( https://hub.docker.com/ ) 上获取。
使用 Docker
按照以下说明操作:
请访问https://docs.docker.com/engine/install/在您的计算机上安装 Docker 引擎。请确保您的机器满足所有系统要求。同时,我们建议您在此处注册:https://hub.docker.com/signup,以便将您的 Docker 镜像发布到 Docker Hub。
安装 Docker 引擎还会同时安装 Docker 图形用户界面 (GUI) 和 Docker 命令行界面 (CLI)。您可以直接从系统终端使用 Docker CLI。首次打开 Docker GUI 时,它还会提供一个简短的教程。要使用 Docker CLI,我们需要学习一些基本命令。
Docker 命令
Docker 命令默认使用最新版本。如果需要其他版本,可以在版本号后添加“:”。
docker ps - 列出所有当前正在运行的容器。添加 -a 参数还会列出已退出的容器。
docker pull - 从 Docker Hub 下载镜像。它接受镜像名称作为参数。
docker run - 运行一个新的容器。它接受一个镜像名称作为参数。如果本地没有所需的镜像,它会检查 Docker Hub 仓库,下载并运行该镜像。
docker stop - 停止正在运行的容器。它接受容器 ID 或容器名称作为参数。
docker start - 启动已停止的容器。它接受容器 ID 或容器名称作为参数。
docker build - 构建一个新的 Docker 镜像。它接受镜像名称和版本作为参数。
docker images - 列出本地计算机上所有可用的镜像。
docker rm - 从容器列表中删除容器。它接受容器 ID 或容器名称作为参数。
docker rmi - 从本地机器中移除镜像。它接受镜像 ID 作为参数。请确保移除与要移除的镜像文件相关的所有容器。
我们还可以使用 Docker GUI 来执行上述命令,如下所示。
-
在浏览器中打开网页应用程序。
-
打开容器的交互式终端。
-
停止容器。
-
启动/重启容器。
-
删除容器。
构建 Docker 镜像
我们将为演示构建一个 Node.js 应用程序的 Docker 镜像。这是一个简单的待办事项列表,将使用基于 Express 的服务器。
这是我们项目的代码。
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8" /> | |
| <meta http-equiv="X-UA-Compatible" content="IE=edge" /> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |
| <title>Docker Demo</title> | |
| </head> | |
| <body> | |
| <h1>To Do List</h1> | |
| <br /> | |
| <input id="todo-input" type="text" placeholder="Your todo here..." /> | |
| <br /> | |
| <br /> | |
| <button id="add-btn">Add todo</button> | |
| <br /> | |
| <ul id="todo-list"></ul> | |
| <script type="text/javascript" src="./script.js"></script> | |
| </body> | |
| </html> |
| const todoInput = document.getElementById("todo-input"); | |
| const addBtn = document.getElementById("add-btn"); | |
| const todoList = document.getElementById("todo-list"); | |
| addBtn.addEventListener("click", function (e) { | |
| e.preventDefault(); | |
| const listItem = document.createElement("li"); | |
| listItem.textContent = todoInput.value; | |
| todoList.prepend(listItem); | |
| todoInput.value = ""; | |
| }); |
| const express = require("express"); | |
| const path = require("path"); | |
| const app = express(); | |
| app.use(express.static(__dirname)); | |
| app.get(__dirname, function (req, res) { | |
| res.sendFile(path.join(__dirname, "index.html")); | |
| }); | |
| app.listen(3000, function () { | |
| console.log("Listening on port 3000!"); | |
| }); |
在创建 Dockerfile 镜像之前,我们需要在本地测试应用程序以确保其正常运行。您可以下载上面的代码,并在终端运行 `node server.js` 命令来运行它。您应该能够通过 `localhost:3000` 在浏览器中打开网页。一旦我们确认应用程序运行正常,就可以创建我们的第一个 Docker 镜像了,如下所示:
-
创建一个文件夹,并将源文件(index.html、script.js 和 server.js)以及 package.json 文件复制到该文件夹中。
-
Docker 引擎需要一个 Dockerfile 文件来创建 Docker 镜像,该文件包含构建镜像的步骤。我们需要创建这个文件。您可以将此文件创建在计算机上的任何位置,但使用与源文件相同的文件夹会更方便。
-
我们需要创建一个名为 Dockerfile 的纯文本文件。Dockerfile 没有文件扩展名。
-
用于创建演示应用程序镜像的 Dockerfile 文件如下所示。
- Dockerfile 的第一行指示 Docker 引擎使用 node:17.6-alpine 的基础镜像启动。该镜像可在 Docker Hub 上找到。Alpine 是一个体积较小的 Linux 发行版,有助于保持生成的镜像体积较小。
- 第二行代码将我们的工作目录更改为环境内的 /home/demo_app/。请注意,现在的环境是 Linux,因此我们需要遵循 Linux 的命名约定。
- 接下来,我们将源文件文件夹中的 package.json 文件复制到当前工作目录。下一步将使用此文件来安装所需的依赖项。
- 现在我们运行 npm install 命令,该命令会安装所有必需的依赖项。
- 然后我们将所有源文件复制到我们的工作目录。
- 最后,我们执行命令 node server.js 在环境中运行我们的应用程序。
5.我们在终端中运行以下命令来构建这个 Docker 镜像。
docker build -t demo-app:1.0。
demo-app 是镜像名称,版本号为 1.0。
6. 我们需要运行镜像来创建 Docker 容器并测试我们的应用程序。使用以下命令从镜像创建 Docker 容器。
docker run -p 3000:3000 --name demo demo-app:1.0
`-p` 参数会添加一个主机端口,我们可以使用该端口通过 `localhost` 访问我们的 Web 应用程序。`--name` 参数为容器命名,并帮助我们在容器上运行命令。
如果一切顺利,我们就可以在浏览器中使用 `localhost:3000` 访问 Web 应用程序了。
7.我们可以通过在单独的终端中运行 docker ps 来查看容器的详细信息。
大功告成!我们从零开始创建了一个 Docker 镜像,并在终端中使用该镜像运行了一个容器。
你甚至可以更进一步,将其发布到 Docker Hub,供其他 Docker 用户使用,或者仅仅是为了向朋友炫耀。同样地,你也可以构建更大的应用程序,并使用 Docker 将其部署到线上。
现在,很多开发团队的下一步就是用这个镜像部署应用程序——但大多数云服务提供商都让这个过程变得极其复杂。正因如此, Codesphere正在打造一个能够运行任何应用程序的云服务提供商!
祝您编程愉快!
文章来源:https://dev.to/codesphere/getting-started-with-docker-42b
