Docker 是一個開源軟體,出現於2013年初,最初是 Dotcloud 公司內部的 Side-Project。
它基於 Google 公司推出的Go語言實作。(Dotcloud 公司後來改名為 Docker)
Docker 想解決的問題:
改善傳統虛擬機器因為需要額外安裝作業系統(Guest OS),導致啟動慢、佔較大記憶體的問題。
Docker 要提供的解法:
以應用程式為核心虛擬化,取代傳統需要 Guest OS 的虛擬化技術。
虛擬化要解決的問題是:「當我寫了一個程式,在我電腦上可以執行,但在別人電腦上就不行」。
簡單來說:我的程式可能剛好只跟我的電腦的環境相容。:cry:
而虛擬化要做的就是模擬出一個環境,讓程式可以在不同硬體或作業系統上執行時,都以為自己在同一個環境中執行,以此來避免前面所述的問題。
目前常見用來比較的虛擬化技術有兩種:
在系統層級的虛擬化技術,稱虛擬機器(Virtual machine)
例如 : Virtual Box 。
在作業系統層級技術,此稱容器(Container)
例如 : Docker 。
以作業系統為中心
傳統虛擬化的目標: 將一個應用程式所需的執行環境打包起來,建立一個獨立環境,方便在不同的硬體中移動。
虛擬機器是在系統層上虛擬化,
簡單來說, Virtual Box 就是一個可以讓你在作業系統(Host OS)上面再裝一個作業系統(Guest OS),然後讓兩個作業系統彼此不會打架的平台。
以應用程式為中心
容器化的目標: 改善虛擬機器因為需要裝 Guest OS 導致啟動慢、佔較大記憶體的問題。
容器是在作業系統層上虛擬化,
透過 Container Manager 直接將一個應用程式所需的程式碼、函式庫打包,
建立資源控管機制隔離各個容器,並分配 Host OS 上的系統資源。
透過容器,應用程式不需要再另外安裝作業系統(Guest OS)也可以執行。
Docker 是一種工具,可用來建立、部署及執行使用容器的應用程式。 容器可讓開發人員封裝含有其所需全部元件 (程式庫、架構、相依性等) 的應用程式,且全部以一個套件的形式出貨。
使用容器可確保應用程式會以相同的方式執行,而不管任何自訂的設定或先前在執行該應用程式的電腦 (可能與用來撰寫和測試應用程式程式碼的電腦不同) 上安裝的程式庫。
這可讓開發人員專注於撰寫程式碼,而不需擔心程式碼將在其上執行的系統。
要使用 Docker 時最重要的三個元素:
映像檔(Image)、 容器(Container)、 倉庫(Repository)。
用一個簡單的比喻來解釋 :
如果映像檔是一個做蛋糕的模具,容器則是用該模具烤出來的蛋糕,而倉庫是用來集中放置模具們的收納櫃。
舉例來說,如果我今天想要一個 node.js 的執行環境跑我寫好的程式,我可以直接到上 Docker Hub 找到相對應的 node.js 映像檔 ,而不需要自己想辦法打包一個執行環境。
它是 Docker 的映像檔主要是一個唯讀的檔案, 是啟動 Docker container 要使用到的檔案。
另外 Docker 的 image 可以像是堆積木一樣, 一層一層的把 Docker image 堆起來。
如右圖:
可以把容器看做是一個執行的應用程式加上執行它的簡易版 Linux 環境(包括 root 使用者權限、程式空間、使用者空間和網路空間等)
Docker Container 是透過 Docker image 執行起來的 Process,同一個 Docker image 可以啟動多個 Docker Container。
Docker container 和 Docker container 之間的環境是隔離開離來的,不會發生 container1 開 8080 的 port,container2 開 8080 的 port 有衝到的問題
而 Docker 倉庫註冊伺服器的概念就跟 Github 類似,你可以在上面建立多個倉庫,然後透過 push、pull 的方式上傳、存取。
Docker 並非是一个通用的容器工具,它依賴於已存在並運行的 Linux 内核環境。
在 Windows 上部署 Docker 的方法都是先安装一个虛擬機,並在安装 Linux 系統的的虛擬機中運行 Docker。
開發人員可以在 Windows 電腦上同時存取 Windows 和 Linux 的功能。
Windows 子系統 Linux 版 (WSL) 可讓開發人員直接在 Windows 上安裝 Linux 散發套件 (,例如 Ubuntu、OpenSUSE、Type、Debian、Arch Linux 等) 並使用 Linux 應用程式、公用程式和 Bash 命令列工具,不需要傳統虛擬機器或雙佈設定的額外負荷。
您必須Windows 10版本 2004 和更新版本執行, (組建 19041 和更新版本) 或Windows 11。 檢查更新。
開啟 PowerShell 或 Windows 命令提示字元(cmd),輸入命令,然後重新開機電腦。
若已有其他版本,可以以此指令來下載Ubuntu
使用 wsl --install
命令安裝的新 Linux 安裝預設會設定為 WSL 2。
系統會要求您為 Linux 發行版本建立使用者名稱和密碼。
若要變更或重設密碼,請開啟 Linux 發行版本,然後輸入命令: passwd
。
系統會要求您輸入目前的密碼,然後要求您輸入新密碼,然後確認您的新密碼。
使用 WSL 2 (Windows 子系統 Linux 版 版本 2) 設定適用于 Windows 的 Docker Desktop。
請先到 Docker 官網
https://www.docker.com/docker-windows
在cmd上輸入以下指令可以確認是否下載成功
開啟 Docker Desktop
確定已核取 [設定>一般] 中的 [使用 WSL 2 型引擎]。
移至 [設定>資源>WSL 整合],從您想要啟用 Docker 整合的已安裝 WSL 2 散發套件中選取。
若要確認已安裝 Docker,請開啟 WSL 散發套件 (例如 Ubuntu) ,並輸入下列命令來顯示版本和組建編號:
docker --version
Docker 會建立兩個散發資料夾來儲存資料:
您可以開啟 WSL Linux 發行版本並輸入: explorer.exe
.
在 Windows 檔案總管中檢視資料夾,以找到這些資料夾。
輸入: \\wsl$
從 Docker Hub 下載 Docker Image 到 local
要下載 Docker Image 之前需要先搜尋一下,Docker Image 的 Name 是什麼,指令如下:
is-official=true
表示要搜尋是官方的 Docker image
就選擇星星數最多的 Name 為 ubuntu
找到了 ubuntu 的 Docker Image Name 之後,就可以把此 image pull 下來,指令如下:
執行結果如下圖
要再一次確認 ubuntu 的docker image有沒有下載下來,可以使用以下的指令
執行結果如下圖
有了 Docker Image 之後就可以把 container 執行起來了,並且進入 Docker Container 的 terminal 裡面
指令如下
使用以上的指令就可以進入了docker container 裡面的 terminal
可以再打開另外一個terminal視窗,輸入以下指令
確認 docker container 有正常的執行,如下圖:
在要離開 docker container 的 terminal 時有一個坑。就是如果輸入 exit 指令時,container 會被關閉,如下圖:
如果不要停止 container 而要退出 docker container 的terminal 需要輸入 ctrl + p 之後再輸入 ctrl + q 的按鍵,就不會把 container 關閉。
在 docker container 裡面安裝和啟動 apache 的 http service,指令如下:
if it is success will show
簡單寫一個 hellowolrd.html檔案放在 /var/www/html 的路徑下,指令如下:
使用 cat /etc/hosts 指令查看 docker container 的 IP 如下圖:
如果想要使用 ifconfig 指令,需要安裝 net-tools 工具指令如下:
使用 Linux 虛擬機GUI browser 輸入 http://172.17.0.2/helloworld.html 的 URL 查看 helloworld.html 的檔案是否能正常的顯示。
使用 Window 本機的 browser 輸入 http://localhost:8000/helloworld.html 的 URL 查看 helloworld.html 的檔案是否能正常的顯示,畫面如下:
Dockerfile 由一行行命令語句組成,並且支援以 # 開頭的註解行。
Dockerfile 分為四部分:
FROM: 使用到的 Docker Image 名稱,今天使用 CentOS
MAINTAINER: 用來說明,撰寫和維護這個 Dockerfile 的人是誰,也可以給 E-mail的資訊
RUN: RUN 指令後面放 Linux 指令,用來執行安裝和設定這個 Image 需要的東西
ADD: 把 Local 的檔案複製到 Image 裡,如果是 tar.gz 檔複製進去 Image 時會順便自動解壓縮。Dockerfile 另外還有一個複製檔案的指令 COPY 未來還會再介紹
ENV: 用來設定環境變數
CMD: 在指行 docker run 的指令時會直接呼叫開啟 Tomcat Service
已經體驗過使用 Docker 的指令,把 Docker Image Pull 到 local,並且執行 container,然後在 container 上安裝 HTTP Service,就類似是在使用 VM。
直接進入 Docker Container 裡面下一些指令安裝程式和改設定檔,不夠自動化,可能需要常常的重覆在做同一件事,這樣會很沒效率。
寫 Dockerfile,只要下 docker build
的指令就可以把 Docker Image 建構起來,未來要使用就直接 Run 此 Image。
主要目的用來體驗如何撰寫 Dockerfile 和 Build Image 以及執行 Docker container。
記住要使用 WSL2 此虛擬機 來實作 Docker
可參考前面 安裝 Windows,或以下訊息
Docker 並非是一个通用的容器工具,它依賴於已存在並運行的 Linux 内核環境。
在 Windows 上部署 Docker 的方法都是先安装一个虛擬機,並在安装 Linux 系統的的虛擬機中運行 Docker。
建立 Dockerfile
建立寫 Dockerfile 會用到的資料夾,指令如下
下載JDK 的安裝檔放在 docker-test資料夾裡,使用的版本是 jdk-19.0.2
將檔案移至路徑 \wsl$\Ubuntu\home\[user name]\docker-test
撰寫Dockerfile
Dockerfile 的內容如下
撰寫完 Dockerfile 之後資料夾的結構如下圖
或者將下載 jdk19.0.2 也寫入 dockerfile
Build Docker Image
預設在和 Dockerfile 檔案同層的資料夾底下輸入, docker build 指令,如下
使用 –no-cache 的主要原因,是避免在 Build Docker image 時被 cache 住,而造成沒有 build 到修改過的 Dockerfile。
Build 完的結果如下圖:
Build 完 Docker Image 之後,使用 docker images 指令查看是否有 build 成功如下圖
在 Build 完 Docker Image 之後就可以執行 Docker Container,這時Tomcat 的 Service 也會跟者被執行起來,指令如下
在瀏覽器跑
在虛擬機跑
Tomcat Service 會被執行起來的主要原因是在 Dockerfile 裡面有寫 CMD 指令,呼叫啟動 Tomcat Service
打開 Browser 確認
要使用 docker exec 指令之前需要先知道 Container 的 ID 所以需要先使用 docker ps 指令查詢 Container ID,如下圖:
直接進入 Docker Container 去看 IP 的位址其實有點麻煩,會故意這樣 Daemon 主要的原因,是讓大家了解到我們把 Docker Container 執行啟來時並不會知道它的 IP 位址在哪,這需要透過設定有關於 Docker 的 Network 來解決這個問題。
目前使用最簡單的方法,就是在run docker container 時用 Port 的 Mapping 來解決此問題,重新再一次 run docker container,指令如下:
Container 的 8080 port mapping到 localhost 的 8080 port ,這樣只要輸入 http://localhost:8080 就可以看到 tomcat service 的 WebUI 畫面了。
docker run
指令就可以把 Docker Container 啟動起來,但是如果我們要啟動很多個 Docker Container 時,就需要輸入很多次 docker run
指令。Docker-Compose: 寫一個 docker-compose.yml
,把所有要使用 Docker Image 寫上去,也可以把 Container 之間的關係連結(link)起來。
最後只要下 docker-compose up
指令,就可以把所有的 Docker Container 執行起來,這樣就可以很快速和方便的啟動多個 container。
# 啟動所有的 Docker Container
# 查看 Docker Container 的執行狀態
# 看執行的 log
# 停止 docker-compose 執行的所有 Container
# 刪除 docker-compose 的所有 Container
docker-compose.yml
docker-compose up
,指令把所有的 Docker Container 啟動起來主要的功能是要啟動 2 個 Docker Container,一個是 mysql 的 Container,另外一個是 admin 管理 mysql Web UI 的 container
MYSQL_ROOT_PASSWORD 的環境變數用來設定登入 mysql 的密碼
-d
參數代表要執行在背景的方式Wed, Feb 1, 2023 3:51 AM
HsingyuChen