容器生命週期與指令整理


容器的生命週期

在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通吃全平臺秘密武器

#容器生命週期Container lifecycle #Docker 指令Docker command #獨立性Isolation





這個系列想介紹一些容器化概念,透過實作與研究容器化的實際運用(CI/CD),日後自己能把這個技術發揮在適合的地方。

留言討論