使用 Docker 构建你的第一个 Node 应用

发表于 4年以前  | 总阅读数:771 次

本文你能学到什么

Docker 是什么

Docker 概念

关于 Docker 的概念是确实不太好总结,下面我通过四点向你说明 Docker 到底是个什么东西。

  • Docker 是世界领先的软件容器平台。
  • Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核 的cgroup,namespace,以及 AUFS 类的 UnionFS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进 程,因此也称其为容器。Docker 最初实现是基于 LXC.
  • Docker 能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上,构建杰出的软件。
  • 用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

Docker 的基本组成架构

看一张 Docker 架构图

  1. 左边大框框是我们进行 Docker 操作的宿主机,其运行了一个 Docker daemon 的核心守护程序,负责构建、运行和分发 Docker 容器。
  2. 在宿主机中安装了 Docker 客户端,其与 Docker daemon 守护进程进行通信,客户端会将 build、pull、run 等命令发送到 Docker daemon 守护进程进行执行。
  3. 右框框为 Docker 注册表存储 Docker 镜像,是一个所有 Docker 用户共享 Docker 镜像的服务,Docker daemon 守护进程与之进行交互。

下面是对架构中基本组成说明,比较详细,大家看的时候可以对着架构图看。概念这个东西,你看下就好,怎么记都记不住的,只有你常用的东西才会记住和想着去记住它,看完本文,可以把下面的应用实践一遍。

Registry

镜像仓库,存储大量镜像,可以从镜像仓库拉取和推送镜像。

Docker 镜像

类似虚拟机快照,从仓库拉取,或者在现有工具镜像上创建新镜像。通过镜像可以启动容器。

Docker 容器

从镜像中创建应用环境,以单进程的方式运行。对外公开服务。是一种短暂的和一次性的环境。

Docker 数据卷

数据卷可以完成数据持久化,数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 卷会一直存在,直到没有容器使用

Docker 网络

Docker 容器之间的网络交互,可以使用端口映射的方式,其他容器可以直接通过端口实现。除该方式外还有一个容器连接(linking)系统也可以达到容器交互。(本文中 node 连接 mongodb 使用的是端口映射的方式)

关于Docker 网络模块,容器连接详情推荐这篇文章:Docker的网络模式详解

Docker 应用场景

Docker 部署 Node 项目完整流程(DockerFile实践)

  1. 使用 Koa2 初始化一个 Node 项目,通过 Mongose 中间件 连接 Mogodb 数据库,实现一个基础接口 Mogodb 插入数据。项目地址:https://github.com/koala-coding/dockerstudy
  2. 首先在项目根目录下创建 .dockerignore 文件,把不需要打包进 Docker Image 里的文件进行过滤
 # /usr/src/nodejs/dockerstudy/.dockerignore
.git
node_modules
  1. 在项目的根目录中创建 Dockerfile 文件(Dockerfile 这里重点讲一下)

部署 Node项目 的时候,会有一个 Dockerfile 文件配置

# /usr/src/nodejs/hello-docker/Dockerfile
FROM node:10.0

# 在容器中创建一个目录
RUN mkdir -p /usr/src/nodejs/

# 定位到容器的工作目录
WORKDIR /usr/src/nodejs/

# RUN/COPY 是分层的,package.json 提前,只要没修改,就不会重新安装包
COPY package.json /usr/src/app/package.json
RUN cd /usr/src/app/
RUN npm i

# 把当前目录下的所有文件拷贝到 Image 的 /usr/src/nodejs/ 目录下
COPY . /usr/src/nodejs/


EXPOSE 3000
CMD npm start

