mynote
Image 包裝了一個執行特定環境所需要的資源。
每個 image 都有獨一無二的 digest,這是從 image 內容做 sha256 產生的。這個設計能讓 image 無法隨意改變內容,維持資料一致性。
雖然 image 裡有必要的資源,但它無法獨立執行,必須要靠 container 間接執行。
基於 image 可以建立出 Container。
它的概念像是建立一個可讀寫內容的外層,架在 image 上。實際存取 container 會經過可讀寫層與 image,因此看到的內容會是兩者合併後的結果。
Container 特性跟 image 不一樣,因為有可讀寫層,所以 container 可以讀寫,也可以拿來執行。
container可以儲存資料, 如果重新創建container,就會變為一個全新的os
Repository 是存放 image 的空間。
Docker 設計類似分散式版本控制的方法來存放各種 image。而分散式架構就會有類似 git 的 pull / push 行為,實際做的事也跟 git 類似:為了要跟遠端的 repository 同步。
另一個與 repository 很像,但容易混用的名詞為 Registry,後者涵蓋範圍更廣,包含了更多 repository 與身分驗證功能等,通常比較常討論的也是 registry。
目前 Docker 預設的 registry 為 DockerHub,大多數程式或服務的 image 都能在上面找得到。
Image、container、repository 之間的關係就像光碟一樣:早期世紀帝國等光碟遊戲,會需要搭配其他可讀寫空間(如硬碟),才有辦法執行。
Image 像光碟片一樣,唯讀且不能獨立執行
Container 像硬碟一樣,可讀可寫可執行
Repository 則是光碟盒,而 Registry 則是像光碟零售商
docker run image_name
docker run的行為如下
docker ps
列出所有 Docker 容器
docker run -d -p 8080:80 httpd
-p 後面參數 8080:80 的意思代表:當連線到 host 的 8080 port 會轉接到 container 的 80 port。以上面的指令為例,只要輸入 http://localhost:8080/ 即可接到 container 所啟動的 HTTP 服務。
docker exec -it container_name bash
進入container內部
docker logs -f web
即時顯示docker內部狀態
image需要搭配container才能使用
因為container會創建一個R/W layer
user才可以對image做讀寫
選擇正確的base image, 因之後安裝其它套件可能造成layer增加而佔用空間
所以建議在dockerfile就建置好image所需要的套件
docker image history image_name
show all history of the image
很多image都是用alpine linux來製作的
alpine linux是輕量版linux
dockerfile
From nginx:1.19.6-alpine
maintainer dennis huang
copy index.html /usr/share/nginx/html/ #copy file to image
CMD ["nginx","-g","daemon off;"]
docker build -t myfirstimage2 .
docker run -p 8080:80 -d myfirstimage2
curl http:\\localhost:8080
open a folder for project
選取 Remote-Containers: Add Development Container Configuration Files
set devcontainer.json
open folder in container
確定已經進入container
如果想要加修改devcontainer.json,例如預載extension
sudo curl https://cli-assets.heroku.com/install-ubuntu.sh | sh
A: 增加一個.gitattributes file
並加入如下內容
* text=auto eol=lf
*.{cmd,[cC][mM][dD]} text eol=crlf
*.{bat,[bB][aA][tT]} text eol=crlf