--- tags: AIOT馬拉松講義 ---  # D07 Docker 軟體容器平台介紹與安裝使用  ### 重要知識點 * 安裝 docker * 學習 Docker * 使用 Docker file ### Docker 主要架構 Sandbox 一種用於隔離運行程序的安全機制,通常是為了減輕系統故障和(或)軟件漏洞的蔓延。  ### Docker 基本元素  ### Docker 基本構成元素說明 * 映像檔(Image):映像檔是一個唯讀的模板,可以把它想像成傳統虛擬機將作業系統封裝成 .iso 的映像檔,它可以包含一個完整的作業系統,而它最重要的是用來<font color="#F000"><b>建立容器</font></b>,且可以<font color="#F000"><b>重複利用</font></b>。 * 容器(Container):容器才是真正在運行的,每個容器都是<font color="#F000"><b>相互隔離</font></b>的,可以把容器看作是一個簡易版的 Linux 環境。 * 倉庫(Registry):倉庫是集中存放映像檔檔案的地方。倉庫可以分為<font color="#F000"><b>公開(Public)</font></b>和<font color="#F000"><b>私有(Private)</font></b>兩種,公開倉庫像是 [Docker Hub](https://hub.docker.com/),裡面存放各式各樣的映像檔供使用者下載。 ### Docker 安裝、設定 請依照自己的作業系統安裝 Docker 下載位置(Mac):[Docker Desktop for Mac](https://hub.docker.com/editions/community/docker-ce-desktop-mac/) 下載位置(Windows):[Docker Desktop for Windows](https://hub.docker.com/editions/community/docker-ce-desktop-windows/) Linux(請依照個平台對應指令執行下載指令) : [Docker Linux](https://docs.docker.com/engine/install/) --- Windows 安裝 Docker 需注意以下系統要求: 1. Windows 10 64位:專業版,企業版或教育版(內部版本 15063 或更高版本)。 2. 必須啟用 Hyper-V 和 Containers Windows 功能。 3. 在 Windows 10 上要啟用 Hyper-V,須滿足以下條件: a. 具有 64 位元處理器 b. 4GB 記憶體 c. 必須在 BIOS 設置中啟用 BIOS 級硬件虛擬化支持。有關更多信息,請參見[虛擬](https://docs.docker.com/docker-for-windows/troubleshoot/#virtualization-must-be-enabled) --- 安裝完成後,打開終端機輸入:docker -- version,若有顯示出版本即安裝成功  ### 使用 Docker Image(映像檔) - 取得映像檔 前面介紹的 [Docker Hub](https://hub.docker.com/) 可以取得各種不同的 Image,假設我今天想要一個 Ubuntu 的 Image,就在搜尋的地方搜尋 Ubuntu(如下圖),需要注意的是,Docker Hub 是一個公開讓大家都能上傳自己建立的 Image 的服務,所以如果要取得較穩定的 Image,建議是找有官方認證、維護的。  選好要的 Image 之後,打開終端機執行以下指令:docker pull ubuntu,即可把 Image 下載下來。  若該 Image 有多種版本,我們我們如果沒指定版本時,預設會是 latest,但如果我們想要某個特定版本,則可以加上 tag。 1. 先在 Docker Hub 找到要的版本(tag)。 2. 下 pull 指令時在後面加上 冒號及 tag名稱。  ### 使用 Docker Image(映像檔) - 查看映像檔 下載好 Image 之後,可以執行 docker images 或 docker image ls 指令,查看你現在所擁有的 image,包含剛剛所下載的 Python Image。  * REPOSITORY : 來自哪一個倉庫。 * TAG : 標籤,表示不同的版本號。 * IMAGE ID:映像檔的編號。 * CREATED:最後更新時間。 * SIZE:此映像檔所佔的空間。 ### 使用 Docker Image(映像檔) - 刪除映像檔 刪除 Image 可以用 docker rmi [ Image id ],先找到要刪除的 Image 編號,再輸入指令如下圖  ### 操作 Docker Container - 建立 Container 因為真正執行的是 Container(容器),所以必須把我們的 Image(映像檔)變成可執行的 Container。 使用 docker run [ Image 名稱 ]:[ Image Tag ] [ 要執行的指令 ],若 tag 為 latest,則可以不用填。 以前面下載的 Ubuntu Image 為例 => docker run ubuntu echo Hello World  --- 指令解析: 1. docker run : 建立 Container 並執行。 2. ubuntu : 建立 ubuntu 這個 image 的 Container。 3. echo Hello World : 在 Container 中執行 echo Hello World 指令 4. Container 執行完指令,停止 Container,也因為 Container 執行完指令就會停止,所以上述範例 Container 執行完 echo Hello World 之後就會停止運行。 --- 使用 docker ps -a 指令可以查看所有 Container 的狀態。  --- 1. Container 編號 2. 使用的 Image 名稱 3. Container 啟動時執行的指令 4. Container 被建立的時間 5. Container 的狀態 6. Container 使用的埠號 7. Container 的名稱,若沒有指定名稱,系統會幫你取; 若想要自己取名,可加上 --name 參數後接上你要的名稱,如 docker run --name [ myname ] ubuntu echo Hello World。   Container 執行完指令就會自動停止,所以我們可以用 tail -f 指令,因這個是用來持續監控日誌的指令,所以會持續地執行,Container 也可以保持執行的狀態。 使用 tail -f 指令,終端機畫面會卡在那邊,所以另外開一個終端機來查看 Container 的狀態,即可看到剛剛建立的 Container 還是保持在啟動狀態,跟前面的 Container 執行完 echo 指令即停止有所不同。 --- 除了使用 run 以外,也可以用 create 指令來建立 container,但建立之後不會馬上啟動。 <b>docker run = docker create + docker start</b>   ### 操作 Docker Container - 啟動 Container 使用 docker start 指令啟動 Contaner <b>docker start [ Container 名稱 / 編號 ]</b>  ### 操作 Docker Container - 停止 Container 使用 docker stop 停止執行中的 Container。 <b>docker stop [ Container 名稱 / 編號 ]</b>  ### 操作 Docker Container - 進入 Container docker exec 指令可以進到 Container 中執行某項指令(必須在 Container 是活著的狀態才可使用該指令) 例:docker exec blissful_thompson echo Hello World  --- 進入 Container 指令可用 docker exec -it [ Container 名稱 / 編號 ] bash  -it : t 代表分配一個終端機給Container,i 則是讓給Container的標準輸入保持在打開的狀態,所以我們在進入到給Container之後,才能夠在裡面下指令、操作。 因 Container 就像是一個陽春版的 Linux 系統,所以進到 Container 之後,可以在裡面下一些 Linux 指令,如:ls、mkdir...等等。 ### 操作 Docker Container - 刪除 Container 使用 docker rm [ Container 名稱 / 編號 ] 刪除 Container(必須先停止 Container 才能刪除)  ### 操作 Docker Container - 匯出 Container 使用 export 指令匯出已存在的 Container <b>docker export [ Container 名稱 / 編號 ] > [ 匯出的檔名 ]</b>  ### 操作 Docker Container - 匯入 Container 前一個步驟匯出 Container 後,用 import 指令將 Container 匯入,利用 export、import 即可將容器帶著走。 <b>cat [ 匯出的檔名 ] | docker import - [ Image名稱(自訂) ]:[ Tag(可自行設定標籤) ]</b> (Tag可加可不加,若沒有設定,預設是 latest)  ### Docker 的資料管理 1. 因 Container 被刪除後,裡面的資料也會一起移除,所以我們必須把不想被刪除的資料放在我們的實體電腦中,這時就會用到 Docker 的 volume 功能。 2. volume 的功能,類似 Linux 中的 mount。 3. 除了實體主機與 Container 的資料共享外,Container 之間也可以透過 volume 功能實現資料共享的功能。 4. Docker 提供以下幾種方式將 Container 裡的資料留存在實體主機中,volume、bind mount,如果是在 Linux 系統下使用 Docker,則還有 tmpfs mount 方式。 --- 1. bind mount(繫結掛載):Container 直接與實體主機的檔案位置連結,掛載實體主機位置時需使用絕對路徑。 2. volume(卷):上面的 bind mount 是直接指定主機的路徑位置,volume 則是儲存於 Docker 中,任何操作皆透過 Docker,此種連結資料的方式對於移植系統是比較友善的,畢竟每種 OS 的路徑設計上不盡相同,且除了使用 Docker 操作 volume 外,其他程序不應該去操作 volume。 3. tmpfs mount:只能用在 Linux 系統下運行的 Docker,可以暫時的將資料存在實體主機的記憶體中,當 Container 停止時就會被移除,需注意的是不能在 Container 之間做使用。  ### Docker 的資料管理 - 直接指定實體主機路徑 在使用 docker run 建立 Container 時,加上 -v 參數,讓Container中的檔案路徑和實體主機的檔案路徑上連通。 <b>$ docker run -v /Desktop/test:/usr/local/www ubuntu</b>  實體主機目錄必須是絕對路徑,如果資料夾不存在,Docker 會自動幫你建立。 ### Docker 的資料管理 - 建立 Volume 前面的方法為 bind mount,直接指定實體主機的目錄位置,而以下方法為建立一個 Docker Volume,使用 Docker 管理這個資料。 1. docker volume create [ Volume 名稱 ] 語法建立一個新的 Volume 2. 使用 docker volume ls 語法即可列出所有 Volume  3. 也可以使用 docker volume inspect [ Volume 名稱 ] 查看該 Volume 的詳細資訊。  ### Docker 的資料管理 - 啟動 Container 並連結 Volume 以下範例利用前面建立的 Volume(my-volume),連結到 Container 中的資料夾(container-folder)。 <b>docker run -v [ Volume 名稱 ]:[ Container中路徑 ] [ Image 名稱 ]</b>  ### Docker 的資料管理 - Container 之間的資料共享 1. 這邊我們再建立一個 Container,並使用 --volumes-from 參數,連結到 container1 的 Volume。(B圖) 2. 在第一個 Container 與 Volume 連結的資料夾內新增一個檔案(test.txt)。(A圖) 3. 新增完之後,查看第二個 Container 與 Volume 連結的資料夾,可以發現剛剛在第一個 Container 內新增的檔案。(B圖)   ### 從外部存取 Container 內的服務 1. 這邊我們使用 apache 的 Image 作為範例,首先先把 Image 下載下來,下載完成後再用 docker images 指令確認一下。  2. 用 httpd Image 建立 Container,並且使用 -P 參數(大寫P)。 <b>docker run -d -P httpd</b>  註:連結到 Container 的埠號(port) 80是因為 apache 服務本身會開啟的就是埠號(port) 80 --- 確認 Container 有啟動之後,開啟瀏覽器輸入 http://localhost:32769 (請依照前面顯示開啟的埠號修改) 看到以下畫面即成功。  --- 用 <b>docker ps -a</b> 指令確定 Container 有正確啟動,且確實有幫我們指定主機的某一個埠號去對應到 Container 中apache服務開啟的埠號。(Container 這邊是80是因為此 apache 映像檔預設就是用 80)  --- 除了使用 -P(大寫) 參數讓 Docker 自動幫我們指定實體主機開啟的埠號,我們也可以自行設定,只要使用 -p(小寫) 參數,後面接上[ 你要的埠號]:[ Container 開啟的埠號 ] 即可,如下: <b>docker run -d -p 8088:80 httpd</b>   ### Container 之間的互聯 如果要讓 Container 之間可以互相連接,則要使用 --link 參數 1. 先建立第一個 Container : container1(名字自行設定)。(圖A)  2. 接著建立第二個 Container,加上 --link 參數,後面接第一個 Container 的名字(以這邊為例就是 container1)。(圖B) <b>docker run -it --name container2 --link container1 ubuntu bash</b>  3. 這邊要讓大家能夠看出來是否真的有連到,我們需要在 Container 裡面安裝 ping 這個套件;進入到 container2 之後,輸入 : apt-get update && apt-get install -y iputils-ping。(圖C)  4. 上面的步驟完成也安裝成功之後,接著輸入 ping container1(第一個Container的名稱),就可以看到我們的 container2 確實有收到來自 container1 的回應。(圖D)  --- ### 知識點回顧 * Docker 是一種虛擬化技術,具有高效能、低資源消耗、易遷移及擴展特性。 * Docker 三個重要基本元素:容器(Container)、映像檔(Image)、倉庫(Repository)。 * Docker 使用 Volume 來做資料的管理,不論是要和實體主機共享資料,或是要讓容器之間共享資料都可以透過 Volume 來實現。 * 我們可以透過設定IP、埠號(Port),讓外部可以連到容器內的服務; 若要使容器間的服務可以溝通,則可以透過設定 --link 參數完成。 --- ### 參考資料 [Docker -- 從入門到實踐](https://philipzheng.gitbook.io/docker_practice/)  [Docker 菜鳥教程](https://www.runoob.com/docker/docker-tutorial.html) 
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up