K8s快速實戰(一)
今天是我開始學習Kubernetes的第一天!Kubernetes(又稱K8s)在現代的開發環境中,已經幾乎變成了必備技能了。也因此快速掌握Kubernetes的功能與特性也變得更加重要,那麼事不宜遲,我們就開始來學習K8s吧!
…我本來是想這麼說的,但是在提到K8s之前,我希望可以先解釋為甚麼K8s會變得更加重要,要談談K8s的崛起,我想免不了提到現代系統架構。K8s在微服務興起之後,變得相當知名,原因是因為微服務的要求有一個特點──”服務需要可以獨立部署”。
微服務簡單來說,就是將各個系統的功能依照業務邊界切割來達到職責分明,並且需要符合不少特性,就可以被稱為微服務。
在大型系統中如果採用微服務設計的話,可想而知,將會因功能切分,產生可能數以百計的服務,而這些服務若是一個個手動管理的話,維運工程師應該會抓狂,於是Kubernetes便是用來簡化複雜的容器部署功能,提供一連串簡易的設定讓軟體的部署可以快速、實現自動化。
單體式架構與微服務
單體式架構(Monolithic)定義是──利用單一個元件建構,以一個單一元件部署,因為所有功能都塞在一起,常常有牽一髮動全身的問題。
微服務(Microservice)是一個服務導向架構(Service-Orient architecture)的變形,將服務解構為一個個鬆耦合的應用程式元件。在微服務架構中,服務應該是輕量化且可獨立部署的。
此外還有以下特色:
- 單個元件擁有單一職責,權責分明
- 獨立擴展,不需耦合其他元件
- 可由不同Teams, 開發語言, 不同平台部署來部署,非常自由
- 一個微服務可以擁有自己的資料庫
Kubernetes提供了完整的介面去管理我們的服務,我們的程式碼通常會經由Docker打包一個可以在各個環境都可以運作的容器(Container)。
Docker
Docker是一個開源的Container執行環境,支援Mac, Windows與Linux,可以用Command Line Tool去控制。應用程式會透過Dockerfile去建構Container Image,透過Container使你的程式碼可以跨環境地執行。
甚麼是Container?
Container是一個軟體單元包含了你的程式碼、執行環境(Runtime)、System Tools、System Library。使用Docker部署有許多好處,除了幾乎不會遇到環境問題外,一個Container包含許多Image Layer,這代表如果你只改了一部分的功能,Docker會只重新編譯你更動的那部分,使用Image Layer可以大大提升執行/部署的效率。
如果沒學過或是不知道Docker是甚麼的人可以參考這篇文章(What is Docker?)
Docker Compose
在Docker中,我們也經常使用Docker Compose這個功能來管理我們的Container,你可以把Docker想成一個腳本,只要一運行就執行多個Container,設定連線、環境參數等等,幫你一次把整個環境做到好,簡單來說,就是這麼萬能的功能。
Docker Compose 特色
- 使用 YAML 格式的檔案來定義
- 定義與執行多個Container的應用程式
- 通常使用Docker CLI 來控制與執行
一個簡易的Docker Compose會像是這樣:
而Docker Compose也絕非萬能,通常來說,Docker Compose的使用情境如下:
- 不需要像是
K8s那樣高級的調度的服務。 - 開發環境與測試環境。
- 外部服務恰好支援Docker Compose 功能的,比方說:
- Azure App Service
- AWS ECS
- Virtual Machine
補充:Docker Compose的資源管理

補充:Docker Compose的環境參數管理 (內部預設值並可被外部指令覆蓋)

補充:Docker Compose的環境參數管理 (交給外部定義)

補充:Docker Compose的網路

App可以設定屬於的Network,達到公有子網路、私有子網路的效果。
補充:Docker Compose的執行順序
使用 Depends 可以確保一個服務會在另一個服務啟動後才跟著啟動,避免了未初始化完成造成的錯誤。
補充:Docker Compose的儲存
你可以建立一個Volume並把它掛載到一個Container上面,讓Container達到持久化儲存。
Docker Compose Restart Policy 重啟策略
🧠 補充建議
- 開發環境:通常用 no 或 on-failure,避免無限重啟造成混亂。
- 生產環境:建議使用 always 或 unless-stopped,確保服務穩定運行。
- 若搭配 健康檢查(healthcheck) 使用,可以更精準控制重啟時機。

