學習docker on windows (1): 為什麼要使用docker

solenovex發表於2018-02-22

為什麼要用Docker?

如果我們想使用某種pc軟體, 那麼在網際網路上查詢並安裝軟體的流程大致如下圖:

那麼這就有幾個問題要弄清楚:

  • 從哪裡獲得軟體
    • App Store
    • Linux的包管理
    • 從某些網站直接下載
  • 軟體是否提供了相關資訊和資料
    • 例如流行度, 下載次數, 存在的bug, 上次的更新時間等等.
  • 信任問題
    • 下載軟體的網站是否為官方網站
    • http 還是 https
    • 程式碼
  • 是否還可以下載
  • 是否收費

第一個令人困擾的問題: 安裝軟體

  • 軟體是否支援我的作業系統/版本
  • 是否支援我的裝置的CPU架構
  • 軟體的格式
    • 有些是從原始碼進行安裝
    • 有些是單獨的exe檔案
    • 有的是exe+dlls
    • 有時候是exe+dlls+依賴某些執行時
  • 軟體的安裝方式
    • 有自帶的安裝器
    • 使用包管理工具安裝
    • 手動安裝
  • 軟體的更新和解除安裝
    • 自動更新?
  • 軟體的配置(對於新手來說可能這就是個噩夢)

從上面這些問題可以看出, 現在這個年代, 安裝個軟體真是個挺麻煩的事, 尤其是用於開發相關的軟體, 有時候讓人頭疼.

第二個問題: 軟體的執行

這方面可能會存在以下問題:

  • 是否有詳細的幫助文件
  • 軟體在哪執行
    • 是否需要手動修改系統某些設定
    • 是否需要設定環境變數PATH
  • 如何開始, 如何結束
  • 是否需要註冊服務
    • 如何註冊服務
    • 是否需要手動編寫服務配置
  • 是否需要許可
  • 如何安裝和執行軟體的依賴項
    • 如果沒找到依賴項會怎麼處理
    • 迴圈的依賴項
  • 安全性, 沙箱執行?
  • 破壞性更新
    • 系統更新是否對軟體有破壞性影響
    • 共享的庫有更新

什麼是容器

Docker不是虛擬機器的替代者, docker不是虛擬化技術, 它更多是關於軟體的執行.

什麼是容器,它和虛擬機器有什麼區別?

首先介紹一下虛擬機器:

虛擬機器管理其把伺服器的硬體資源(CPU,記憶體,硬碟,網路等)切割成多個虛擬的版本, 然後基於這些虛擬的硬體建立作業系統.

虛擬機器建立的系統就像是正常的系統服務一樣.

與虛擬機器管理器不同, Docker或者其他的容器引擎切割的是作業系統的資源, 例如程式的名稱空間, 網路棧, 儲存棧等等:

每個容器都有PID為1的程式, 每個容器也都有自己的根檔案系統(windows的C盤, linux的/).

所以docker可以稱作是對針對作業系統的虛擬化操作, 它非常的輕量級.

可以舉一些例子, 安裝 sql server, mysql, mongodb, postgresql 等, 下載, 安裝, 配置. 有的還是挺麻煩的.

下面看看使用docker會怎麼樣, 首先需要安裝docker.

安裝Docker

 Docker for windows 下載地址: https://store.docker.com/editions/community/docker-ce-desktop-windows

安裝好docker後, 系統右下角托盤處會有docker的圖示, 等到圖示不再閃爍了, 說明docker已經啟動成功了.

右鍵點選圖示有Settings.

可以通過命令列看一下docker的狀態:

docker version

可以看到client是windows, server是linux(系統需要啟用Hyper-V)虛擬機器.

從Hyper-V管理器可以看到這個linux虛擬機器:

使用Docker的例子: Postgresql

首先去 https://hub.docker.com/ 這裡查詢需要使用的軟體, 例如postgresql : https://hub.docker.com/_/postgres/

從頁面可以看到 postgres是docker官方認可的庫. 頁面的下方有使用說明等.

首先別忘了執行docker.

然後從docker hub下載postgres這個軟體(應該叫image), 命令列執行:

docker pull postgres

下載的過程有時候比較慢, 尤其是在國內 (如果速度實在太慢, 那麼可以使用阿里雲的容器映象: https://dev.aliyun.com/search.html?spm=5176.1972343.0.1.340c5aaafU9rRJ):

等了一段時間之後, 下載完畢:

現在image已經下載了, 那麼接下來就是需要通過某種方式執行這個image, 這就涉及到了container容器.

容器就像是一個已經安裝好的軟體, 它負責把這個image配置並安裝好, 然後就可以執行這個安裝好的postgresql了.

普通的軟體安裝好之後執行的是exe, 而這個執行的是容器, 容器裡面是postgresql.

整個針對普通的軟體安裝的流程如下:

docker run 命令

docker run 這個命令會一次性執行上面整個流程.

注: 所有的docker命令都是以docker開頭, 也就是呼叫docker程式. docker run xxx表示讓docker執行某個image. 然後客戶端就會通過API呼叫告訴服務端(Daemon守護程式, 它實現了Docker Remote Api或者叫Docker Engine Api). Daemon首先看看本地有沒有這個image, 然後沒找到這個image, 然後daemon就會從docker hub 拉取下來這個image到本地, 然後使用這個image來建立新的container.

下面執行docker run postgres:

可以看到postgresql已經執行起來了. 其內容和單獨安裝的postgresql執行起來是一樣的.

使用 docker ps 命令檢視正在執行的容器:

然後按照官方文件的命令使用psql去連線postgresql:

可以看到, 進入到psql環境了. 這個postgres和傳統方式安裝的postgresql功能是一樣的.

寫個postgresql命令試試:

docker exec 執行容器內的命令:

我電腦現在執行的是docker的linux容器, 所以可以使用這個命令執行一下linux的bash:

首先使用docker ps命令檢視正在執行的容器, 然後使用docker exec -it 08 bash執行ID為08開頭的容器內的bash命令. -it表示互動模式.

然後使用ps -e檢視該容器內的linux的程式, 裡面有bash, 剛才啟動執行的psql, ps.

退出

在互動模式下使用exit命令進行退出:

停止執行容器則需要使用docker stop 容器ID這個命令:

以上這些就是使用docker的原因.......

相關文章