Docker入门
为什么我们要用 docker ?
过去的我们,当业务发展需要部署新的应用时,DevOps 小伙伴通常会去买一台服务器,但是却不知道这个新应用具体需要多高的配置,往往都会造成资源浪费。
当虚拟机出现后,它可以让我们在一台服务器上运行多个应用,但是却有一个缺陷。每个 VM 需要运行一整个的操作系统。每个 OS 又需要 CPU、RAM 等等,需要打补丁、安装证书,这些反过来又增加了成本和弹性。
Google 在很久之前就开始使用容器模型来解决 VM 模式的弊端。简单来说容器模型允许我们在同一台主机上运行多个容器,而且共用主机的 CPU、RAM 等资源。
那么它对开发者来说意味着是么呢?
它可以保证对所有的开发者和服务器来说,我们的工作环境都是一致的。比如: 生产环境、仿真环境、测试环境。
任何人都可以分分钟配置好项目,无需乱搞配置、安装库和设置依赖。
简单来说,docker 是一个平台,它允许我们使用容器来开发、部署、运行应用程序。
让我们退一步来看,容器系统在物理上是什么样子的,以及与 VM 有什么区别。
可以看出来,宿主机的资源在容器化的使用后是共享的,但是在 VM 中却被分割开了。
接下来,我们来深入一些。
如何使用 docker ?
为此我们需要先熟悉一些术语。
Docker image: 它是一个可执行文件,包含了运行一个应用程序的操作系统配置和所有的库。它有多个层叠在一起,并表示为单个对象。docker image 是通过 docker file 来创建的,我们稍后再讲。
Docker Container: 它是 docker image 的一个运行实例。同一个 docker image 可以有多个运行的 container。
容器化 Node.js 应用
我们来尝试容器化一个简单的 node.js 应用,然后创建一个 image:
你的 Node.js 应用
先创建一个 my-node-app
文件夹,
然后创建一个 index.js
来启动一个 node server:
然后我们创建一个 package.json
文件,可以通过 npm init -y
来快速生成:
到这一步我们甚至不需要 express 或者 npm 安装在自己的机器,因为 dockerfile 可以为我们配置和安装这些依赖。
DockerFile
让我们创建一个 dockerfile,然后保存到 my-node-app
文件夹。这个文件没有扩展名,它的名字就叫作 Dockerfile
,这是里面的内容:
下面解释一下里面的命令:
FROM node:8
-- 从 docker hub 拉取 node.js docker 镜像,可以在这里找到 node 的镜像:https://hub.docker.com/_/node/
WORKDIR /app
-- 设置镜像中的工作目录,可以与下面的命令一起使用: COPY
,RUN
和 CMD
COPY package.json /app
-- 将 package.json 从宿主机的 my-node-app
目录复制到了镜像中的 /app
目录
RUN npm install
-- 在镜像中运行此命令来安装 node 包
COPY . /app
-- 复制 my-node-app
目录中的所有文件到镜像中的 /app
目录
EXPOSE 8081
-- 这条命令告诉 container 要暴露一个端口号,这个端口号正是我们在 index.js
中写的那个。默认情况下,容器会忽略对它所有的请求。
构建 Docker 镜像
注意看啦~ 打开控制台,到 my-node-app
目录下,执行以下命令:
这条命令在我们宿主机创建了一个 hello-world
镜像
-t
用来为我们的镜像指定一个名字,这里就是 hello-world
.
是用来指明 docker file 的路径,由于我们已经在 my-node-app
中,所以路径用 .
就可以了
你可以在控制台看到类似于以下的输出:
可以看到,它根据 docker file 中的命令依次运行,然后输出了一个 docker 镜像。当你第一次运行的时候可能会需要一些时间,下次就可以使用缓存来加快速度了。现在我们来看下刚才 build 的镜像:
这个命令会显示在你电脑上存在的 docker 镜像。其中会有一条:
运行 Docker 容器
既然我们已经创建了镜像,下面我们就从这个镜像运行一个 docker 容器:
这条命令用来创建和运行一个 docker 容器
-p 4000:8081
-- 是一个发布(publish)标识,它将本机的 4000 端口映射到了容器中的 8081 端口。现在所有对本机 4000 端口的访问,都会被容器中的 8081 端口监听。
hello-world
-- 这个名字就是刚才用 docker build
命令时指定的镜像名称。
你将会得到以下输出:
如果你需要进入容器并且挂载一个 bash 终端,可以运行:
为了检查我们的容器是否运行,打开另一个命令行,然后输入:
可以看到以下输出:
这里可以看我们从 hello-world 镜像创建的容器,以及它的 <container id>
,它正在运行,并且监听了 8081 端口号。
现在我们这个简单的 Node.js 应用就已经完全容器化了。你可以在浏览器访问 http://localhost:4000 ,应该可以看到以下画面:
看,是不是很简单哈哈~
__EOF__

本文链接:https://www.cnblogs.com/sugeek/articles/16571819.html
关于博主:编程菜鸟一只,希望每个今天胜过昨天,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具