初入門 Docker 時,可能會對 Docker 中有哪些指令感到眼花撩亂,這篇文章會介紹如何運行你的第一個 Docker 程式,並且介紹 Docker 的常用指令有哪些。
如果只想查看 Docker 常用指令的介紹,可以直接點擊 Docker 常用指令 跳轉到下方。
在 Docker 中,Image、Container、Registry 是很常出現的三個名詞:
1. Image(映像檔)
大家可以把 image 想像成是任何一段程式(或是一個 .jar 檔),所以當我們作為 Developer 寫完程式之後,就可以將這段程式封存成一個 image,並且打上一個 tag 的編號 x.x.x
(這個效果就等同於 Maven 的版號)。
2. Container(容器)
Container 的概念類似於「買一台新電腦,然後在裡面運行 image 裡的程式」,在 Docker 中可以運行許多個 Container,每一個 Container 都是一個獨立的環境。
3. Registry(倉庫)
可以把 Registry 想像成一個雲端倉庫,裡面會存放所有 image 們(概念等同於 Maven 需要有一個地方存放 .jar 檔),所以不管是要 push image 上去、還是要 pull image 下來,都是在跟 Registry 倉庫溝通。
Docker 官方的 Registry 叫做 Docker Hub,預設就是會從這個地方下載 image 下來,或是公司內部也很常見會建置私人的 Registry,存放公司內部的 image 們。
要在電腦上運行 Docker 的話,首先要先安裝 Docker Desktop 這個軟體,因此大家可以先進到 Docker 官網,然後根據自己的電腦系統下載對應的 Docker Desktop(建議大家也可以順便辦一下 Docker 的帳號,等一下可以登入進 Docker Desktop 中)。
下載好 Docker Desktop 之後,接著就可以在 terminal 中輸入指令,從 Registry(倉庫)中拉取想要的 image 下來,並且使用該 image 生成 container 來運行。
補充:安裝好 Docker Desktop 之後,記得要執行他才可以,他一定要在背景運行著,這樣等等我們輸入的指令才會生效。
所以如果等等在執行下面的 docker 指令時看到
Cannot connect to the Docker daemon at unix:///Users/kujudy/.docker/run/docker.sock. Is the docker daemon running?
的錯誤,就表示你忘記執行 Docker Desktop 軟體了。
在 Docker 官方的 Registry Docker Hub 中,裡面提供了各式各樣的 image 供大家下載。
舉例來說,在 Docker Hub 中有一個 image 叫做 hello-world(沒錯就叫這個名字),此時點擊他右邊的 Copy 就可以複製拉取這個 image 的指令。
只要在 terminal 中貼上這段指令(或是自己手動輸入 docker pull hello-world
),就可以下載 hello-world 這個 image 下來。
此時如果回到剛剛安裝的 Docker Desktop 查看一下的話,就可以看到在 Images 中出現了 hello-world 這個 image 了,這就表示我們下載了 hello-world 這個 image 映像檔到我們的電腦中。
而要運行這個 image 的話,只需要在 terminal 中再輸入 docker run hello-world
,就可以用 hello-world image 去生成一個 container 出來,並且 Docker 就會去執行這個 container 中的程式,因此最終就會輸出如下的資訊在 console 上。
這個 image 比較簡單,就只是輸出文字在 console 上而已,其他的 image 有各式各樣的功能可以使用,基本上熱門的服務如 nginx、redis…等,都有 image 可以用。
順便一提,此時如果回到 Docker Desktop 上查看的話,就可以看到在 Containers 區中多了一個容器出來,他上面就會寫這個 container 的 id 是多少(即是 f10ff7cdfb54
)、以及這個 container 是從哪個 image 生成出來的(即是 hello-world
image)。
所以其實安裝了 Docker Desktop 之後,我們就能透過 Docker Desktop 的好用介面,一目瞭然現在到底下載了哪些 image、以及有哪些 container 是正在運行著的,算是方便我們管理這樣(不過這些功能也完全可以用 terminal 指令來查看,就看大家喜歡哪一種)。
成功運行起第一個 Docker 程式之後,接下來也來介紹一下 Docker 中常用的指令有哪些。
docker pull [image name]:[image tag]
:從 Registry 中下載 image 到本機電腦。
如果想要從遠端倉庫中下載某個 image 時,就要用 docker pull 來下載,像是 docker pull nginx
就可以下載 nginx 這個 image 下來。
另外在下載 image 時,也可以特別指定要下載的 image 是哪個版本(版本在 docker 中稱為 tag)。
舉例來說,在下載 nginx 時就可以輸入 docker pull nginx:1.28
,表示要下載 tag 為 1.28 的 nginx image 下來,這裡的 1.28 就等同於是版本號。
如果沒有指定版本的話,預設就是下載 latest 這個 tag 下來(表示當前的最新版),所以 docker pull nginx
和 docker pull nginx:latest
是完全一樣的。
# 這兩個下載的 image 一模一樣
docker pull nginx
docker pull nginx:latest
不過在實務上,建議大家在下載和使用 image 時,一定要特別指定要使用的是哪個 tag,不要用無腦用 latest 最新版,這樣很容易會遇到版本升級導致的問題…這是特別要注意的地方!!
docker run [OPTIONS] [image name]:[image tag] [執行指令]
:使用 image 創建一個新的 container,並且運行該 container。
run 可以說是 docker 中最重要的指令之一,他會為 image 生成一個 container,並且運行該 container。
所以像是前面在運行 docker run hello-world
時,就是使用 hello-world image 生成一個 container 出來,並且去運行該 container,所以這也是為什麼在運行完 docker run hello-world
之後,在 Docker Desktop 中的 Containers 區會出現一個新的 container,這就是被 run 指令所創建出來的 container。
順便一提,如果執行 docker run hello-world
時 hello-world image 還沒被下載下來,那麼 Docker 就會先去倉庫中下載該 image,並且載完之後直接運行該 container,等於是同時做 pull + run 兩件事就對了,所以如果平常懶得執行 pull 指令的話,直接使用 run 指令也是可以的!
另外在使用 run 去運行 container 時,有一點要特別注意,就是使用 run 所生成的 container ,他在運行完畢之後並不會被刪掉!!! 所以 container 實際上是會繼續佔用硬碟空間的(只是他的狀態是 exit 而已)。
所以假設你在 terminal 中運行了 docker run hello-world
5 次,其實是會創建 5 個 container 出來的!!!因為每 run 一次都是會重新創建一個新的 container 出來,並且每一個 container 之間是完全獨立的,等於是你買了 5 台電腦來執行 hello-world 程式的概念。
所以如果不想要一直創建新的 container 出來的話,就可以改成使用 docker start [container id]
指令,去重複運行已經存在的 container,不要每次都用 run 新創建一個 container 出來(start 指令下面會介紹)。
補充:因為 run 是 docker 中很重要的指令,所以導致 run 指令有太多參數擴展可以用了,這篇文章沒辦法全部涵蓋進來🥹,後續有更多研究我再來寫一篇文章,專門介紹 run 的各種用法。
docker start/stop [container id]
:運行/結束某個 container。
因為 run 指令是「創建並運行 container」,所以配套的 start/stop 指令,就只是去「運行/結束 container」而已,並不會執行「創建 container」的部分。
所以舉例來說,假設我們前面已經用 docker run hello-world
創建一個新的 container 出來之後,這時如果想要再次運行該 container 的話,就可以使用 docker start f10ff7cdfb54
,再次去運行 container。
但當然啦,因為 start/stop 的用途只是「運行/結束 container」而已,所以一定要先使用 run,先把 container 創建出來之後,start/stop 這兩個指令才有用,如果連 container 都還沒創建出來的話,那個 start/stop 是完全派不上用場的。
docker ps -a
:查看所有 container 的運行狀態。
這也是超常用的重要指令之一,可以查看所有 container 的運行狀態(包含 container id、運行時間…等重要資訊)。
另外這指令一定要加 -a
才能顯示全部的 container,不加的話只能看到當前運行的 container 們而已,沒辦法看到停止運行的 container。
docker exec [OPTIONS] [container id] [執行指令]
:對正在運行的 container 下達指令。
exec 算是也滿常用的指令之一,通常是在初期開發時比較常用,因為 exec 是可以針對「正在運行的 container 下達指令」,甚至可以「登入到這個 container 裡面」,去查看運行時的 log、或是程式位置是否有擺對地方…等等。
像是執行 docker exec -it [container id] /bin/bash
的話,就可以登入到該 container 裡面,直接查看該 container 中的運行情況。
舉例來說,在我們執行了 docker run -d nginx
之後,這時候 nginx 就會在背景運行,此時如果想要登入進去看裡面的內容的話,就可以執行 docker exec -it 32512d06d1ccf /bin/bash
(32512d06d1ccf
是 nginx container 的 id),這樣子就可以登入到這個 nginx container 裡面了。
補充:一開始可能會對 exec 指令感到有點疑惑,建議不用太糾結,只要先把他當成一個「能夠登入進 container 中」的指令即可。
docker logs [container id]
:查看該 container 輸出的 log。
這也是好用的指令!!可以直接在外面呈現 container 中的 log 出來,不用登入進去 container 才看得到,讚!!(唯一要注意的是這個指令是 logs
,有 s
,不是 log
)
常用的配套參數:
docker logs -f [container id]
:持續列出最新的 logdocker logs -f --tail 10 [container id]
:持續列出最新的 log,並且只顯示最後 10 筆docker inspect [container id]
:查看該 container 的詳細資訊。
如果想要查看這個 container 的詳細資訊(ex: 環境變數、網路設定),那麼就可以靠 inspect 指令來取得。
不過這指令輸出的資訊有點太詳細了,初學可能會看不太懂,建議後續有需要更深入了解 Docker 時再來學習即可。
rm、rmi、images 這三個指令的用途,現在透過 Docker Desktop 的 UI 就能夠直接操作了,所以初學不用特別背,除非是沒有 Docker Desktop 介面可以用的環境(ex: 遠端的 server,需要 ssh 進去才能使用),才需要手動打以下的指令。
docker rm [container id]
:刪除某個 containerdocker rmi [image id]
:刪除某個 image(根據 image id)docker rmi [image name]:[image tag]
:刪除某個 image(根據 image name 和 tag)docker images
:查看目前已下載了哪些 image# 刪除某個 container
docker rm 1f2a828ffadf2
# 刪除某個 image
docker rmi f1f77a0f96b7
docker rmi nginx:1.28
# 查看目前已下載了哪些 image
docker images
以下也列出好用的 docker 組合技(感謝網路上的大神分享),我覺得 stop 和 rm 所有 container 在開發階段還滿好用的,推薦給大家~。
# 停止所有 container
docker stop $(docker ps -a -q)
# 刪除所有 container
docker rm $(docker ps -a -q)
# 刪除所有 image
docker rmi $(docker images -a -q)
所以總結 Docker 的常用指令的話,可以統整成以下的用法:
# pull: 從倉庫中拉取 image 下來
docker pull hello-world
docker pull hello-world:1.28
# run: 創建並運行 container(run 有許多參數可擴展,此處先略過沒介紹)
docker run hello-world:1.28
# start: 運行 container(以下的 f10ff7cdfb54 皆為 container id)
docker start f10ff7cdfb54
# stop: 結束 container
docker stop f10ff7cdfb54
# ps -a: 查看所有 container 的運行狀態
docker ps -a
# exec: 對正在運行的 container 下達指令
docker exec -it f10ff7cdfb54 /bin/bash # 登入進該 container
# logs: 查看該 container 輸出的 log
docker logs f10ff7cdfb54
docker logs -f f10ff7cdfb54 # 持續列出最新的 log
docker logs -f --tail 10 f10ff7cdfb54 # 持續列出最新的 log,並且只顯示最後 10 筆
# inspect: 查看該 container 的詳細資訊
docker inspect f10ff7cdfb54
# rm: 刪除某個 container
docker rm f10ff7cdfb54
# rmi: 刪除某個 image
docker rmi 1c48965c5eed # 根據 image id 刪除
docker rmi hello-world:1.28 # 根據 image name 和 tag 刪除
# images: 查看目前已下載了哪些 image
docker images
因此大家就可以透過上述的 Docker 指令,在你的電腦中操作 container 和 image 了~,讚!!
這篇文章我們先介紹了 Docker 中的 Image、Container、Registry 的用途,接著運行了第一個 Docker 程式,並且也介紹了 Docker 中的常用指令,希望可以幫助大家對 Docker 指令有更多的了解。
如果你對後端技術有興趣的話,也歡迎免費訂閱《古古的後端筆記》電子報,每週二為你送上一篇後端技術分享,那我們就下一篇文章見啦!
補充:我開設的 Spring Boot 零基礎入門、Spring Security 零基礎入門、GitHub 免費架站術 已在 Hahow 平台上架啦!輸入折扣碼「HH202506KU」即可享 85 折優惠。