Docker实战:构建镜像

下面是用 node.js 搭建一个简单的网页服务,并构建成 Docker 镜像,并运行容器,使外部能访问这个网页。

简单写个网页

首先安装一下 npm:

1
sudo apt install npm

安装npm

初始化 npm 项目:

1
npm init -y

npm 安装 express 框架:

1
npm install express

alt text

简单写一个 js 文件:

1
2
3
4
5
6
7
8
9
const express = require("express");
const app = express();
const PORT = 3000;

app.get("/", (req, res) => {
    res.send("<p>智能感知——服务调度</p>");
});

app.listen(PORT,() => console.log("端口号3000走起"));

上面会在 3000 端口运行一个 html 服务。

编辑Dockerfile

nano Dockerfile

写入:

1
2
3
4
5
6
7
FROM node:18-alpine3.15
WORKDIR /ztc
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node","app.js"]

配置忽略文件

这个文件同 git.gitignore ,可以在构建时忽略掉文件及文件夹。

nano .dockerignore

写入:

1
2
3
node_modules
Dockerfile
.dockerignore

构建镜像

把配置文件写好,就可以构建镜像了:

1
docker build .

初次构建的时候是比较慢的。

构建镜像

查看镜像:

1
docker images

镜像查看

新创建的镜像还没有名字,所以显示为 <none>

可以为镜像添加名字:

1
docker tag c5e zonestissyc/nodejs:v1.0

再看一下,发现改名成功了:

镜像命名

运行容器

1
 docker run -d -p 3000:3000 --name hello-container zonestissyc/nodejs:v1.0
  • -d : 后台运行
  • -p 3000:3000: 端口转发,宿主机端口 $:$ 容器端口
  • --name hello-container : 给容器起个名

在浏览器访问一下:

访问端口

服务可以在外部访问了!!!

文件同步

为了实现镜像内文件的实时更新,需要在创建容器前加入 -v 选项,后跟 主机绝对路径:容器绝对路径

1
docker -d -v /.../hello/:/ztc -p 3000:3000 hello-container

文件同步是双向的,容器内文件的改变,主机也会改变。

如果想让主机只读,即容器改变后主机不变,可在 .../ztc 后加ro

1
docker -d -v /.../hello/:/ztc:ro -p 3000:3000 hello-container

第二个 -v 可以设置不想同步的文件夹, 如 -v /ztc/node_modules

容器删除

删除时最好对应把 volume 删除掉。

1
docker rm -fv hello-container
Licensed under CC BY-NC-SA 4.0
最后更新于 2025年6月2日 21:05
使用 Hugo 构建
主题 StackJimmy 设计