既然已經自己動手做了 Docker Image,不上傳到伺服器運行也就相當可惜。上傳 Docker Image 的手法很多,本篇所介紹的 scp
手法算是觀念上的教學,因為這個指令可以用在很多地方,不只是 Docker Image 的上傳;另外也可以知道,Docker Image 上傳流程中大概會遇到哪些狀況。
另外,還有一種部署方式是透過 Docker Hub,類似服務相當多,而本系列的範例往後會以 Docker Hub 為主。
影片連結:https://youtu.be/JocSDHOFNzw
範例儲存庫:本篇的相關程式碼可以參考:https://github.com/Wcc723/node-ironman-sample-2023/tree/feature/docker-sample
指令部分可以參考 本範例,不過在環境配置上,還是需要勞煩各位自己動手做囉。
Ubuntu 上安裝 Docker 環境可直接參考官方文件,文件說明已相當完整,或在此參考中文化版本。
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
docker -v
sudo docker run hello-world
官方的範例僅會出現上方提示文字,表示已經成功運行。可以直接使用 docker ps
列出所有容器,然後再使用 docker rm <container id>
移除該容器。
首先,在你的本地系統中保存 Docker Image 成 tar 檔案: -o
表示輸出 output(請先使用 build 指令建立映像檔)。
docker save -o <tar文件名稱.tar> <image名稱:tag>
在本地端使用 scp 將 tar 檔案傳輸到虛擬主機上:
scp <tar文件名稱.tar> <使用者名稱>@<虛擬機IP位址>:<路徑>/<檔名>.tar
登入虛擬主機,然後在虛擬主機中使用 Docker load 加載 Image(-i
表示輸入 input):
docker load -i <tar文件名稱.tar>
接下來使用 docker images
檢視已經準備好的 image,可以看到剛剛的 image 已經加入列表中,並使用 docker run -d <image名稱:tag>
運行 docker 環境。
docker run -d -p 8080:3000 <image名稱:tag>
上述指令中的:
-d
選項意為 "detach",意即在背景模式下運行容器。使用 -d
選項後,Docker 會在背景中運行容器,並返回容器 ID,不會看到任何的輸出,終端機會直接返回。-p 8080:3000
表示將容器的 3000 port 對應到主機的 8080 port,這樣就可以在主機上透過 8080 port 來訪問容器中的應用程式。可能遇到的錯誤:
WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64/v3) and no specific platform was requested
錯誤是因為試圖在一個系統環境(如 linux/amd64
)上運行為另一個系統環境(本範例為 linux/arm64/v8
)建立的 Docker 映像。解決方式需要在建立時指定平台,例如:
docker build --platform=linux/amd64 -t {tag name}
完成後再重複上述的流程即可。
在執行時加入 --restart=always
參數,表示當服務終止時,Docker 會自動重啟服務。
docker run --restart=always -d my-node-app
如果機器出現錯誤,導致 Docker Daemon 未啟動,可以使用以下指令啟動 Docker Daemon:
sudo systemctl start docker
如果你想要在系統開機時自動啟動 Docker,可以使用以下指令:
sudo systemctl enable docker
要停止 Docker daemon,可以使用以下指令:
sudo systemctl stop docker
如果你不希望在系統開機時自動啟動 Docker,可以使用以下指令:
sudo systemctl disable docker
要檢查 Docker daemon 的狀態,可以使用以下指令:
sudo systemctl status docker
這些指令都需要 root 權限,所以需要使用 sudo
指令。
如果看到以下錯誤,主要原因是因為 docker socket 仍在運行中(部分容器還在運行):
Warning: Stopping docker.service, but it can still be activated by:
docker.socket
需要將完整的 docker service 關閉,可使用以下指令:
sudo systemctl stop docker.service
sudo systemctl stop docker.socket
本篇文章介紹如何在 Ubuntu 上安裝 Docker 環境,並且部署 Node.js 專案,另外也介紹了如何在本地端上傳 Docker Image 到虛擬主機上,以及 Docker Daemon 未啟動的解決方式。