Docker构建Node.js应用镜像
构建Node.js应用
$ node -v v16.14.0 $ npm init -y $ pnpm i express -S $ pnpm i nodemon -D
package.json
{ "type": "module", "scripts": { "dev": "nodemon app.js" }, "dependencies": { "express": "^4.18.2" }, "devDependencies": { "nodemon": "^2.0.20" } }
app.js
import express from "express"; const PORT = 3000; const app = express(); app.get("/", (req, res) => { res.send("<h1>Hello</h1>"); }); app.listen(PORT, () => { console.log(`server start: http://127.0.0.1:${PORT}`); });
运行 node app.js
构建Docker镜像
- 镜像 image
- 容器 container
- 定制镜像文件 Dockerfile
关系:
Dockerfile -> build 构建image -> push 推送到DockerHub -> pull 拉取从DockerHub -> run 运行在container中
VS Code 插件:Docker
搜索镜像:
alpine是linux的轻量级发行版
.dockerignore 忽略文件,类似.gitignore
Dockerfile
# 引用基础镜像 FROM node:18-alpine3.15 # 指定工作目录 WORKDIR /app # 拷贝文件 COPY . . # 安装依赖 RUN npm install # 声明暴露端口号 EXPOSE 3000 # 运行镜像里的程序,用数组表示 CMD [ "node", "app.js" ] # 开发 # CMD [ "npm", "run", "dev" ]
docker指令
# 构建镜像 $ docker build . # 指定名字 $ docker build -t mouday/express-app:v1.0 . # 查看镜像 docker images # 命名格式:用户名/镜像名:版本 # 版本标签默认是latest docker tag <id> <name> eg: docker tag 45fe mouday/express-app:v1.0 # 登录 docker login # 推送镜像到dockerHub # 在仓库中查看镜像 docker push mouday/express-app:v1.0 # 删除本地镜像 remove image # -f force强制执行 docker rmi -f mouday/express-app:v1.0 # 从远端拉取镜像 docker pull mouday/express-app:v1.0 # 运行镜像 # -d 后台运行 docker run -d mouday/express-app:v1.0 # 端口映射 docker run -d -p 3000:3000 mouday/express-app:v1.0 # 指定名字 docker run -d -p 3000:3000 --name express-app mouday/express-app:v1.0 # 查看运行中的镜像 process status docker ps # 包括暂停运行的容器 docker ps -a # 关机 docker stop 容器id # 移除容器 docker rm -f 容器id # 同时移除volume docker rm -fv 容器id # 移除所有容器 $ docker ps -a | grep -v CONTAINER |awk '{print "docker rm -f " $1}' | sh # 以终端方式运行 docker exec -it 容器id /bin/sh # 退出 $ exit
本地文件夹和容器文件夹绑定
# 命令行方式需要使用绝对路径 # -v volume docker run -d -v /path/app:/app -p 3000:3000 --name app mouday/express-app:v1.0 # 不同步node_modules文件夹 # ro本地只读 read only docker run -d -v /path/app:/app:ro -v /app/node_modules -p 3000:3000 --name app mouday/express-app:v1.0
docker-compose
docker-compose.yml
version: "3.8" services: app: build: . ports: - "3000:3000" volumes: - ./:/app:ro - /app/node_modules
# 启动 docker-compose up -d --build # 停止 docker-compose down -v
使用CentOS 镜像
# 拉取指定版本的 CentOS 镜像 docker pull centos:centos7 # 查看本地镜像 docker images # 运行容器 docker run -itd --name centos-test --privileged centos:centos7 # 查看容器的运行信息 docker ps # 进入容器 docker exec -it <容器id> /bin/sh cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)