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