# docker 介紹 ![](https://i.imgur.com/5mvUFeB.png) ###### docker的介紹 > 1. 什麼是docker 2. virtual machine 跟 container的差別 3. docker的架構 4. 安裝docker 5. workflow的發展 一 : 什麼是docker docker的存在是要幫助在 1. 建置applcation的時候,可以避免一或多個config files missing 2. 也避免software version 的差異 (python 2 or python 3) 3. 環境變數的差異 上述這些東西,docker會幫你打包好,不需要programmer花很長的時間在做調整programming的環境,全部交由docker處理 docker最大的優點是在: *比方說同個programming language有許多project share一個檔案,'如果沒使用docker的話,可能一個檔案不使用了,想要remove,就會影響到其他的project,但是有了docker之後,就不會==牽一髮動全身==,因為container有很好的隔離性,一旦project想要刪除,不會影響到另一個project的檔案內容。* 二: virtual machine跟container的差別 VM: * 需要將實體資源去做分配給多個vm * 開啟vm的速度很慢(因為要load os到每個vm之中),如同實體電腦在開機一樣 * 資源的利用很吃緊,因為像vmware、virtualbox 這種hypervisor在執行每個vm之前,都需要先做好對每個vm資源的管理,所以對每個vm來說,資源是固定的不能動態調整。 Containers: * 可允許多個app(operating system)獨立執行在容器之中 * 資源較輕量化,因為os不用整個下載下來 * 對container來說,OS就只會有一個 * 開啟每個container速度很快 * ==不用像vm一樣要去分配硬體資源== * windows api的cotainer不能執行在linux環境底下,而linux api的container可以執行在windows 作業系統中,那是因為win 10的作業系統,也可以搭載linux kernel。(子系統)。 三: docker的架構 ##### image : *將docker所需要跑的資源給打包起來(透過image file去package file for apps using for docker)* **所以==docker是軀殼,而image是靈魂==,她才可以去決定docker要去執行什麼內容的app** ##### docker image管理的地方: dockerhub(就如同git一樣,如果有人需要image的話,直接從server 端push到自己的host即可使用。) *打包image的做法(建立docker file):* ![reference link](https://i.imgur.com/V5GjQY1.png) 步驟: 1. 建立node環境於linux subsustem -->alpine 2. 把目前目錄底下的file全部copy到 /app中 3. 設定工作目錄為 /app 4. 在/app底下用node環境執行app.js ###### 執行後的結果 ![](https://i.imgur.com/8NeCSRr.png) ###### 呈現打包後的image file ![](https://i.imgur.com/ZWMEShB.png) 由上圖顯示的size大小,可以知道linux alpine node框架的size大小加上.js file的大小即為 168MB。 ###### 在docker上執行此image file ![](https://i.imgur.com/DkllLtR.png) ###### 如何上傳docker image file 供其他廣大的docker用戶使用(using docker hub) 1. 先到 https://hub.docker.com/ 去註冊一個帳戶 2. ![](https://i.imgur.com/Ko1b6AA.png) 按下create a repository 3. ![](https://i.imgur.com/tQOKyJh.png) 做法跟github線上版很像,設定名稱與要公開與否,好了之後按下create。接下來,就是把image file ==push==到這個先建立好的repo了。 4. 先透過自己電腦的terminal(cmd)登入docker public registry ![](https://i.imgur.com/BcEZeOw.png) *接著做push的動作:(將準備要push到repo的file新增tag)* ![](https://i.imgur.com/Vcx4DUh.png) 5. push 到 repo上面 ![](https://i.imgur.com/xODJnRZ.png) 6. 完成(若要檢視自己是否成功上傳到repo,可以使用 ###### docker pull tonyliu666/docker-for-practice ###### docker run -it tonyliu666/docker-for-practice:latest 執行看看是否成功。 ) ![](https://i.imgur.com/vmUGX5g.png) ###### 使用ubuntu ![](https://i.imgur.com/oXUO6DL.png) >進入到kernel,因為是以root身分登入,所以有出現#,若是一般使用者則為$ >![](https://i.imgur.com/385ARn6.png) ###### 同場佳映:使用python ![](https://i.imgur.com/RdCoOzf.png)