常見Docker 指令
| Command | Description | |
|---|---|---|
| 1 | docker info |
Display System Information |
| 2 | docker version |
Display the system version |
| 3 | docker login |
Log in to a Docker registry |
| 4 | docker pull [image name] |
Pull an image from a registry |
| 5 | docker run [image name] |
Run container |
| 6 | docker run -d [image name] |
Run container in detached mode |
| 7 | docker start [container name] |
Start stopped containers |
| 8 | docker ps |
List running container |
| 9 | docker ps -a |
List running&stopped container |
| 10 | docker stop [container name] |
stop container |
| 11 | docker kill [container name] |
Kill container |
| 12 | docker image inspect [imageName] |
get image info |
| 13 | docker run --memory="256m" [imageName] |
Run container with Max memory |
| 14 | docker run --cpus=".5" [imageName] |
Run container with Max CPU |
| 15 | docker rm [container name] |
Delete the container |
| 16 | docker run --publish [outer port]:[inner port] --name [container name] [container image in the docker registry or nginx] |
Mostly used pattern |
| Docker cli - Attach shell | ||
| 1 | docker run -it [imageName] -- /bin/bash |
Attach shell |
| 2 | docker container exec -it [container name] -- bash |
Attach to a running container shell |
| Docker cli - Clean up&Build | ||
| 1 | docker rm $(docker ps -a -q) |
Remove all stopped container |
| 2 | docker images |
List images |
| 3 | docker rmi |
Delete image |
| 4 | docker system prune -a |
Removes all images not in use by any containers |
| 5 | docker build -t [name:tag] . |
Build and image using a Dockerfile localted in the same folder |
| 6 | docker build -t [name:tag] -f [filename] |
Build an image using a Dockerfile located in specified folder |
| Docker volume cheatsheet | ||
| 1 | docker create volume [volumeName] |
Create a new volume |
| 2 | docker volume ls |
List all volume |
| 3 | docker volume inspect [volumeName] |
Display the volume info |
| 4 | docker volume rm [volumeName] |
Remove volume |
| 5 | docker volume prune |
Remove all volumes not mounted |
| 6 | docker run -d --name devtest -v myvol:/app nginx:latest |
Run docker container with Volume |
| Docker compose cheat sheet | ||
| 1 | docker compose build |
Build the images |
| 2 | docker compose start |
Start the containers |
| 3 | docker compose stop |
Stop the containers |
| 4 | docker compose up -d |
Build and start |
| 5 | docker compose ps |
List what’s running |
| 6 | docker compose rm |
Remove from memory |
| 7 | docker compose down |
Stop and remove |
| 8 | docker compose logs |
Get the logs |
| 9 | docker compose exec [container] bash |
Run a command in a container |
| 10 | docker compose --project-name [projectName] up -d |
Run an instance as a project |
| 11 | docker compose -p [projectName] up -d |
Shortcut |
| 12 | docker compose ls |
List running projects |
| 13 | docker compose cp [containerID]:[src_path] [dest_path] |
Copy files from the container |
| 14 | docker compose exec [src_path] [containerID]:[dest_path] |
Copy files to the container |
Docker Compose → K8s 對照表
| 功能面向 | Docker Compose | Kubernetes 對應物件 |
|---|---|---|
| 服務管理 | service | Service |
| 容器定義 | container | Pod |
| 組態管理 | env file | ConfigMap / Secret |
| 資料持久化 | volume | PersistentVolume / PVC |
Finally
本文意在快速帶過Docker的概念,想要完整學習Docker的人建議還是看過相關教學之後再繼續學習,本文只專注提到那些對Kubernetes來說重要的Docker特性,下一篇我們正式進入Kubernetes。我們下次見。