为前端工程师准备的 Docker 教程

Docker

这是Docker的简明指南,适合前端开发者使用

为什么要使用docker?

很久以前业务需要其他应用的时候,DevOps团队会在不知道新应用的性能要求的情况下出去购买服务器。这将涉及大量猜测工作和浪费可用于其他应用程序的资本和资源。

输入虚拟机或VM,它允许我们在同一服务器上运行多个应用程序。但这也有一个缺点。每个虚拟机都需要整个操作系统才能运行。每个操作系统都需要CPU、RAM等才能运行,需要打补丁和授权,进而增加成本和弹性。

谷歌在很久以前开始使用容器模型来解决VM模型的缺点。基本上是什么容器模型意味着同一主机上的多个容器使用相同的主机,释放可以在其他地方使用的CPU,RAM。

但它如何帮助我们开发者?

它确保所有开发人员和所有服务器的工作环境都是相同的,即生产,暂存和测试

任何人都可以以秒为单位设置项目,无需使用配置,安装库,设置依赖项等

简单来说,docker是一个平台,使我们能够开发、部署、并使用容器运行应用程序

容器系统在物理上是什么样子,与VM有什么不同

1.1 docker和VM虚拟机的不同

1.1 VM和Docker之间的区别。

主机和主机的资源在容器里是共享的,但在虚拟机里不是。

我们知道这个,接下来就可以继续深入了解一下。

如何使用docker?

为此,我们需要熟悉一些术语。

1.2 Docker镜像和Docker容器的可视化

1.2 Docker镜像和Docker容器的可视化

docker镜像:它是一个可执行文件,包含运行应用程序所需的精简操作系统、所有库和配置。它有多个层叠在一起并表示为单个对象。docker镜像是使用docker file创建的,我们将稍后讨论

Docker容器:它是Docker映像的运行实例。可以有许多从相同的Docker映像运行的容器。

容器化简单的 Node.js 应用程序

我们会尝试容纳非常简单的node.js应用程序,并创建镜像:

你的Node.js应用程序

我们从创建文件夹开始,

mkdir my-node-app  
cd my-node-app

让我们在index.js中创建一个简单的节点服务器,并在那里添加以下代码:

//使用`require`指令加载express模块

var express = require('express')

var app = express()

//定义根URL中的请求响应(/)
app.get('/', function (req, res) {  
 res.send('Hello World!')  
})

//在端口8081上启动侦听服务器
app.listen(8081, function () {  
  console.log('app listening on port 8081!')  
})

并将此文件保存在my-node-app文件夹中。

现在我们创建一个package.json文件并在那里添加以下代码:

 {

    "name": "helloworld",  
    "version": "1.0.0",  
    "description": "Dockerized node.js app",  
    "main": "index.js",  
    "author": "",  
    "license": "ISC",  
    "dependencies": {  
      "express": "^4.16.4"  
    }

 }

此时您不需要在主机中安装 express 或 npm,因为 dockerfile 处理设置所有依赖项、lib 和配置。

DockerFile

让我们创建DockerFile并将其保存在my-node-app folder中。此文件没有扩展名,名为Dockerfile。让我们继续向dockerfile添加以下代码。

    # Dockerfile  
    FROM node:8  
    WORKDIR /app  
    COPY package.json /app  
    RUN npm install  
    COPY . /app  
    EXPOSE 8081  
    CMD node index.js

现在我们在这里做的是:

FROM node:8 — 从 docker hub 拉取 node.js docker 镜像,可以在这里找到https://hub.docker.com/_/node/

WORKDIR /app -这是我们代码设置镜像中的工作目录,它被所有后续命令使用, 例如 COPY , RUN 和 CMD

COPY package.json /app -这将我们的package.json 从主机 my-node-app 文件夹复制到我们文件夹中的镜像 /app

RUN npm install — 在我们的镜像中运行这个命令来为我们的应用程序安装依赖项(node_modules)。

