Docker官方起步指南学习笔记④——实例之基于Alpine的nodejs服务器

Docker官方起步指南学习笔记④——实例之基于Alpine的nodejs服务器

九月 17, 2019
当前设备屏幕尺寸过小,推荐使用PC模式浏览。

本次目标

本次的目标是基于前三次课的知识,利用Alpine的最小环境,搭建node.js环境,并创建Hello world网页应用;最后将该容器打包成映像,发布到DockerHub上。

Tips:事实上,使用docker search node就可以找到node_alpine的官方仓库。此次我们将尝试自己搭建。

开始实战

编写服务器应用

1
2
3
4
5
6
7
8
9
// server.js
var http = require('http');

http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World\n');
}).listen(1234);

console.log('Server running at http://localhost:1234/');

在本机测试node server.js,访问http://localhost:1234/可见Hello World字样的输出。

创建nodejs环境的Alpine容器

  1. 基于>上一节<的知识,把存有server.js脚本的文件挂载到容器实例上,并将端口映射为1234(宿主机)->1234(容器).
1
docker run -dit --name=test -p 1234:1234 -v I:\js_server\:/js_server alpine

其中,I:\js_server\是宿主机中server.js的存放地址;/js_server是容器的数据卷挂载地址。I盘已经被设为Shared Drives

  1. 为alpine服务器安装nodejs环境:
1
apk add nodejs

输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/community/x86_64/APKINDEX.tar.gz
(1/7) Installing ca-certificates (20190108-r0)
(2/7) Installing c-ares (1.15.0-r0)
(3/7) Installing libgcc (8.2.0-r2)
(4/7) Installing http-parser (2.8.1-r0)
(5/7) Installing libstdc++ (8.2.0-r2)
(6/7) Installing libuv (1.23.2-r0)
(7/7) Installing nodejs (10.14.2-r0)
Executing busybox-1.29.3-r10.trigger
Executing ca-certificates-20190108-r0.trigger
OK: 31 MiB in 21 packages

测试node版本:node --version,输出v10.14.2,可见node环境已经安装完毕。

  1. 执行server.js脚本:
1
2
cp /js_server/server.js /home/server.js
node /home/server.js

在本机(Windows10)的浏览器打开http://localhost:1234/,得到网页输出:
Hello-world
按下Ctrl+C或直接关闭终端可以关闭服务器。但在此之前,我们将把该容器打包为一个映像。使用Ctrl+P+Ctrl+Q返回到宿主机的Shell界面。

将容器打包为映像

1
docker commit -a shenpibaopao -m pack test hello_node_alpine:v1.0

docker commit指令会将当前容器打包成一个镜像,常用可选配置项有:

  • -a 添加作者的信息
  • -c 修改Dockerfile的一些指令
  • -m 提交时的修改备注,类似于git commit -m的作用
  • -p 暂停正在commit的操作

查看当前镜像docker images

新的映像

可以看到新的映像已经出现了。

如果已经登陆DockerHub,使用docker push指令即可直接发布到DockerHub,否则请使用docker login指令进行登陆。

Tips:如果出现 denied: requested access to the resource is denied 的错误,需要使用 docker tag 指令为映像重新命名:
docker tag hello_node_alpine:v1.0 你的DockerHub ID/hello_node_alpine:v1.0

此时将会看到有两层映像被push上去,其中一个自然是原生的alpine,另一个则是我们在此之上做的修改。

两层

映像的再次使用

保存映像

使用命令:

1
docker save 你的DockerHub ID/hello_node_alpine:v1.0 -o I:/test.tar

将可以把该映像导出为test.tart

注意:使用 docker save image > file 在Win10下可能导致Error processing tar file(exit status 1): archive/tar: invalid tar header错误!

载入映像

使用命令:

1
docker load -i I:\test.tar