Docker and Kubernetes: The Complete Guide 學習筆記

date
Aug 11, 2023
slug
docker-and-kubernetes-the-complete-guide-learning-notes
status
Published
tags
DevOps
summary
🐳٩(◕‿◕。)۶☸️
type
Post
最近工作上遇到蠻多部署方面的問題,覺得對於 docker 和 k8s 真的太不熟悉,於是下定決心買了 Udemy 上的熱門課程 Docker and Kubernetes: The Complete Guide 來看,這篇將紀錄學習的進度,總時長是 22 hr,希望能全部看完 ( • ̀ω•́ ).
 

Containerization

容器化的好處在於簡化了很多環境建置的處理,而主流的 Docker 是藉由 linux 中的 namespacing 和 cgroup 來隔離及限制硬體的存取。不過這兩個 feature 是 linux only,所以 Docker 跑在 windows or macOS 上其實背後都是跑 Linux 的 virtual machine。

Docker - Client & Server

真正負責處理 image 和 container 的是 Docker server (daemon),而我們用的 Docker client (CLI) 其實只是呼叫 Docker server 暴露的 interface 而已。

Docker Image

Image 可以拆成兩部分來看,FS snapshot 和 startup command。而後者能在 docker create 時去 override。

Docker Commands

docker run <image>

= docker create + docker start
預設跑起來的 container 如果傳送 SIGTERM 或 SIGKILL 都只會 exit,實際的 metadata 其實還留著。所以還是可以藉由 docker start 重新跑起來。如果要讓 container 離開後就自動刪掉,可以帶上 --rm
如果是互動式的 CLI 可以帶上 -it,i 代表 interactive,t 則是代表 pretty TTY。前者會 pipe 你的 STDIN 到 container 內,後者我覺得比較神秘,作者是說可以讓輸入的 format 變漂亮,實際用 docker run -it bash ls 來測試,的確被上色了,而 Google 後有翻到一篇,有說如果沒加 -t 在 windows 上跑,ls 後面會被 append \r,不過手邊沒有 windows 所以就沒進一步測試了。
 
如果需要 expose port,可以使用 -p,syntax 是 <host port>:<container port>

docker create <image>

和 docker run 時一樣可以帶入 override command。

docker start <container id>

帶上 -a 可以 attach output 到 terminal,如果沒有 attach,但想要看 output,可以使用 docker logs。

docker stop <container id>

send SIGTERM to container. 如果超過 10 秒的話會自動送 SIGKILL。

docker kill <container id>

send SIGKILL to container

docker rm <container id>

 

docker logs <container id>

可以帶上 -f 去即時看到最新的 log (f stands for “follow”)

docker exec <container id> <command>

用途是在一個 container 下執行多個 command。和 docker run 一樣可以帶上 -it

docker build <build context>

-t: 標記 tag,convention 是 <docker id>/<project name>:<version>

docker commit

一般不會用到,可以將指定的 container 生成 image。

docker system prune

清空間的好幫手,下這個指令時會告訴你他會做哪些事,不用擔心直接東西被砍掉

Dockerfile

一系列的 instructions,能藉由 docker build 指令來產出 Docker image。每一個指令都會使用上一步的 image 建立 container 來使用,會一步一步產生 intermediate image,層層堆疊上去。
 
一個簡單的範例

Docker Compose

可以方便地管理多個 service,預設會跑在同個 Docker network 下,所以也可以用 service name 互相溝通。
service name discovery 只在自訂的 docker network 有效,預設綁定的 bridge network 上沒有作用,詳細可看 https://godleon.github.io/blog/Docker/docker-network-bridge/ 這篇的測試。

Commands

  • docker compose up
    • -d: 跑在 background
    • --build: 會 build 完後再 docker run
  • docker compose down
  • docker compose ps

Docker Storage

常用的主要分兩種,Bind Mounts 和 Volume。
 

Bind Mounts

掛載 host 上的目錄到 container 上
 

Volume

使用 Docker 自己的目錄來掛載,如果是 Linux 通常放在 /var/lib/docker/volumes 中。
而掛載 Volume 可以分為 named 和 anonymous 兩種。後者除了 Docker 會自動生一個不會撞名的 volume 外,行為上都和前者一樣。
💡
如果是掛上空的 volume,會先以目標上有的檔案進行初始化
 
(持續更新中)

© maxam 2023 - 2024