目录

基于NodeJS构建Docker应用

创建一个NodeJS程序

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
http.createServer(function (request, response) {

    // 发送 HTTP 头部
    // HTTP 状态值: 200 : OK
    // 内容类型: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});

    // 发送响应数据 "Hello World"
    response.end('Hello World\n');
}).listen(8080);

修改Docker文件映射

修改/etc/docker/daemon.json

1
2
3
{
  "data-root":"/root/data/docker-data"
}

重启docker systemctl restart docker,在/root/data/目录下会自动生成如下文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
docker-data
|-- buildkit
|   |-- cache.db
|   |-- containerdmeta.db
|   |-- content
|   |   `-- ingest
|   |-- executor
|   |-- metadata_v2.db
|   `-- snapshots.db
|-- containers
|-- image
|   `-- overlay2
|       |-- distribution
|       |-- imagedb
|       |   |-- content
|       |   |   `-- sha256
|       |   `-- metadata
|       |       `-- sha256
|       |-- layerdb
|       `-- repositories.json
|-- network
|   `-- files
|       `-- local-kv.db
|-- overlay2
|   `-- l
|-- plugins
|   |-- storage
|   |   `-- ingest
|   `-- tmp
|-- runtimes
|-- swarm
|-- tmp
|-- trust
`-- volumes
    |-- backingFsBlockDev
    `-- metadata.db

创建Dockerfile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
FROM node:12

# 创建一个工作环境目录
WORKDIR /usr/src/app

# 复制package.json
COPY package*.json ./

# 安装依赖
RUN npm install
# If you are building your code for production
# RUN npm ci --only=production

# 复制源码到docker的工作目录
COPY . .

EXPOSE 8080
# 运行程序
CMD [ "node", "server.js" ]

创建.dockerignore

1
2
node_modules
npm-debug.log

构建你的镜像

-t 给docker 打tag

1
docker build . -t hello

查看构建成功的镜像

1
docker images

运行镜像

使用 -d 模式运行镜像将以分离模式运行 Docker 容器,使得容器在后台自助运行

1
docker run -p 49160:8080 -d hello

查看运行中镜像

1
docker ps

结果:

1
2
3
CONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS                PORTS                                                                                                  NAMES
59cfd31c454a   hello                           "docker-entrypoint.s…"   12 minutes ago   Up 12 minutes         0.0.0.0:49160->8888/tcp                                                                                interesting_feynman
affb2d1fbf8c   vesoft/nebula-graphd:v3.0.0     "/usr/local/nebula/b…"   10 days ago      Up 3 days (healthy)   0.0.0.0:9669->9669/tcp, 0.0.0.0:52140->19669/tcp, 0.0.0.0:52141->19670/tcp                             nebula-docker-compose_graphd_1

停止镜像

1
2
# 59cfd31c454a为镜像Id 
docker stop 59cfd31c454a

复制文件到容器

1
docker cp test.txt <container id>:test.txt

进入容器

1
docker exec -it <container id> /bin/bash

结果:

1
2
root@59cfd31c454a:/usr/src/app# ls
Dockerfile  hello.js  package-lock.json  package.json

查看所有容器

1
docker container list -a

结果:

1
2
3
CONTAINER ID   IMAGE                               COMMAND                   CREATED          STATUS                        PORTS                                                                                                  NAMES
59cfd31c454a   hello                               "docker-entrypoint.s…"    19 minutes ago   Exited (137) 9 seconds ago                                                                                                           interesting_feynman
dcf5f511b71b   22c664b382c0                        "docker-entrypoint.s…"    23 minutes ago   Exited (137) 21 minutes ago                                                                                                          dazzling_banz

启动已经停止的容器

1
docker run <CONTAINER_ID>

删除容器

1
2
3
4
# 先停止
docker stop <CONTAINER_ID>
# 删除容器
docker container rm

删除镜像

1
docker image rm <IMAGE_ID>

源码

原创:https://nodejs.org/zh-cn/docs/guides/nodejs-docker-webapp/