教程来自k8s in Action书籍,在这里纪录学习笔记
第一步,重拾docker
安装虚拟机,centOS7,docker,网上都有。第一步,学会构建镜像
先在Linux下的随意一个文件夹下准备好两个文件,app.js和Dockerfile
const http = require('http');
const os = require('os');
console.log("Kubia server starting...");
var handler = function(request, response) {
console.log("Received request from " + request.connection.remoteAddress);
response.writeHead(200);
response.end("You hit " + os.hostname() + "\n");
};
var www = http.createServer(handler);
www.listen(8080);
代码清晰地说明了实
现的功能
这里在8080
端口启动了
HTTP
服务器。
服务器会以状态码
200
OK
和文字
you
hit
<hostname
>
来响应每个请求。
请求
handler
会把客户端的
IP
打印
到标准输出
,以
便日后查看。
注意:返回的主
机名是服务器真实的主
机名,不是客户端发出的
HTTP
请求
中头的
Host 字段
为了把应用打包成镜像,首先需要创建
个叫
Dockerfile
的文件,它包含了
系列构建镜像时才会执行的指令
Dockerfile
文件需要和 a
pp.js
文件在同
目录,并包 含下面代码清单中的命令
FROM node:7
ADD app.js /app.js
ENTRYPOINT ["node", "app.js"]
From
行定义了镜像的起始内容(构建所基于的基础镜像)
这个例子中使用的是node
镜像的
tag 7版
本。
第二
行中把
ap
p.js
文件从本地
件夹添加到镜像的根目
录,保持 a
pp.js
这个文件名。
最后一
行定义了当镜像被运行时需要被执行的命令,
这个例子中,命令是 n
ode
app
.
js
为什么选择基础镜像
你或许在想,为什么要选择这个镜像作为基础镜像
因为这个应用是
Node.
js 应用,镜像需要包
含可执行的
node
进制文件来运行应用。
你也可以使用任何包含这个二进制文件的镜像,或者甚至可以使用 Linux
发行版的基础镜像,如fedora或ubuntu
,然后在镜像构建的时候安装
Node.js
但是由于
node
镜像是专
门用
来运行
Node.js
应用的,并且包含了运行应用所需的
一切,
所以把它当作基础镜像。
然后输入命令构建
docker build -t kubia .
别忘了结尾的点,不然构建失败。用户告诉Docker需要基于当前目录,构建一个叫kubia的镜像,Docker会在目录中寻找Dockerfile,然后基于其中的指令构建镜像。
镜像分层
你或许会认为每个Dockerfile只创建一层,其实不是,构建时,每条单独的指令都会创建一个新层。镜像构建的过程中,拉取基础镜像所有分层之后,Docker在它们上面创建一个新层并且添加app.js。然后回创建另一层来指定指定镜像运行时所执行的命令。最后一层会被标记为kubia:latest。下图展示了这个过程。同时也会展示另外一个叫other:lastest的镜像如何与我们构建的镜像共享同一层 Node.js镜像。
此时镜像构建完成。
可以跑起来了
docker run --name kubia-contaioner -p 8080:8080 -d kubia
这条命令告知Docker基于kubia镜像创建
一
个叫kubia-container的新 容器。 这个容器与命令行分离(-d标志), 这意味着在后台运行。 本机上的8080端口会被映射到容器内的8080端口(-p8080: 8080选项), 所以可以通过http:// localhost: 8080访间这个应用。
后面这串英文数字就是把主机名返回,但不是宿主机的主机名,是Docker容器的ID。
接下来,跑成功了还得研究它的内部。由于一个容器里可以运行多个进程,所以总是可以运行新的进程去看看里面发生了什么。如果镜像里有可用的shell二进制可执行文件,也可以运行一个shell。
Node.js镜像包含了bash shell,所以可以像这样在容器内运行shell
coker exec -it kubia-container bash
这会在已有的kubia-container容器内运行bash。bash进程会和主容器进程拥有相同的命名空间。这样可以从内部探索容器,查看Node.js和应用是如何在容器里运行的。-it选项是下面两个选项的简写:
-i,确保标准输入流保持开放。需要在shell中输入命令
-t,分配一个伪终端(TTY)
如果希望像平常一样使用shell,需要同时使用这两个选项(缺少第一个就无法输入任何命令。缺少第二个,那么命令提示符不会显示,并且有些命令会提示TERM变量没有设置)
从内部探索容器。下面都展示如何使用shell查看容器内运行的进程。
进程的ID在容器中与主机不同。容器使用独立的PID Linux命名空间并且有着独立的系列号,完全独立于进程树。
正如拥有独立的进程树一样,每个容器也拥有独立的文件系统。在容器内列出根目录的内容,指挥展示容器内的文件,包括镜像内的所有文件,再加上容器运行时创建的任何文件(类似日志文件)
其中包含app.js文件和其它系统目录,这些目录是正在使用的node:7基础镜像的一部分。可以使用exit命令退出容器。
停止和删除容器
docker stop kubia-contaioner
因为没有其他的进程在容器内运行,这会停止容器内运行的主进程。容器本身仍然存在并且可以通过docker -ps -a来查看。-a 选项打印出所有的容器,包括运行中的和已经停止的。
docker rm kubia-contaioner
镜像仓库推送镜像
这里就注册Docker Hub。然后根据Docker Hub的规则标注镜像。Docker Hub允许向你的Docker Hub ID开头的镜像仓库推送镜像。
然后根据注册ID重命名