docker相关概念:
镜像(Image)
- Docker镜像可以简答理解成Linux的文件系统,这个文件系统包含了可以运行在Linux内核的程序以及相应的数据。
- 如果了解Linux操作系统的相关知识,也可以把镜像看成是用户空间,当Docker通过镜像创建一个容器的时候,就是把镜像定义好的用户空间作为独立隔离的进程运行在宿主机的linux内核之上。
- 镜像特征:
- 镜像是分层的(Layer):即一个镜像可以多个中间层组成,多个镜像可以共享同一个中间层,也可以通过镜像添加多一层来生成一个新的镜像。
- 镜像是只读的(read-only):镜像在构建完成之后,便不可以再修改,而上面说的添加一层构建新的镜像,这中间实际是通过创建一个临时的容器,在容器上增加或删除文件,从而形成新的镜像。
容器
- 容器是通过镜像来创建的,生成的容器是一个独立于宿主机的隔离进程,并且有属于自己的网络和命名空间。
- 镜像是只读的,但容器是可读可写的,这是因为容器是在镜像上面天一层读写层来实现的
仓库
仓库用来存储镜像
docker解决的问题
解决了资源隔离的问题:
namespace | 隔离内容 | 系统调用参数 |
---|---|---|
UTS | 主机名与域名 | CLONE_NEWUTS |
IPC | 信号量、消息队列和共享内存 | CLONE_NEWIPC |
Network | 网络设备、网络栈、端口等 | CLONE_NEWNET |
PID | 进程编号 | CLONE_NEWPID |
Mount | 挂载点(文件系统) | CLONE_NEWNS |
User | 用户和用户组 | CLONE_NEWUSER |
docker的简单使用
镜像操作
-
拉取镜像:docker pull centos
-
本地镜像列表:docker images
-
生成镜像
docker build -t harbor.aipo.lenovo.com/apisix/etcd:3.3.13 -f etcd.dockerfile .
etcd.dockerfile内容形如:
FROM 10.110.152.173:80/base_env/centos:java8 WORKDIR /root/services COPY uuid-service-0.0.1-SNAPSHOT.jar . EXPOSE 30001 ENTRYPOINT ["java","-jar","uuid-service-0.0.1-SNAPSHOT.jar","--server.port=30001"]
-
保存镜像:docker push
docker push harbor.aipo.lenovo.com/apisix/etcd:3.3.13
容器操作
- 运行容器:docker run -it centos /bin/bash
- -i: 交互式操作。
- -t: 终端。
- ubuntu: ubuntu 镜像。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
- 要退出终端,直接输入 exit:
- 查看启动的容器:docker ps -a
- 进入容器
docker exec -it 243c32535da7 /bin/bash
- 查看容器日志
docker logs -f 容器id
其他容器和镜像相关操作,参考:https://www.runoob.com/docker/docker-container-usage.html
kubernetes介绍
kubernetes解决了哪些问题
kubernetes是谷歌开源的容器集群管理系统,是Google多年大规模容器管理技术Borg的开源版本
- (1)基于容器的应用部署、维护和滚动升级
- (2)网络,建立容器之间的通信子网如隧道、路由等,解决容器的跨节点通信问题。
- (3)内置DNS服务和kube-proxy用于服务发现及负载均衡
- (4)资源管理,包括容器使用的资源限制,以及将容器调度到对用的集群节点上
- (5)Docker 也有Volume的概念,但是相对简单,而且目前的支持很有限,Kubernetes对Volume则有着清晰定义和广泛的支持。
- (6)对容器运行状态的监控
k8s几个重要概念
- namespace命名空间
- pod:在集群上运行的进程,是k8s应用程序的基本执行单元——创建或部署的k8s对象模型中最小、最简单的单元。
- service:用于定义一组逻辑Pods以及访问它们的政策,相当于微服务的概念,扮演负载均衡器的角色。
- Container:容器是应用程序及其在运行时所需要的依赖的打包。一个Pod支持运行多个容器,但大多数情况下一个Pod只会运行一个容器。
- Deployment:给Pods和ReplicaSets提供更新声明。比如下面的Deployment就会告诉k8s去创建一个ReplicaSet去启动3个Pods:
- 编排文件
apiVersion: v1
kind: Namespace
metadata:
name: saas
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: uuid-server
namespace: saas
labels:
app: uuid-server
spec:
replicas: 3
selector:
matchLabels:
app: uuid-server
strategy:
type: Recreate
template:
metadata:
labels:
app: uuid-server
spec:
containers:
- name: uuid-server
image: 10.110.152.173:80/apisix/uuid:v1.0.0
imagePullPolicy: Always
ports:
- name: http
containerPort: 30001
---
apiVersion: v1
kind: Service
metadata:
name: uuidservice
namespace: saas
spec:
type: NodePort
selector:
app: uuid-server
ports:
- name: http
port: 80
targetPort: 30001
nodePort: 30001
kubernetes使用简介
kubectl apply -f etcd.yaml
kubectl get pods -n saas -o wide
kubectl logs pods/etcd-server-746d5b4cf7-th44j -c etcd-server --namespace=saas # --previous 该参数可以查看上一次启动的容器的日志,非常有用
kubectl exec -it etcd-server-746d5b4cf7-k4bhv -c etcd-server -n saas /bin/bash
kubectl get svc -n saas -o wide
更新镜像版本:
kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1
kubectl get pod -n saas -o yaml
kubectl describe deployment uuid-server -n saas
回滚:
https://www.cnblogs.com/benjamin77/p/9936543.html
Deployment只负责管理不同的版本的ReplicaSet,由ReplicaSet管理Pod副本数
每个ReplicaSet对应Deployment template的一个版本
一个ReplicaSet下的Pod都是相同的版本。
能够快速的理解镜像,下一个定义,镜像就是使用namespace隔离的,文件系统的抽象,文件系统是分层叠加的,docker inspect +镜像id or 容器id,可以查看文件目录抽象