文章目錄
還是官方文檔好啊,跟着做一遍肯定就能搞明白,這邊文章基本就是官方入門的翻譯,外加我自己的一些理解,解決實踐過程中碰到的一些問題。
docker的三個元素
鏡像,容器,倉庫
docker和虛擬機有什麼區別?
如果不知道docker是什麼,可以先把他想象成一個虛擬機,下面會介紹docker和虛擬機的區別,從而理解docker。
docker比虛擬機更加輕量級,docker有獨立的文件系統,但是會和Linux宿主機共享內核,docker是操作系統虛擬化;而VM則是一個完整的操作系統通過設備虛擬化運行在宿主機上,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的時候我們部署項目都有哪些步驟呢?
- 環境準備:安裝操作系統,安裝軟件運行環境
- 部署項目:將項目代碼“拷貝”到服務器工作目錄,如果有外部依賴還需要下載依賴包(當然使用包管理器部署可以自動下載依賴)
- 啓動項目
那接下來我們打開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環境的過程。雖未深入,但作爲初步的入門體驗已經足夠了。