30 April 2021
Docker 3 -- docker项目示例simpleweb
by Jerry Zhang
创建nodejs项目
创建一个package.json文件
{
"dependencies": {
"express": "*"
},
"scripts": {
"start": "node index.js"
}
}
星号代表任意版本
创建index.js文件
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('How are you doing');
});
app.listen(8080, () => {
console.log('Listening on port 8080');
});
创建Dockerfile
# Specify a base image
FROM node:alpine
WORKDIR /usr/app
# Install some dependencies
COPY ./package.json ./
RUN npm install
COPY . .
# Default command
CMD ["npm", "start"]
- 指定base image时,可以从hub.docker.com/explore中找需要的初始image
FROM node:alpine
中alpine是指最小的node镜像- WORKDIR 指定了在容器中,一切工作的初始路径
为什么要“COPY . .”
因为在Dockerfile中,每一步都是基于上一步创建出的临时image来操作的。在新的容器中,并不包含主机中的任何文件。因此首先要把当前项目目录下的所有文件copy到容器的某个位置,才能开始在容器中使用当前项目中的文件。
为什么要先COPY package.json文件
这样只要依赖不变,就能生成一个cache,将来其他代码修改的时候,就不需要重新npm install了,节省了大量时间。
build docker image并运行
docker build -t jerry4013/simpleweb .
docker run -p 8080:8080 jerry4013/simpleweb
这里一定要mapping 8080端口,否则从外部无法访问容器。
查看容器内部状态
docker run -it jerry4013/simpleweb sh
# 或者
docker exec -it <container id> sh