不賴陪你玩 Docker

docker 自架服務不求人


嘿!兩兩分組認識一下如何? (15 mins)


出場人物

  • 所有的與會成員
  • 伴1:Fly(不賴)
  • 伴2/3:饅頭/石頭

伴學目標

  • 讓任何人都可以在自己電腦執行想要的數位服務
    • 你就是那個任何人,可以想想要玩什麼服務
  • 交流理解的 Docker 原理
  • 整合進入自己的長期專案?

不賴的 Docker 經驗

  • 利用中研院虛擬主機上跑它來執行機器學習作台語語音辨識實驗
    • 機中機中機中機……的概念

Why Docker


一些好處

  • 持續整合的:Docker 讓環境統一變得更容易,這有助於設計持續整合、持續部署的架構。
  • 大禮包:只要雲端服務或機器支援 Docker,就能運行 Docker 包裝好的服務。
  • 好版控:Docker 使用 Dockerfile 的純文字檔做為建置 image 的來源,這代表 Docker 實現了環境即程式碼(Infrastructure-as-code,IaC),環境資訊可以被版控系統記錄。
  • 輕:同為虛擬化技術,Docker(或指 container)的資源使用率較 VM 好,它直接跟底層共用作業系統,不需中間再隔一層作業系統虛擬層,因此啟動 container 非常快。
  • 熱門:Docker 應用場景橫跨開發與維運,也是 DevOps 熱門技能之一。
    https://ithelp.ithome.com.tw/articles/10237506

嘿!安裝 Docker 來相陪 (30 mins)

  • 來以作業系統分組互助吧
  • 主持人遊走各系統群交流經驗

安裝 Docker
https://docs.docker.com/desktop/
https://ithelp.ithome.com.tw/articles/10238198
https://ithelp.ithome.com.tw/articles/10201630
虛擬機安裝 https://ithelp.ithome.com.tw/articles/10193928

MAC

裝完即用

brew cask install docker

WINDOWS

可能會碰到的坑

  • 要裝服務 Hyper-v
    - 可使用虛擬機安裝(過時)
    有時候因為某些理由,可能會不想或無法(如 Windows 7)在原生系統上安裝 Docker,這時可以考慮使用虛擬機安裝。
    https://ithelp.ithome.com.tw/articles/10238198

LINUX (todo)

注意:必須要是 64-bit 版本才能運行 Docker。

sudo curl -fsSL https://get.docker.com/ | sh
sudo usermod -aG docker your-user

嘿!三三兩兩來研究想一鍵啟動服務吧

一行指令快速啟動你要的服務


一些 Image 範例


技術原理(如果有興趣了解再看下去)

嘿!Docker

  • 邀請大家分享對 Docker 技術面認知

Docker 包括三個基本概念 :

映像檔(Image)唯讀映像檔,可堆疊的貨櫃
容器(Container) image 執行起來的 process,船運行程
倉庫(Repository)存放處,港口倉庫


另一個與 repository 很像,但容易混用的名詞為 Registry,後者涵蓋範圍更廣,包含了更多 repository 與身分驗證功能等,通常比較常討論的也是 registry。

目前 Docker 預設的 registry 為 DockerHub,大多數程式或服務的 image 都能在上面找得到。

https://hub.docker.com ,港口


Image、container、repository 之間的關係就像光碟一樣:早期世紀帝國等光碟遊戲,會需要搭配其他可讀寫空間(如硬碟),才有辦法執行。
Image 像光碟片一樣,唯讀且不能獨立執行
Container 像硬碟一樣,可讀可寫可執行
Repository 則是光碟盒,而 Registry 則是像光碟零售商
https://ithelp.ithome.com.tw/articles/10238216



https://ithelp.ithome.com.tw/articles/10238216


玩映像檔 Image

拉 image
docker pull hello-world

求救
docker help

docker run
用來執行 container

docker logs
用來查看 container 的 log 訊息
docker ps
用來顯示有哪些container 在執行,如果下-a參數把沒有執行的列出來

docker rm
刪除 container

docker rmi
刪除 Docker Image