COPY . /app — 我们告诉 docker 从 my-node-app 文件夹复制文件并将其粘贴到 /app docker 镜像中。

EXPOSE 8081 — 我们使用此命令在容器上公开一个端口。为什么是这个端口?因为在我们的服务器中 index.js 正在侦听 8081。默认情况下,从该镜像创建的容器将忽略对其发出的所有请求。

构建Docker镜像

打开终端,进入您的文件夹my-node-app,输入以下命令:

     # 构建docker映像 docker build -t 镜像名 dockerfile的相对路径

    docker build -t hello-world .

此命令在主机上创建一个hello world映像
-t 用于向我们的镜像提供名称,这是 Hello-World

. 是docker文件的相对路径,因为我们处于my-node-app文件夹,我们使用dot表示Docker文件的路径。

您将在命令行上看到一个输出,如下所示:

    Sending build context to Docker daemon  4.096kB  
    Step 1/7 : FROM node:8  
     ---> 4f01e5319662  
    Step 2/7 : WORKDIR /app  
     ---> Using cache  
     ---> 5c173b2c7b76  
    Step 3/7 : COPY package.json /app  
     ---> Using cache  
     ---> ceb27a57f18e  
    Step 4/7 : RUN npm install  
     ---> Using cache  
     ---> c1baaf16812a  
    Step 5/7 : COPY . /app  
     ---> 4a770927e8e8  
    Step 6/7 : EXPOSE 8081  
     ---> Running in 2b3f11daff5e  
    Removing intermediate container 2b3f11daff5e  
     ---> 81a7ce14340a  
    Step 7/7 : CMD node index.js  
     ---> Running in 3791dd7f5149  
    Removing intermediate container 3791dd7f5149  
     ---> c80301fa07b2  
    Successfully built c80301fa07b2  
    Successfully tagged hello-world:latest

如您所见,它运行了docker文件中的步骤并输出了docker镜像。当您第一次尝试时,将需要几分钟时间,但从下次开始,它将开始使用缓存,构建速度会更快,输出将如上图所示。现在,在您的终端中尝试执行以下命令,查看您的镜像是否存在:

    # 获取主机上的镜像列表
    docker images

主机中应该有一个镜像列表。类似这样的内容

    REPOSITORY    TAG      IMAGE ID      CREATED         SIZE  
    hello-world   latest   c80301fa07b2  22 minutes ago  896MB

运行Docker容器

创建镜像后,我们可以从该镜像启动容器

    # 这是Docker容器运行的默认命令
    docker container run -p 4000:8081  hello-world

此命令用于创建和运行Docker容器。

-p 4000:8081— 这是发布标志,它将主机端口 4000 映射到我们通过 dockerfile 中的公开命令打开的容器端口 8081。现在所有对主机端口 4000 的请求都将被容器端口 8081 监听。

hello-world — 这是我们之前运行 docker-build 命令时给我们的镜像取的名字。

你会收到一些这样的输出:

    app listening on port 8081!

如果你想进入你的容器并安装一个 bash 终端,你可以运行

    # 输入容器
    docker exec -ti <container id> /bin/bash

为了检查容器是否正在运行,打开另一个终端并输入

    docker ps

你应该像这样看到你正在运行的容器

     CONTAINER ID    IMAGE        COMMAND                  CREATED    
    `<container id>`  hello-world  "/bin/sh -c 'node in…"   11 seconds ago

    STATUS              PORTS                    NAMES  
    Up 11 seconds       0.0.0.0:4000->8081/tcp   some-random-name

这意味着我们从hello-world镜像创建的id为<container id> 的容器已经启动并运行,并且正在侦听端口8081。

现在我们的Node.js应用程序已经完全容器化了。您可以在浏览器上运行localhost:4000/,您应该会看到如下所示:

1.3 Node.js容器应用

1.3 Node.js容器应用

到此您已经将第一个应用程序容器化了。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://dev.to/akanksha_9560/docker-for-...

译文地址:https://learnku.com/server/t/63949

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!