跳至主要内容

Docker基礎觀念與指令介紹

· 閱讀時間約 10 分鐘
雷哥
程式技術天守閣站長

我們在上一篇文意《Docker Desktop新手教學》中了解了如何透過Docker Desktop GUI快速操作與檢視容器,但也了解到其實視窗化的Desktop工具功能不是很齊全,許多功能是沒辦法在上面一次完成的。這篇開始要來談docker的指令集,可以從terminal中直接下完整的指令來進行各種容器的日常作業。

當然,使用terminal進行指令式的作業流程,一樣可以開著Docker Desktop進行快速又直接美觀的即時檢視或管理,也是一個不錯的搭配運用。

從查詢docker版本開始熱身

當安裝完docker engine後,可以在本機的terminal工具先進行一下確認,通常可以嘗試列出docker的版本。

# 簡要版查詢version
docker -v
docker --version


# 完整版查詢version資訊
docker version

我的目前使用的是version 20.10.21

也可以順便查一下docker-compose的版本

docker-compose -v
docker-compose version

Image映像檔

接著就可以從Image開始了解起。

看看Images資訊

先前介紹過image與container之間的關係,要執行容器化container之前,我們一定要先有image。先查看目前本機有哪些images吧

docker image ls

# image加複數s
docker images

查詢出來會列出幾個欄位:

欄位說明
Repository列出在雲端Docker Hub上的Repo名稱以及Image名稱,使用/分隔。
Tag主要記錄版本,若最新版則為latest。
Image ID若要對我們目前的image作操作時,ID可代表唯一性。不過Docker在操作時,不用輸入完整的ID,只需要輸入前幾碼即可,前提是只要能識別出唯一性。
Size這個Image所佔的檔案大小

Pull! 抓取新的Image試試

試著抓取hello-world Image來試試看

docker image pull hello-world

若是該image不存在,則會從雲端的Repo進行下載。再重新進行images查詢,可以看到已列在列表中。

但剛的狀態僅僅是抓取下來,並未運行成container,所以下一步就是要來試著執行容器化的動化。

更完整的pull語法如下,如果有需要針對特定的版本號碼,要在image後加上冒號以及版號,預設都不加的話就是latest版本。

docker pull <repo_account>/<image_name>:<tag>

如何刪除Image?

如果要刪除image,可使用以下語法:

docker image rm <image_name 或 image_id>
docker rmi <image_name 或 image_id>

不過預設情況,只要有container還關聯著此image的話,就不能直接對此image作刪除。

若是想要暴力刪除此image的話,就要加上-f的參數。不過此作法是在於有container沒有運作中,但關聯著image的情況。如果該container正在運作中的話,則必須先停止運作才行。(後面會解說)

docker image rm -f <image_name 或 image_id>
docker rmi -f <image_name 或 image_id>

小技巧

使用docker有ID類的(無論Image或Container),不需要輸入完整的ID。只要你輸入的頭幾碼足以識別出唯一性即可,所以為了增加管理效率,可以只輸入3~4碼即可。

Run! 運行成container狀態吧

通常如果你要將一個Image直接運行成container,可以使用run指令,就會也包含了剛剛的pull動作。不過在此需注意的是,run是container的指令,並非image的。但執行run的時候,container是可以省略的。

docker container run hello-world
docker run hello-world

這個hello-world只是作為docker運行成container的基礎測試,他沒有什麼特別的功能,只要能看到上述的內容就代表運行成功了。上面的內容除了解說運行的流程外,還外加提示,你可以嘗試使用互動式指令來運行一個ubuntu的container。

查詢container列表

查詢目前所有的container列表,有下列幾種方式。

# 查詢執行中的container
docker container ls
docker ps

# 查詢所有的container
docker container ls -a
docker ps -a

若我們想要直接列出所有的container的ID,可以加上-q參數,後面會講解這個能做什麼用。

docker container ls -aq
docker ps -aq

跑一個有感覺一點的container吧

剛上面的hello-world在一執行完後就會立刻結束,即使container還存在,但無法對他進行進一步的互動操作或使用。所以我們可以來運行一個簡單的web server,讓這個container可以持續運行,並且可以使用本機瀏覽器來拜訪首頁。

我們嘗試使用以下指令來執行,port的對應8888可自行修改成你要的。

docker run -d -p 8888:80 docker/getting-started

接著使用瀏覽開啟 http://localhost:8888/ ,這個測試網站就是從剛剛的container提供的web伺服器服務。

上述加上了-d的參數,這裡實際上代表的原意是detach模式,表示可將container以背景服務方式運作。但一般多半會將這個d解釋為Linux的daemon。或許是一種誤用,但其實理解上還蠻相近的。

連入操作container

我們剛剛運行的是以-d的daemon模式運作,所以他會常駐執行起來,但我們如果想要連入操作要怎麼做呢?

可以使用exec加上-it的參數,再指定要使用的shell程式/bin/sh後,就能針對該container作操作。

docker exec -it 70e3 /bin/sh

刪掉剛剛的container

有建立就要有刪除,我們試著用以下指令刪掉container。

docker container rm 70e3
# 或省略container,預設就是對container操作
docker rm 70e3

但在進行操作時,會被告知這個container還在運行,要先停止他。

可再使用stop指令停止這個container後再進行刪除。

docker stop 70e3

不過如果你想無視他是否執行,都要刪掉這個container,如同刪除image一樣,加上-f後就能暴力刪除container了。

docker rm -f 70e3

一次對全部container操作

若我們想要一次停止或刪除多個container,可以在後面的ID處以空格格開多個。

docker stop 70e3 af32 b12f
# 或
docker rm 70e3 af32 b12f

但如果我們想要一次把所有的container全部都停止,則可以使用上面講到的-q參數,只列出Container ID後,再把他們當成變數餵給stop或rm等後面的參數。請注意,這個作法在Windows cmd是無法使用的,需使用powershell。

docker container stop $(docker ps -aq)
docker container rm $(docker container ls -aq)
# 當然前面的container也可省略
docker rm $(docker ps -aq)

想要一開始run起來時就順便連入操作

另外補充一下,若是想要在一開始run起來的時候就連入container作操作,可以在run的指令就加上-it與/bin/sh的參數。我們以超輕量的linux image -- alpine作為示範。

docker run -it alpine /bin/sh

早期版本alpine只能使用/bin/ash,現在可以使用/bin/sh了。

這裡的-it參數,實際上代表著interactive以及tty。由於alpine本身沒有預設執行任何可常駐在背景服務的程式,所以若下了-d服務,想說之後再使用exec -it方式連入是會沒效用的。(無效果的是-d參數)

上述簡要的說明如何使用docker engine的指令模式來操作image、container,如果有安裝docker desktop的話,還可以輔助的一起使用,也是蠻方便的。