# 使用 CONTAINER ID: 6d7e00198a56 或 NAMES: relaxed_bhabha 皆可
docker rm 6d7e00198a56


玩容器 Container

docker run -it ubuntu /bin/bash 
apt-get update
apt-get install -y apache2
service apache2 start

https://ithelp.ithome.com.tw/articles/10190921

-i|interactive 和 -t|tty


docker exec VS docker run

docker run 與 docker exec 做的事很相似,決定性差異在於:docker run 會產生新的 container,而 docker exec 需要運行中的 container。


玩 registry

docker run -d -p 5000:5000 -v /home/user1/storage:/var/lib/registry --name registry registry:2


Image 匯出與讀取

從一台電腦存image
docker save -o hello-world.tar hello-world
到另台電腦可以
docker load -i hello-world


Docker Volume 處理資料


在預設的Docker daemon下,我們常會遇到幾種情況:

  • 當該容器不再存在時,數據將不會持久保存,並且如果另一個Process需要它,則可能很難從容器中取出數據。
  • 容器的可寫層與運行容器的主機緊密耦合。您不能輕易地將數據移動到其他地方。
  • 寫入容器的可寫層需要 存儲驅動程序來管理文件系統。存儲驅動程序使用Linux內核提供聯合文件系統。與使用直接寫入主機文件系統的數據卷相比,這種額外的抽象降低了性能 。

在使用 docker run 指令時,指定 -v 參數,使得實體主機的資料夾路徑 Mapping 到 Container 的資料夾路徑,指令如下

docker run -it -v /home/user1/storage:/storage centos /bin/bash

/home/user1/storage 是實體主機的資料夾路徑 Mapping 到 Container 裡面的 /storage 資料夾路徑。

https://ithelp.ithome.com.tw/articles/10192397
https://ithelp.ithome.com.tw/articles/10241922


network

Container是個封閉的空間,但難免有些功能開發是需要與其他Containers甚至是外界串接的,因此Docker network因應不同需求發展出了多種類別的network
https://ithelp.ithome.com.tw/articles/10242460


docker-compose 處理多個 Container


想要彈性地處理更多子服務,可以了解 Docker-compose
參見
https://g0v.hackmd.io/65RtkztoTDuDVreqtFHxtQ#主要結構說明
https://ithelp.ithome.com.tw/articles/10194183
https://ithelp.ithome.com.tw/articles/10243618


查看 Docker Container 的資源使用狀態

docker stats nginx1 nginx2 
 
限制 ram 的使用
docker run --memory 512MB --name nginx3 -d nginx

限制 CPU 的使用
docker run --cpu-period=1000000 --cpu-quota=500000 --name cputest2 -it centos /bin/bash


-c / —cpus

原本預設值為1024, 一半即為512,是相對值,佔用主機一半cpu資源
https://ithelp.ithome.com.tw/articles/10243101


Container 應用

https://ithelp.ithome.com.tw/articles/10242637


Docker build / Dockerfile to Image

https://ithelp.ithome.com.tw/articles/10244280
using cache
https://ithelp.ithome.com.tw/articles/10246065

https://ithelp.ithome.com.tw/articles/10240510



可能的坑


非伺服器也能對外開放服務,反向代理

反向代理讓你的桌機自架服務可以快速對外開放

  • 徵求對反向代理有經驗的朋友分享

Ngrok


More


localtunnel

https://github.com/localtunnel/localtunnel


One more thing

  • 編輯器外掛 Vscode + docker

參考

https://g0v.hackmd.io/@MRLyM3ynSfmNj1QrR_csrQ/SJx85m828
https://hackmd.io/v1jFG5KhTnKX5gGKjtf8lg
https://www.osboxes.org/virtualbox-images/
為各種框架 build image https://ithelp.ithome.com.tw/articles/10247679


好吧,你說你只是想要簡單架服務?

連 Docker 都不用學,直接在 VPS 上快速啟用想要的服務(我是不是太晚講? XD)
https://www.youtube.com/watch?v=D1soV_Ff7uk

Select a repo