文章目录
创建、运行及共享容器镜像
我们尝试创建一个简单的应用,并在k8s中部署和运行它。
创建一个简单的Node.js应用
- 创建一个名为helloworld的文件夹,然后进入文件,创建一个app.js文件,内容如下:
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've hit " + os.hostname() + "\n");
};
var www = http.createServer(handler);
www.listen(8080);
代码清晰地说明了实现的功能。这里在8080端口启动了一个HTTP服务器。服务器会以状态码200 OK和文字"You’ve hithostname:"来响应每个请求。
- 为镜像创建名为Dockerfile文件,内容如下:
FROM node:7
ADD app.js /app.js
ENTRYPOINT [ "node", "app.js" ]
为了把应用打包成镜像,首先需要创建一个叫Dockerfile的文件,它包含了一系列构建镜像时会执行的指令。Dockerfile文件需要和app.js文件在同一目录。
构建容器镜像
在helloworld目录下,执行如下命令:
# docker build -t <镜像名:版本号> <项目所在目录, .表示当前目录>
docker build -t kubia:v1 .
# 查看创建的镜像
docker images
运行容器镜像
docker run --name k1 -p 8080:8080 -d kubia:v1
# 查看创建的容器
docker ps
# docker ps只会展示容器的大部分基础信息。可以使用docker in inspect查看更多的信息。会打印出包含容器底层信息的长JSON。
docker inspect k1
- 访问应用,通过浏览器访问localhost:8080,或者执行如下命令
curl localhost:8080
探索运行容器的内部
# 进入docker容器内部
docker exec -it k1 bash
# 查看容器中运行的进程信息
ps aux |grep app.js
# 退出容器,在系统中执行命令
ps aux |grep app.js
此时我们仍然能找到容器内的进程,这证明了运行在容器中的进程是运行在主机操作系统上的。
停止和删除容器
# 停止容器
docker stop k1
# 删除容器
docker rm k1
向镜像仓库推送镜像
现在构建的镜像只可以在本机使用。为了在任何机器上都可以使用,可以把镜像推送到一个外部的镜像仓库。为了简单起见,不需要搭建一个私有的镜像仓库,而是可以推送镜像到公开可用的镜像中心。这里我们使用阿里云 的镜像中心。
1. 创建阿里云账号、登录
- 创建阿里云账号、登录。
- 进入控制台、搜索“容器镜像服务”并进入。
2. 创建个人实例并进入,然后创建命名空间
3. 创建镜像仓库
创建镜像仓库完成后,点击管理,查看镜像信息。可以看到,如何登陆,拉取,推送等。
4. 在本地docker上登录阿里云仓库
docker login --username=xxxx registry.cn-hangzhou.aliyuncs.com
# 查看登录信息
cat /root/.docker/config.json
5. 推送镜像到阿里云
docker tag e56bbdd6fb8d registry.cn-hangzhou.aliyuncs.com/xylearn/kubia:v1
docker push registry.cn-hangzhou.aliyuncs.com/xylearn/kubia:v1
在阿里云中可以查看到上传的镜像
在k8s上部署Node.js应用
部署步骤
# 从阿里云拉取kubia镜像
docker pull registry.cn-hangzhou.aliyuncs.com/xylearn/kubia:v1
# 将docker镜像导入kind
kind load docker-image registry.cn-hangzhou.aliyuncs.com/xylearn/kubia:v1
# 创建pod
kubectl run kubia --image=registry.cn-hangzhou.aliyuncs.com/xylearn/kubia:v1 --port=8080
# 查看pods,可以看到pods处于running状态,表示pod正常启动了
kubectl get pods
# 查看pod详细信息
kubectl describe pods kubia
# 此时我们直接连8080端口是访问不了部署的应用的。我们需要将本地网络端口转发到pod的8080端口
kubectl port-forward kubia 8888:8080
# 在另一个终端中,向pod发送一个http请求,结果如下
curl localhost:8888
后台实现过程
下图展示了部署node.js应用的后台实现过程。
-
执行
docker push registry.cn-hangzhou.aliyuncs.com/xylearn/kubia:v1
,docker将镜像推送到阿里云镜像仓库。 -
执行命令
kubectl run kuba --image=registry.cn-hangzhou.aliyuncs.com/xylearn/kuba:v1 --port=8080
后,kubectl向Kubernetes的主节点发送一个REST HTTP请求。 -
主节点创建了一个新的pod,调度器将其调度到一个工作节点上。
-
对应工作节点的Kubelet收到通知,就告知Docker从镜像中心中拉取指定的镜像。下载镜像后,Docker创建并运行容器。
参考资料
- docker将镜像推送到阿里云
- 《Kubernetes in Action》
附录
kind常用命令
# 将docker镜像导入kind
kind load docker-image registry.cn-hangzhou.aliyuncs.com/xylearn/kubia:v1
# 将镜像my-image加载到特定的kind节点(例如名为kind-2的节点):
kind load docker-image my-image --name kind-2
# 导出的镜像压缩包(例如/my-image-archive.tar)加载到kind中
kind load image-archive /my-image-archive.tar
# 删除cluster
kind delete clusters <cluster name>
# 创建cluster
kind create cluster
# 根据配置文件multi.yaml创建cluster
kind create cluster --name multi-node --config=multi.yaml
# 查询集群
kind get clusters
minikube常用命令
# 在 minikube 中构建一个容器镜像
minikube image build -t <IMAGE_NAME> .
# 将镜像加载到 minikube 中
minikube image load kuba:v1
# 查询本地镜像
minikube image ls
# 拉取镜像
minikube image pull <IMAGE_NAME>
# 推送镜像
minikube image push <IMAGE_NAME>
# 删除本地镜像
minikube image rm image <IMAGE_NAME>
# 把minikube的镜像保存到docker中
minikube image save <IMAGE_NAME>
# 为镜像打标签(修改镜像名和版本)
minikube image tag <old image> <new image>