配置参数说明( DockerFile 学习):

  • FROM:FROM 是构建镜像的基础源镜像,该 Image 文件继承官方的 node image。

    详细说明:Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令!它引入一个镜像作为我们要构建镜像的基础层,就好像我们首先要安装好操作系统,才可以在操作系统上面安装软件一样。

  • RUN:后面跟的是在容器中要执行的命令。

    详细说明:每一个 RUN 指令都会新建立一层,在其上执行这些命令,我们频繁使用 RUN 指令会创建大量镜像层,然而 Union FS 是有最大层数限制的,不能超过 127 层,而且我们应该把每一层中我用文件清除,比如一些没用的依赖,来防止镜像臃肿。

  • WORKDIR:容器的工作目录

  • COPY:拷贝文件至容器的工作目录下,.dockerignore 指定的文件不会拷贝

  • EXPOSE:将容器内的某个端口导出供外部访问

  • CMD:Dockerfile 执行写一个 CMD 否则后面的会被覆盖,CMD 后面的命令是容器每次启动执行的命令,多个命令之间可以使用 && 链接,例如 CMD git pull && npm start

    详细说明:CMD 指令用来在启动容器的时候,指定默认的容器主进程的启动命令和参数。它有两种形式

    CMD echo 1
    CMD ["npm", "run", "test"] 必须是双引号

    第一种执行的命令会被包装程,CMD [ "sh", "-c", "echo 1" ] JSON 数组形式,一般推荐 JSON 数组形式。容器中的应用都应该以前台执行,而不是启动后台服务,容器内没有后台服务的概念。对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义。比如 CMD service nginx start 它等同于 CMD [ "sh", "-c", "service nginx start"] 主进程实际上是 shsh 也就结束了,sh 作为主进程退出了。

  • ENV(补充)

    ENV 指令用来设置环境变量,它有两种形式:

    ENV <key> <value>
    ENV <key1>=<value1> <key2>=<value2>...

    定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

4.代码环节暂且告一段落,将带有 Dockerfile 提交到 github 或 gitlab等。

以我的服务器 centos7 为例,已安装好 Docker。 5.首先检出代码,把项目克隆到指定目录

git clone https://github.com/koala-coding/dockerstudy

6.进入目录构建

cd dockerstudy
docker build -t dockerstudy .

build 命令用来制作镜像,-t 是给镜像打标签,-f 参数是指定 Dockerfile 路径,由于我们使用的是默认 Dockerfile 名称,所以可以不同填写该参数。最后一个.也不要省略,表示 Dockerfile 文件的所在目录, 代表是当前路径,它指定镜像构建的上下文。我们刚才说过,真正制作镜像的是 docker server,当我们执行 build 命令时,docker client 会将上下文路径下的所有内容打包,然后上传给 docker server。这样当我们要在 Dockerfile 文件中执行 如 COPY 指令,就可以将上下文中的文件复制到镜像中去了。

构建目标名称 dockerstudy,是一个镜像,可以通过 docker images 来列出所有的镜像。

一般应该会将 Dockerfile 置于一个空目录下,或者项目根目录下。如果该目录下没有所需文件,那么应该把所需文件复制一份过来。如果目录下有些东西确实不希望构建时传给 Docker引擎,那么可以用.gitignore 一样的语法写一个 .dockerignore

7.通过镜像 dockerstudy 创建一个容器并运行。

  docker run --name dockerstudycontainer -d -p 3000:3000 dockerstudy

