镜像,容器,仓库
如果不知道docker是什么,可以先把他想象成一个虚拟机,下面会介绍docker和虚拟机的区别,从而理解docker。
docker比虚拟机更加轻量级,docker有独立的文件系统,但是会和Linux宿主机共享内核,docker是操作系统虚拟化;而VM则是一个完整的操作系统通过设备虚拟化运行在宿主机上,VM是硬件资源虚拟化。
要知道系统内核在运行时是要常驻内存的,每运行一个虚拟机就要往内存载入一个内核。官方的一个对比图就很能说明问题。
简而言之,Kubernetes在可伸缩,网络,安全,维护方面为容器化的应用提供了许多工具。那么问题来了,我们为什么要使用这些工具呢?
官网把Kubernetes(还有Docker Swarm)称作"Orchestration",通过这个词我大概理解了一下,比如现在有一个很大的互联网公司,他向市场提供一个产品,这个产品是由很多容器化的服务构成的。假如该产品很成功,各项功能日趋完善,其内部服务变得越来越多,已经达到了即使容器化也很难管理的程度。这个时候就需要一个协调者负责容器的统一管理,使这个产品背后的众多服务能够更好的互相配合。
正如"Orchestration"这个词的含义。两个吉他手能够很好地配合完成一个曲子,但是100多号人的大型交响乐团如果没有一个指挥,能演奏的好才怪呢。
但是如果想真正理解光听别人说是没用的,还是要实践啊,下面进入实践环节。
如何下载参见官方文档。
Docker Desktop安装好之后可以在系统托盘找到,右键docker图标打开Settings -> Kubernetes,勾选 Enable Kubernetes,然后点击Apply。之后Kubernetes的配置会自动进行,比较耗时,成功之后Setting页的左下角如下显示。
这里有个问题。国内无法下载到Kubernete的文件,所以就会一直卡在Kubernete is starting
我们可以使用阿里提供的解决方案。
最后应该是这个样子
1.创建一个文件命名 pod.yaml
,内容为
apiVersion: v1
kind: Pod
metadata:
name: demo
spec:
containers:
- name: testpod
image: alpine:3.5
command: ["ping", "8.8.8.8"]
这个脚本创建一个容器,执行ping 8.8.8.8命令。
2.打开windows的powershell,进入pod.yaml
所在目录,执行
kubectl apply -f pod.yaml
创建pod。
3.检查pod的运行状态
kubectl get pods
你应该会看到如下信息
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 4s
代表成功启动。
4.查看pod的日志信息。
kubectl logs demo
你应该会看到如下信息
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=37 time=21.393 ms
64 bytes from 8.8.8.8: seq=1 ttl=37 time=15.320 ms
64 bytes from 8.8.8.8: seq=2 ttl=37 time=11.111 ms
...
5.最后,卸载测试pod
kubectl delete -f pod.yaml
1.拉取docker官方的一个示例项目
git clone -b v1 https://github.com/docker-training/node-bulletin-board
cd node-bulletin-board/bulletin-board-app
2.在查看Dockerfile之前我们其实可以先回想一下过往,在不使用docker的时候我们部署项目都有哪些步骤呢?
FROM node:6.11.5
WORKDIR /usr/src/app
COPY package.json .
RUN npm install
COPY . .
CMD [ "npm", "start" ]
FROM
命令:它始终在脚本最开始,声明镜像的基本环境,FROM node:6.11.5
声明镜像的基本环境是官方node镜像的6.11.5版本。WORKDIR
命令:后面跟一个目录,在这条命令之后,镜像内部会把这个目录作为当前目录COPY
命令:复制,把宿主机的文件复制到镜像内RUN
命令:在镜像创建时执行命令CMD
命令:该命令定义了我们启动虚拟机的时候需要执行的命令1.创建镜像
在node-bulletin-board/bulletin-board-app
目录下执行
docker image build -t bulletinboard:1.0 .
如果创建成功最后会显示Successfully tagged bulletinboard:1.0.
2.基于镜像启动一个容器
docker container run --publish 8000:8080 --detach --name bb bulletinboard:1.0
--publish
参数:把宿主机8000端口号映射到镜像8080端口--detach
参数:容器后台启动--name
参数:为容器起一个名字localhost:8000
即可看到应用页面4.测试通过可以把容器删除了,这是我们就可以使用我们之前给容器起的名字来指定我们想要删除的容器,我们想要删除"bb"
docker container rm --force bb
创建一个bb.yaml文件,内容为
apiVersion: apps/v1
kind: Deployment
metadata:
name: bb-demo
namespace: default
spec:
replicas: 1
selector:
matchLabels:
bb: web
template:
metadata:
labels:
bb: web
spec:
containers:
- name: bb-site
image: bulletinboard:1.0
---
apiVersion: v1
kind: Service
metadata:
name: bb-entrypoint
namespace: default
spec:
type: NodePort
selector:
bb: web
ports:
- port: 8080
targetPort: 8080
nodePort: 30001
在这个Kubernetes配置文件中有两个对象,用---
分割:
Deployment
:描述一组pods,在以上的配置中只有一个pod集群replica
,这个pod里边只有一个容器,这个容器基于之前我们创建的bulletinboard:1.0
镜像。简而言之就是描述从镜像->容器->pod->pods的生成规则NodePort service
:pods的网络服务的映射通过这一项是单独描述的,从宿主机的30001端口映射到pods的8080端口apiVersion
:指定解析配置文件的Kubernetes API版本kind
:指定是哪种对象metadata
:对象元数据,比如对象名spec
:指定对象的所有参数和配置部署应用很简单,命令如下:
kubectl apply -f bb.yaml
部署成功会回显
deployment.apps/bb-demo created
service/bb-entrypoint created
查看部署状态
kubectl get deployments
如果一切正常,将返回
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
bb-demo 1 1 1 1 48s
查看服务状态
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
bb-entrypoint NodePort 10.106.145.116 8080:30001/TCP 53s
kubernetes ClusterIP 10.96.0.1 443/TCP 138d
本地访问localhost:30001
可以看到bulletin board后台页面。
完成以上实践之后可以把卸载应用:
kubectl delete -f bb.yaml
什么是Swarm?
与Kubernetes一样,都是"orchestrator"。他们是可以互相替代的框架。和Kubernetes一样Swarm在可伸缩,网络,安全,维护方面为容器化的应用提供了许多工具。
运行命令
docker system info
如果看到Swarm: active
则说明环境已经准备好,否则使用docker swarm init
初始化环境
1.创建bb-stack.yaml:
version: '3.7'
services:
bb-app:
image: bulletinboard:1.0
ports:
- "8000:8080"
与Kubernetes不同的是Swarm的services包含容器组和网络定义。
1.部署命令
docker stack deploy -c bb-stack.yaml demo
如果一切正常将输出
Creating network demo_default
Creating service demo_bb-app
2.列出我们部署的service,查看状态
docker service ls
你可能看到的返回
ID NAME MODE REPLICAS IMAGE PORTS
il7elwunymbs demo_bb-app replicated 1/1 bulletinboard:1.0 *:8000->8080/tcp
3.目前为止一切正常的话打开localhost:8000
会看到bulletin board显示。
4.实验完成,卸载我们的应用
docker stack rm demo
到这里,我们已经完成了将一个应用部署到Kubernetes 环境和Swarm环境的过程。虽未深入,但作为初步的入门体验已经足够了。