Docker入門Kubernetes入門


還是官方文檔好啊,跟着做一遍肯定就能搞明白,這邊文章基本就是官方入門的翻譯,外加我自己的一些理解,解決實踐過程中碰到的一些問題。

docker的三個元素

鏡像,容器,倉庫

docker和虛擬機有什麼區別?

如果不知道docker是什麼,可以先把他想象成一個虛擬機,下面會介紹docker和虛擬機的區別,從而理解docker。
docker比虛擬機更加輕量級,docker有獨立的文件系統,但是會和Linux宿主機共享內核,docker是操作系統虛擬化;而VM則是一個完整的操作系統通過設備虛擬化運行在宿主機上,VM是硬件資源虛擬化。
要知道系統內核在運行時是要常駐內存的,每運行一個虛擬機就要往內存載入一個內核。官方的一個對比圖就很能說明問題。
docker VS VM

Kubernetes是什麼?

簡而言之,Kubernetes在可伸縮,網絡,安全,維護方面爲容器化的應用提供了許多工具。那麼問題來了,我們爲什麼要使用這些工具呢?
官網把Kubernetes(還有Docker Swarm)稱作"Orchestration",通過這個詞我大概理解了一下,比如現在有一個很大的互聯網公司,他向市場提供一個產品,這個產品是由很多容器化的服務構成的。假如該產品很成功,各項功能日趨完善,其內部服務變得越來越多,已經達到了即使容器化也很難管理的程度。這個時候就需要一個協調者負責容器的統一管理,使這個產品背後的衆多服務能夠更好的互相配合。
正如"Orchestration"這個詞的含義。兩個吉他手能夠很好地配合完成一個曲子,但是100多號人的大型交響樂團如果沒有一個指揮,能演奏的好纔怪呢。
但是如果想真正理解光聽別人說是沒用的,還是要實踐啊,下面進入實踐環節。

安裝Docker Desktop

如何下載參見官方文檔。
Docker Desktop安裝好之後可以在系統托盤找到,右鍵docker圖標打開Settings -> Kubernetes,勾選 Enable Kubernetes,然後點擊Apply。之後Kubernetes的配置會自動進行,比較耗時,成功之後Setting頁的左下角如下顯示。
這裏有個問題。國內無法下載到Kubernete的文件,所以就會一直卡在Kubernete is starting
我們可以使用阿里提供的解決方案
最後應該是這個樣子
在這裏插入圖片描述

測試Kubernetes是否安裝成功

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的時候我們部署項目都有哪些步驟呢?

  1. 環境準備:安裝操作系統,安裝軟件運行環境
  2. 部署項目:將項目代碼“拷貝”到服務器工作目錄,如果有外部依賴還需要下載依賴包(當然使用包管理器部署可以自動下載依賴)
  3. 啓動項目
    那接下來我們打開Dockerfile看看它都幹了些什麼。
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 命令:該命令定義了我們啓動虛擬機的時候需要執行的命令
    觀察Dockerfile裏的內容,我們可以發現,他做的工作也無非時環境準備,部署,啓動。但很讚的是通過腳本定義,再配合docker鏡像倉庫,我們可以實現全自動項目部署與啓動。

啓動並測試

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參數:爲容器起一個名字
    3.如果沒出現問題的話,訪問本地localhost:8000即可看到應用頁面

4.測試通過可以把容器刪除了,這是我們就可以使用我們之前給容器起的名字來指定我們想要刪除的容器,我們想要刪除"bb"

docker container rm --force bb

使用Kubernetes 部署應用

Kubernetes 三要素

  • Kubernetes Pods
  • Kubernetes Deployments
  • Kubernetes Services

使用Kubernetes定義一個應用

創建一個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   <none>        8080:30001/TCP   53s
kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP          138d

本地訪問localhost:30001可以看到bulletin board後臺頁面。
完成以上實踐之後可以把卸載應用:

kubectl delete -f bb.yaml

使用Swarm 部署應用

什麼是Swarm?
與Kubernetes一樣,都是"orchestrator"。他們是可以互相替代的框架。和Kubernetes一樣Swarm在可伸縮,網絡,安全,維護方面爲容器化的應用提供了許多工具。

初始化Swarm環境

運行命令

docker system info

如果看到Swarm: active則說明環境已經準備好,否則使用docker swarm init初始化環境

使用stack文件定義應用

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環境的過程。雖未深入,但作爲初步的入門體驗已經足夠了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章