什麼是docker?

什麼是 Docker

Docker 是一個開源專案,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘專案。它基於 Google 公司推出的 Go 語言實作。 專案後來加入了 Linux 基金會,遵從了 Apache 2.0 協議,原始碼在 GitHub 上進行維護。

Docker 自開源後受到廣泛的關注和討論,以至於 dotCloud 公司後來都改名為 Docker Inc。Redhat 已經在其 RHEL6.5 中集中支援 Docker;Google 也在其 PaaS 產品中廣泛應用。

Docker 專案的目標是實作輕量級的作業系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。

在 LXC 的基礎上 Docker 進行了進一步的封裝,讓使用者不需要去關心容器的管理,使得操作更為簡便。使用者操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。

下面的圖片比較了 Docker 和傳統虛擬化方式的不同之處,可見容器是在作業系統層面上實作虛擬化,直接使用本地主機的作業系統,而傳統方式則是在硬體層面實作。

簡單來說,docker的容器(container)就是一個輕量化的虛擬機,利用同步與映像檔,讓一個網站的伺服器配置,可以隨意更動,也可容納更多的虛擬機。

基本概念

Docker 映像檔

Docker 映像檔就是一個唯讀的模板。

例如:一個映像檔可以包含一個完整的 ubuntu 作業系統環境,裡面僅安裝了 Apache 或使用者需要的其它應用程式。

映像檔可以用來建立 Docker 容器。

Docker 提供了一個很簡單的機制來建立映像檔或者更新現有的映像檔,使用者甚至可以直接從其他人那裡下載一個已經做好的映像檔來直接使用。

Docker 容器(container)

Docker 利用容器來執行應用。

容器是從映像檔建立的執行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平台。

可以把容器看做是一個簡易版的 Linux 環境(包括root使用者權限、程式空間、使用者空間和網路空間等)和在其中執行的應用程式。

*註:映像檔是唯讀的,容器在啟動的時候建立一層可寫層作為最上層。

Docker 倉庫(docker hub)

倉庫是集中存放映像檔檔案的場所。有時候會把倉庫和倉庫註冊伺服器(Registry)混為一談,並不嚴格區分。實際上,倉庫註冊伺服器上往往存放著多個倉庫,每個倉庫中又包含了多個映像檔,每個映像檔有不同的標籤(tag)。

倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。

最大的公開倉庫是 Docker Hub,存放了數量龐大的映像檔供使用者下載。 大陸的公開倉庫包括 Docker Pool 等,可以提供大陸使用者更穩定快速的存取。

當然,使用者也可以在本地網路內建立一個私有倉庫。

當使用者建立了自己的映像檔之後就可以使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一台機器上使用這個映像檔時候,只需要從倉庫上 pull 下來就可以了。

*註:Docker 倉庫的概念跟 Git 類似,註冊伺服器可以理解為 GitHub 這樣的託管服務。

使用

舉個簡單的例子

docker run -it --name cigna.hellosanta.tw -p 1019:80 -v ~/project/cigna:/usr/share/nginx/www --link mysql-5-6:mysql cobenash/drupal-nginx:20150824 /bin/bash

docker run 就是建立容器

-it -t 選項讓Docker分配一個虛擬終端(pseudo-tty)並綁定到容器的標準輸入上, -i 則讓容器的標準輸入保持打開。

— name 指定這個容器的名稱

-p 指定本機的哪個port指向虛擬機內的80port

-v 同步資料,或啟動執行

–link 連結其docker容器 (別台容器名):(容器內稱呼)

cobenash/drupal-nginx:20150824 這個是映像檔(image) 可以利用docker images查看自己有的映像檔,或者docker pull 倉庫名:版本 (tags) 例如:docker pull ubuntu:12.04

就這張圖來說,今天如果要為伺服器換一個環境,如果是一般機器,可能要刪除一堆東西,才能安裝下一個環境。

但今天使用docker,因為所有資料都在本機上,而資料庫都在mysql的docker上,所以只要stop並rm現有的docker 容器,重新docker run 想要環境的image,只要port跟之前設定的一樣(外面本機上nginx設定port給docker)

那麼很快,新的環境就完全建立完成,當然有些需要特殊port的快取,80或8080在機器內可以調整,但有些是必須放在外面(ex:memcached redis )

這時,就必須在docker run 的時候link 該 docker ,如圖中的mysql 就是使用link的方式使用。

就我目前使用docker的感覺上,就像是一推模組化的積木,當今天不想要這塊就拆掉,然後裝上另外一塊,就可以繼續執行,這對於效能上的調整,可以說是非常快速。

可以說只要本機上的資料沒有弄壞,docker容器內想怎麼玩就怎麼玩,當然要小心別跳出容器還不自知,本機壞掉可以說是什麼都沒救了。