Docker k8s篇

9/25/2024 swiftvapordockerk8s

# 使用Docker运行一个Hello world容器

$ docker run busybox echo "Hello world"

busybox是一个单一可执行文件,包含多种标准UNIX命令行工具,如:echo、ls、gzip 等。除了包含 echo 命令的 busybox 命令,也可以使用如Fedora、Ubuntu等功能完备的镜像。

使用 docker run 命令然后指定需要运行的镜像的名字,以及需要执行的命令

应用是在容器内部被执行的,完全独立于其他所有主机上运行的进程。

执行 docker run 命令之后发生的事情: 首先,Docker会检查busybox:latest 镜像是否已经存在于本机。 如果没有,Docker 会从 http://docker.io 的 Docker 镜像中心拉取镜像。 镜像下载到本机之后,Docker基于这个镜像创建一个容器并在容器中运行命令。 echo 命令打印文字到标准输出流,然后进程终止,容器停止运行。

# 创建一个简单的 Node.js 应用

构建一个简单的Node.js Web应用,并把它打包到容器镜像中。这个应用会接收HTTP请求并响应应用运行的主机名。这样,应用运行在容器中,看到的是自己的主机名而不是宿主机名,即使它也像其他进程一样运行在宿主机上。

// app.js
const http = require('http');
const os = require('os');

console.log('Hello from ' + os.hostname());

var handler = function(request, response) {
    console.log("request received");
    response.writeHead(200);
    response.end("Hello, World!" + os.hostname() + "\n");
};
var www = http.createServer(handler);
www.listen(8080);

为镜像创建 Dockerfile, 文件在app.js文件同一目录

FROM node:latest
ADD app.js /app.js
ENTRYPOINT ["node", "app.js"]

From 行定义了镜像的起始内容(构建所基于的基础镜像)。这个例子中使用的是 node 镜像的tag latest 版本。第二行中把app.js文件从本地文件夹添加到镜像的根目录,保持app.js这个文件名。最后一行定义了当镜像被运行时需要被执行的命令,这个例子中,命令是 node app.js。”

构建镜像:

docker build -t kubia .

用户告诉Docker需要基于当前目录(注意命令结尾的点)构建一个叫kubia的镜像,Docker会在目录中寻找Dockerfile,然后基于其中的指令构建镜像。

运行容器:

docker run --name kubia-contianer -p 8080:8080 -d kubia

告知Docker基于 kubia 镜像创建一个叫 kubia-container 的新容器。这个容器与命令行分离(-d 标志),这意味着在后台运行。本机上的8080端口会被映射到容器内的8080端口(-p 8080:8080 选项),所以可以通过 http://localhost:8080 访问这个应用。

# 配置Kubernetes集群

应用被打包在一个容器镜像中,并通过Docker Hub给大家使用,可以将它部署到Kubernetes 集群中,而不是直接在 Docker 中运行。但是需要先设置集群。

$ kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:6443
CoreDNS is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

这里显示集群已经启动。它显示了各种Kubernetes组件的URL,包括API服务器和Web控制台。

部署Node.js应用:

部署应用程序最简单的方式是使用 kubectl run 命令,该命令可以创建所有必要的组件而无需JSON或YAML文件。

$ kubectl run kubia --image=kubia --port=8080 --image-pull-policy=Never

一个pod是一组紧密相关的容器,它们总是一起运行在同一个工作节点上,以及同一个 Linux 命名空间中;每个pod都有自己的ip,并包含一个或多个容器,每个容器都运行一个应用进程。

列出pod:

 $ kubectl get pods

如何访问正在运行的pod?

每个pod 都有自己的ip地址但是这个地址是集群内部的,不能不从集群外部访问。需要通过服务对象公开它。

$ kubectl expose pod kubia --type=LoadBalancer --name kubia-http

列出服务

$ kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP    97m
kubia-http   LoadBalancer   10.100.108.138   localhost     8080:30751/TCP   5s

暂时忽略 kubernetes 服务,仔细查看创建的kubian服务。负载均衡启动后,应该会显示服务的外部IP地址。

上次更新: 9/25/2024, 5:03:10 PM