介紹 docker
-- docker api 說明
docker --help
docker
-- 版本
docker --version
docker -v
Docker 三寶:
- Image(映像檔): 蛋糕模型。
Container(容器): 蛋糕實體。
2.1 隔離性:一個Image每一次都會產生一個唯一的Container,可一起執行,互不干擾。
2.2 輕量級:只需包含應用程式、依賴項和套件...等等,啟動和停止速度極快。
2.3 可移植性:封裝好應用程式、環境變數、套件...等所有需要的元素,只運行這些內容,跟本地環境無關。
2.4 快速部署:基於輕量級和可移植性。
2.5 容器生態系統:Docker 提供了一系列工具和服務,可以輕鬆地管理、監控和編排容器們。例如,Docker Compose 可以用於定義和執行多個容器。
2.6 版本控制:因隔離性,每個Container的ID都不同,所以可以切換版本。
2.7 容器共享:基於可移植性。
2.8 持續整合與持續交付(CI/CD):Docker Container(容器)可自動化建置、測試和部署流程,讓部屬變得簡單且自動化,我們可以設定自動將 GitHub 上專案的 main 分支,若有新的進度就自動部署,如此一來可以節省許多部署的時間。Repository(儲存庫): 蛋糕模型倉庫,儲存Image。
Docker 使用流程:
Dockerfile ---> Image ---> Container
-- 依照image產生container,並運行
docker container run hello-world
docker run hello-world
-- 停止container
docker container stop hello-world
docker stop hello-world
-- 全部容器的 process status
docker ps --all
docker ps
-- 尋找當前目錄中的 .Dockerfile 檔案,並建立為image,名稱為隨機生成的ID
docker build .
-- 尋找當前目錄中的 .Dockerfile 檔案,並建立為image,名稱myapp
docker build --tag myapp .
docker build -t myapp .
-- 列出本地的所有 images
docker images
-- 從遠端 registry (倉庫)下載 image (映像)到本地
docker pull
-- 將本地的 image (映像)上傳到遠端 registry (倉庫)。
docker push
Container
-- 啟動 Ruby Container,但沒有交互式、終端
docker run ruby
docker run ruby:3.2.2
-- Ruby Container已經關閉了
docker ps -a
-- 交互模式:可以進到容器內部互動
docker run -i -t ruby /bin/bash
-- irb 是 Ruby 附帶的交互編程環境 by 石冢敬树
irb
-i:代表 "交互式"(Interactive)。這個指令可以讓你輸入指令。如果沒有使用 -i ,則容器不會接受輸入的指令(就是你怎麼輸入他都不理你)。
-t:代表 "終端"(Terminal)。這個指令是讓 Docker 為容器分配一個虛擬終端幾,讓我們可以在容器內部進行命令操作。如果沒有使用 -t ,你就想像成沒有一個可以打指令的地方(沒有終端機)。
/bin/bash:代表命令解析器(Shell)。用於解釋和執行命令、腳本以及與系統交互的操作。
-- 容器裡停止
- 輸入exit -> 按下enter
- ctrl + d
-- 背景(持久)模式執行:那在 docker 時,使用 -d 即可在背景執行,不會多佔一個終端機的概念
docker run -d ruby
-- 命名我的 container
docker run --name my_ruby ruby
-- 指令都可以根據狀況組合使用
docker run -it --name ruby_test ruby
-- 開始 Container
docker start
-- 其他終端機停止
docker stop
--刪除 Container (不能刪除運行中的container)
docker rm
Network
Bridge Network (橋接網絡): 每個 Container (容器)都會分配一个獨立、不重複的 IP 地址,而這些 IP 地址是私有的,只能在 Container (容器)內找到,無法跟 Container (容器)外部聯絡。
Host Network(主機網路): 翻譯官本人出國時,因為本來就會當國語言,他就不需要再另外請翻譯,因為他自己就聽得懂。
隱憂: 隔離性和安全性。
None Network(無網路): 無人島,完全隔離並且沒有任何網絡訪問權限。
-- 查看本機 docker 網路列表
docker network ls
-- 查看一個container的所有詳細資訊
docker inspect
-- 建立網路
docker network create
-- 置換 container 的 natwork 為特定 natwork
docker network connect
-- 斷開 Network(網路)與 Container (容器) 的連接
docker network disconnect
-- 移除網路
docker network rm
Image Tag
Tags(標籤)可以包括字母、數字、橫線(-)和下劃線(_),但不建議使用特殊符號(.、:、/等)。
-- 建立自己的 Tags(標籤): 類似定義自己的版本號,
docker tag <本機現有映像 id_or_repository>:<本機現有標籤> <新映像 repository>:<新標籤>
docker tag ruby:latest ruby:v1
-- 依照指定的Image,複製一個新的自定義名稱的Image
docker tag <本機現有映像id_or_repository> <新映像 repository>
docker tag ruby my-ruby
-- 建立+推送(push)自己的 Tags(標籤)
docker tag <本機現有映像id_or_repository> <Docker 儲存庫的主機名或 IP 地址>:<端口>/<新映像 repository>:<新標籤>
1. 就是我們上面介紹的建立新的 Tags(標籤)
2. 還包含了將這個新 Tags(標籤)的 Image(映像),推送到指定的 Docker 儲存庫 (myregistryhost:5000) 中,以便在遠端的主機上使用或與其他人共享。
Docker Image(映像) 的常用語法
-- 拉取 Image(映像)
docker pull 映像名稱:版本
-- 刪除 Image(映像)
docker rmi <映像ID或名稱>
remove image => rmi
-- 建立 Image(映像) 非當前路徑
docker build -t 映像名稱:版本
-t 是 tag 的意思
Dockerfile 正常都會位於當前目錄,所以若是當前目錄我們可以寫成
-- 建立 Image(映像) 當前路徑
docker build -t 映像名稱:版本 .
.就代表當前目錄 ; 需要特別寫路徑,則是因為 Dockerfile 不在當前目錄
-- 將 Image(映像) 推送到註冊表
docker push 映像名稱:版本
這邊的話不特別寫要推到哪個註冊表,就是預設推到 Docker Hub 註冊表
-- 將 Image(映像) 推送到非Docker Hub註冊表
docker push <目標註冊表URL>/圖片名稱:版本
如果有其他註冊表如: Google Container Registry(GCR)或 Amazon Elastic Container Registry(ECR)
-- 查看 Image(映像) 的詳細資料
docker inspect <映像名稱或ID>