Docker 提供了一个隔离于主机的环境,用以运行应用
这就使得我们不需要关心主机的情况,进而实现更快速地分发应用
安装 Docker
进入官网
点击 Download for Mac(可以选择不同平台版本)
创建一个迷你服务
创建项目目录
# 创建项目目录
mkdir mini-docker
cd mini-docker
# 创建入口文件 index.js 以及 模板文件 home.html
touch index.js home.html
在 home.html 中添加一些内容。模板中的样式,以 CDN 方式使用了 TailwindCSS
<!-- home.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body>
<main class="container mx-auto">
<h1 class="text-4xl text-center my-8">Home</h1>
<p class="text-center text-lg bg-gray-200 p-4">
Welcome to the home page.
</p>
</main>
</body>
</html>
利用 Node.js 跑一个简单的服务,将上面的 html 文件作为响应
// index.js
const http = require('http');
const fs = require('fs');
const path = require('path');
const server = http.createServer((req,res) => {
if(req.url === '/'){
fs.readFile(path.join(__dirname,'home.html'),(err,data) => {
if(err) throw err;
res.writeHead(200,{'Content-Type':'text/html'});
res.end(data);
});
}
}
);
const PORT = process.env.PORT || 3002;
server.listen(PORT,() => console.log(`Server running on port ${PORT}`));
在终端中执行 node index.js
现在这个项目就运行起来了,并监听了 3002 端口
在 Chrome 打开 http://localhost:3002/ 就可以看到由 home.html 渲染出来的页面
在 Docker 中运行
在 mini-docker 目录中添加一个 Dockerfile 文件
# 设置 Node.js 18 为基础镜像
FROM node:18-alpine
# 在 image 上设置一个工作目录
WORKDIR /app
# 将主机上当前目录的所有内容拷贝到 image 的 /app 下
COPY . .
# 设置默认命令,在启动 container 时执行
CMD [ "node", "index.js" ]
终端中执行以下代码,这个命令会根据刚才的 Dockerfile 去创建一个 image。image 定义了运行一个 container 所需的一切(文件系统、依赖、配置等)
docker build -t mini-docker .
查看创建出来的 image :
docker image ls
使用刚才创建的这个 image 去运行一个 container。container 是 image 的一个运行实例,它是一个与其他进程隔离开来的沙箱进程
docker run -p 8080:3002 mini-docker
我们利用 mini-docker 这个 image 来启动一个 container
将 container 内的 3002 端口映射到主机的 8080 端口,3002 正是我们跑 Node 服务的端口
现在我们在 Chrome 中打开 http://localhost:8080/ 就可以看到 home.html 的页面了
和刚才不同的是,刚才的页面是直接在主机跑的服务,现在它运行在 Docker container 中
总结
先创建一个 HTML 页面,然后使用 Node.js 创建一个服务将 HTML 返回到浏览器
然后创建了 Dockerfile,里面包含一系列指令,描述了我们要创建怎样的 image
构建 iamge,并以它运行一个 container (也就是 image 的运行实例)
在浏览器中打开我们配置的端口就可以看到页面了