说明:创建的容器名称是 dockerstudycontainer,你可以理解为 pid,这个名称唯一,创建之后如果不删除会一直存在。-p 用来指定端口映射,将容器的端口3000映射到主机3000`端口上,这样就可外部访问了。

此时在宿主机中可以使用curl测试服务器提供的服务是否正常

 curl localhost:3000

或者可以直接在浏览器中请求接口看一下输出

创建容器后,有时候需要看一下容器资源占用,使用docker stats

  docker stats dockerstudycontainer

★如果是购买的阿里云或者腾讯云服务器,注意这里将自己购买的 centos 服务器3000端口开放,在安全组

8.进入容器

  docker ls -a 查看所有容器,包括当前容器的id
docker exec -it <id> bash

9.日志检查 查看运行日志,“50425b8f2ef3” 为容器 ID

 $ docker logs -f 50425b8f2ef3

但是到了这里我还有个问题,那我真想看日志文件的时候,也不能每个容器进去看日志,好浪费时间啊!有没有什么更高的方式?我会在下一篇文章《线上环境如何优雅的打印,保存,分析日志》中写到。

Docker 部署 Mongodb 环境

  1. 远程获取 Mongodb 镜像
docker pull mongo

2.创建一个docker容器

  docker run -p 27017:27017 -v /data/db --name docker_mongodb -d mongo

在上面的命令中,几个命令参数的详细解释如下:

  • -p 指定容器的端口映射(特殊说明:前面的是本机端口 ,后面的是容器的端口,添加-p参数主动将容器内部端口给暴漏出来,将服务器的 27017 端口映射到容器的 27017 端口,这样在外网就可通过 服务器的 27017 端口访问到我们的服务,Mongodb 默认端口为 27017。最终访问的还是本机的端口)
  • -v 为设置容器的挂载目录,这里是将即本机中的目录挂载到容器中的/data/db中,作为 Mongodb 的存储目录
  • --name 为设置该容器的名称
  • -d 设置容器以守护进程方式运行

3.测试连接容器中的 Mongodb

可视化工具连接

以上是 MongoDB 容器创建后的信息。接下来,我们使用 Robo 3T 图形界面软件尝试打开数据库。打开 RoBo 3T,选择新建连接,按照下图填入相关数据库信息,保存。

★注意其中的权限认证。连接数据库时候可能失败,会出现问题,这时候注意一个问题,安全组问题,需要把安全组中的27017的 Mongodb 数据库端口打开

优雅部署方式 DockerCompose

Compose 是 Docker 官方开源的一个项目,可以管理多个 Docker 容器组成一个应用,例如 Web 服务,除了服务本身还有数据库、Redis、Nginx 等一系列相关联服务需要安装。

有个 Compose 的支持,我们只需要定义一个 YAML 格式的配置文件(docker-compose.yml),来编写一个项目所需要的多个容器配置及调用关系,通过简单的命令即可同时开始或者关闭这些容器。Compose 定位是定义和运行多个 Docker 容器的应用。在这篇文章中不具体讲 DockerCompose 使用,主要讲清楚 Docker 基本架构各部分的应用,多实践下哦!

Docker 带来了什么(优点)

  • 环境隔离('隔离,安全')

    Docker 实现了资源隔离,一台机器运行多个容器互无影响。

  • 更高效的资源利用(节约成本)

    Docker 容器的运行不需要额外的虚拟化管理程序的支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。

  • 更快速的交付部署(敏捷)

    使用 Docker,开发人员可以利用镜像快速构建一套标准的研发环境,开发完成后,测试和运维人员可以直接通过使用相同的环境来部署代码。

  • 更易迁移扩展(可移植性)

    Docker 容器几乎可以在任意的平台上运行,包括虚拟机、公有云、私有云、个人电脑、服务器等,这种兼容性让用户可以在不同平台之间轻松的迁移应用。

  • 更简单的更新管理(高效)

    使用 Dockerfile,只需要很少的配置修改,就可以替代以往大量的更新工作。并且所有修改都是以增量的方式进行分发和更新,从而实现自动化和高效的容器管理。

Docker的常用命令

镜像常用命令

docker pull [镜像名称:版本] 拉取镜像
docker images  镜像列表
docker rmi [镜像名称:版本] 删除镜像
docker history [镜像名称] 镜像操作记录
docker tag [镜像名称:版本][新镜像名称:新版本]
docker inspect [镜像名称:版本] 查看镜像详细
docker search [关键字] 搜索镜像
docker login 镜像登陆

容器常用命令

docker ps -a 容器列表(所有容器)
docker ps  查看所有(运行的)容器
docker exec -ti <id> bash  以 bash 命令进入容器内
docker run -ti --name [容器名称][镜像名称:版本] bash 启动容器并进入
docker logs 查看容器日志
docker top <container_id> 查看容器最近的一个进程
docker run -ti --name [容器名称] -p 8080:80 [镜像名称:版本] bash  端口映射
docker rm <container_id> 删除容器
docker stop <container_id> 停止容器
docker start <container_id> 开启容器
docker restart <container_id> 重启容器
docker inspect <container_id> 查看容器详情
docker commit [容器名称] my_image:v1.0  容器提交为新的镜像   

DockerFile常用命令

在上面实战中已经详细讲解,可以返回看,这里就不再重复写。

总结

读完本文后,你应该掌握了 Docker 的基本使用,对 Docker 这个概念不那么陌生了,并且知道了它的应用场景,可以自己实践下,这个过程也会出现很多问题的,实践才能更好的记住那些知识以及常用命令。

本文由哈喽比特于4年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/HxmclgHW3i-l0GPpsEKLCA

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237179次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  7983次阅读
 目录