容器的生命週期
在Day1時我有用到"docker run"的指令,我發現這個指令很神奇~~
因為它是由兩個指令"docker create"和"docker start"結合的,也透過這兩個指令可以了解容器的生命週期,若有run過day1的hello-world應該對這張圖比較有感吧!!
圖片來源|source
容器產生的過程~~
$ docker create <image-name> # 指令一
$ docker start <container-id> # 指令二
當有了一個映像檔,指令一是Docker Server會幫我將映像檔中的檔案系統快照(FS snapshot)複製到容器中,這一步不代表容器已可以使用了,只是準備好這個容器的內容。指令二是有準備好的容器,透過它的id去執行容器內的啟動指令(startup command)。
啟動指令是已寫好在映像檔的內容,當docker run時就會一起啟動!!
建立busybox容器
映像檔也不一定需要優先寫入啟動指令,如下個指令我啟動了一個busybox的映象,並加上一段指令"echo hi there",如此它會實例化一個容器並執行我寫在後面的那段指令。
docker run busybox echo hi there # 產生一個容器A
docker run busybox echo bye there # 換個字再跑一遍,產生了另一個容器B
在運作中的容器內執行多個指令
假設我的電腦裡已經有redis的映像檔且已經實例化,現在我想要重新把它打開,並加上一些指令。
這邊我執行redis-cli,還可以執行其他指令處理器(command processor)例如sh、zsh、bash。
結束指令處理器ctrl+D。
docker exec -it <container-id> <command> 或者
docker run -it <image-name> <command>
容器的獨立性
容器除了輕巧之外,容器與容器之間也彼此獨立,所以他們不會共用檔案、可以運行在不同的作業系統中。例如我以同一個映像檔產生了兩個容器,若我在容器A中刪除一個檔案對容器B毫無影響,也不會影響到原來的映像檔。
常用的Docker指令整理
# 查詢版本
$ docker --version # 回傳版號
$ docker version # 回傳詳細的安裝資料
# docker 基於image(含有服務的映像安裝檔)建構一個container(可以啟動該服務的軟體環境)
$ docker image # 可以看到有哪些指令可用及它們的用途說明
$ docker image list # 列出在cache中的所有image
# 刪除沒有在作用的映像檔
$ docker image prune
# 移除某一個映像檔,強制執行加上 -f
$ docker image rm <image-id>
# 用某一個映像檔實例化成容器
$ docker run <image-name>
# 查詢已建立的容器
$ docker ps –-all
# 刪除沒有在作用的容器
$ docker system prune
# 在執行中的容器執行其他指令,-it允許你輸入指令
$ docker exec -it <container-id> <command>
# 實例化一個容器後,執行開啟shell...之後可以輸入一些指令
docker run -it <image-name> sh
# 建立映像檔(搭配dockerfile使用)
$ docker build .
參考
主要學習資源
Udemy - Docker and Kubernetes(author:stepehn grider)
額外參考資源
淺談輕量化的虛擬技術 - Docker容器
何謂容器(Container)
LinuxKit => Docker通吃全平臺秘密武器