前言

簡單來說,「Docker」本來是 dotCloud 公司內部的一個業餘專案,並採用 Google 的 Go 語言進行實作的產品。後來 dotCloud 公司將此專案加入 Linux 基金會並在 GitHub 上進行維護,迅速受到開發人員的喜愛,甚至 dotCloud 公司改名為 Docker Inc。有關 Docker 的一些歷史及觀念介紹因為《Docker — 從入門到實踐­》已經很清楚的說明,在此便不再贅述。此外,有時間也可以看一些相關影片:


雖然,在 Windows 作業系統中導入 Docker / Container 容器環境,但是整個實作技術跟 Linux 是完全不同的。簡單來說,Linux Image 是無法運作在 Windows Server Container 當中的,而 Windows Image 也無法運作在 Linux Container 容器環境,因為是採用「不同 API (Windows API vs Linux API)」運作環境,那麼我們來看看有哪些根本上的不同:

Linux Container
  • Control Group: 控制群組,針對共享資源進行隔離並管控硬體資源的使用 (例如,管理記憶體、檔案快取、CPU、磁碟 I/O…等使用率)。
  • Namespaces: 命名空間,確保每個容器都有單獨的命名空間,讓容器之間的運作互相不受影響。
  • AUFS: 檔案系統,不同容器可以共享基礎的檔案系統層,同時實現分層功能並將不同目錄掛載到同一個虛擬檔案系統中。

Windows Container
  • Job Objects: 類似 Linux 的控制群組機制。
  • Object Namespace、Process Table、Networking: 類似 Linux 的命名空間機制。
  • Compute Service: 作業系統層級的運算服務層。
  • NTFS: 每個運作的容器各自擁有 1 份 NTFS 分區表,並搭配虛擬區塊儲存裝置來建立容器多層式檔案系統,接著再利用 Symlink 運作機制把不同層的檔案對應到 Host 環境檔案系統內的實際檔案,以便減少虛擬區塊儲存裝置所占用的儲存空間。


Windows Server Container vs Hyper-V Container
微軟設計 2 種不同的 Container 容器環境,以便因應不同的環境的運作需求。同時,不同的 Windows 作業系統版本支援不同的 Container 容器環境 (例如,Windows 10 並不支援 Windows Server Container,所以用 Windows 10 玩的話必須要先安裝 Hyper-V 功能才行)。


那麼,我們概略了解一下 Windows Server Container 及 Hyper-V Container 有哪些不同:
  • Windows Server Container: 共用系統核心資源 (與 Linux Container 類似)。
  • Hyper-V Container: 獨立系統核心資源。Hyper-V 容器並非傳統的 Hyper-V VM 虛擬主機,而是運作 Windows Server Container 的特殊虛擬主機器,並且具備獨立的系統核心、Guest 運算服務、基礎系統執行程序……等。


為了方便進行 Docker 環境的測試作業,我採用 Microsoft Azure 建立 Windows Server 2016 Datacenter 虛擬主機。因為本文並非要討論 Microsoft Azure 所以如何建立 Windows 虛擬主機就不多說明了。😁






安裝 Docker 容器環境

首先,我們安裝 OneGet Provider PowerShell 模組,然後使用 OneGet 安裝最新版的 Docker (包含安裝 Windows Feature 中的 Container),當 PowerShell 詢問是否要信任封裝來源 'DockerDefault' 時,輸入 Y 或 A 以便繼續安裝程序。當安裝作業完成後,系統也提示你應該重新啟動電腦以便套用生效。
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Install-Package -Name docker -ProviderName DockerMsftProvider
Restart-Computer -Force


裝好 Docker 容器環境並重新啟動後,便會發現多出「vEthernet (HNS Internal NIC)」 網段就是 172.x.x.x / 255.255.240.0,後續在討論 Docker Network 時再來深入了解這部分。






基礎操作

安裝好 Windows Server Container 容器環境後,便可以透過「docker info」指令查看 Docker 容器環境的運作資訊:


透過「docker version」指令,馬上確認目前 Docker 容器環境的 Client / Server 版本。






永遠的範例 Hello-World

那麼,讓我們開始使用 Docker 容器環境吧,不免俗的第 1 個範例就是透過 Docker 容器環境執行列出字串「Welcome to using .NET Core!」吧。在這項練習中,您將從 Docker Hub 登錄下載預先建立的 .NET 範例映像,並部署執行 .Net Hello World 應用程式的簡單容器。
docker run microsoft/dotnet-samples:dotnetapp-nanoserver

同樣的,此時可以透過「docker images」指令查看已經下載的 Docker 映像檔資訊。


在 Windows 運作環境中的容器基礎映像的部分,目前有「Windows Server Core (9.56 GB)」及「Nano Server (925 MB)」。可以透過下列指令從 Docker Hub 下載
docker pull microsoft/windowsservercore
docker pull microsoft/nanoserver








參考資源


前言

簡單來說,「Docker」本來是 dotCloud 公司內部的一個業餘專案,並採用 Google 的 Go 語言進行實作的產品。後來 dotCloud 公司將此專案加入 Linux 基金會並在 GitHub 上進行維護,迅速受到開發人員的喜愛,甚至 dotCloud 公司改名為 Docker Inc。有關 Docker 的一些歷史及觀念介紹因為《Docker — 從入門到實踐­》已經很清楚的說明,請參考下列相關連結即可:

Docker 簡介
          什麼是 Docker
          為什麼要使用 Docker?
Docker 基本概念
          映像檔 (Image)
          容器 (Container)
          倉庫 (Repository)
Docker 底層技術
          基本架構
          命名空間 (NameSpaces)
          控制組 (Control Groups)
          Union 檔案系統 (Union File Systems)
          容器格式
          網路


那麼 2017 年的新年新希望,就讓我們開始從玩 Docker 開始吧,以下是其它的一些重點摘要:
  • 在開始玩 Docker Lab 之前,建議註冊 Docker HubGitHub 等帳號以便後續實作。
  • Container 目前尚未支援如 VM 的快照功能,但 Container 建立產生快速所以原則上並不需要快照功能。
  • Container 是指 Running 時的狀態,若是靜態的話則稱之為 Images。
  • Container 的概念,就是每個「服務」個別打包成「1 個」Container,例如,過往的 LAMP 在 Container 的運作概念中,就是分拆成 Apache Container, MySQL Container, PHP Container。


為了方便進行 Docker 環境的測試作業,我採用 Microsoft Azure 建立 FreeBSD 11 虛擬主機。因為本文並非要討論 Microsoft Azure 所以如何建立 FreeBSD 虛擬主機就不多說明了。😁




OS 需求

雖然,在 Docker 官網中的文件 Install Docker Engine 當中,並沒有關於 FreeBSD 如何安裝及運作 Docker 容器環境的說明文件,但事實上 Docker 容器環境從 2015 年 6 月開始就可以在 FreeBSD 上使用,並且在 Docker - FreeBSD Wiki 文件中也有相關安裝說明,所以我們還是來試試看吧。簡單來說,在 FreeBSD 要能順利運作 Docker 容器環境,將會依賴「ZFS、Jail、64bit Linux Compatibility Layer」等技術,屆時便可以順利運作 Docker 容器環境並從 docker.io Repository 檢索容器。

在 FreeBSD 運作環境中,為了確保可以順利安裝及執行 Docker 容器環境,請確認採用「FreeBSD 11-Current 及後續版本」(簡單來說,就是 2015 年 6 月發行的版本並支援 x86-64 Linux Binaries 即可)。首先,透過「uname -a」指令確認目前採用的 FreeBSD 版本資訊以便符合 Docker 容器環境運作要求,此實作環境採用 FreeBSD 11.0-RELEASE-p7 版本。






建立 <zroot> 用途的 Raw Disk

請依序執行下列指令,先載入 zfs 模組後執行建立 10GB ZFS root file system 的 Raw Disk 指令。指令執行後,必須稍後一下,此時可以切換到 Azure Portal 可以看到磁碟正在努力讀寫當中。
# kldload zfs
# dd if=/dev/zero of=/usr/local/dockerfs bs=1024K count=10240
 10240+0 records in
 10240+0 records out
 10737418240 bytes transferred in 327.025476 secs (32833583 bytes/sec)



接著,執行建立 zpool 及 ZFS dataset on /usr/docker 掛載的動作
# zpool create -f zroot /usr/local/dockerfs
# zfs list
 NAME    USED  AVAIL  REFER  MOUNTPOINT
 zroot   286K  9.63G    19K  /zroot
# zpool list
 NAME      SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
 zroot    9.94G   496K  9.94G         -     0%     0%  1.00x  ONLINE  -
# zfs create -o mountpoint=/usr/docker zroot/docker
# df -h
 Filesystem             Size    Used   Avail  Capacity   Mounted on
 /dev/label/rootfs       27G     12G     13G       47%   /
 devfs                  1.0K    1.0K      0B      100%   /dev
 /dev/da1s1             6.8G     12K    6.2G        0%   /mnt/resource
 zroot                  9.6G     19K    9.6G        0%   /zroot
 zroot/docker           9.6G     19K    9.6G        0%   /usr/docker






安裝 Docker 容器環境

請使用 Root 權限,執行指令以便建立 Docker 容器環境。在這個安裝 Docker 容器環境的過程中,系統將會有下列 3 項提示:

  • 提示修改 /etc/fstab 以便主機重新啟動仍能自動掛載 zfs 掛載點。
  • 提示修改 /etc/rc.conf 以便主機重新啟動仍能自動啟動 Docker 服務。
  • 提示,若屆時需要將外部流量導入 Container 的話,範例 PF 防火牆開放規則「nat on ${iface} from 172.17.0.0/16 to any -> (${iface})


了解後,請執行下列指令以便建立 Docker 容器環境。
# pkg install docker-freebsd ca_root_nss





因此,執行指令完畢後請先修改「/etc/fstab」檔案內容,加上「fdesc   /dev/fd   fdescfs   rw   0   0」,以便 FreeBSD 主機重新啟動後能夠自動掛載 zfs 相關路徑。
# cat /etc/fstab
 # Device            Mountpoint     FStype    Options   Dump  Pass#
 /dev/label/rootfs   /              ufs       rw        1     1
 /dev/label/swap     none           swap      sw        0     0
 fdesc               /dev/fd        fdescfs   rw        0     0


後續,當 FreeBSD 重新啟動後,仍會自動掛載相關掛載點 (/dev/fd, /usr/docker, /zroot)。


接著,修改「/etc/rc.conf」設定檔內容,以便 FreeBSD 主機重新啟動後能夠自動啟動 Docker daemon 及 zfs 服務。
# sysrc -f /etc/rc.conf zfs_enable="YES"
 zfs_enable:  -> YES
# sysrc -f /etc/rc.conf docker_enable="YES"
 docker_enable:  -> YES


然後,就可以透過「service docker start」指令啟動 Docker 服務,我們仍可以透過傳統的「ps aux |grep docker」來確認目前 Docker Daemon 的執行狀態、PID……等資訊,或使用「service docker status」來確認 Docker Daemon 是否啟動。






基礎操作

透過「docker version」指令,確認目前 Docker 容器環境的 Client / Server 版本,可以看到是舊版「1.7.0-dev」版本。






第 1 個範例

透過「docker search ubuntu」指令搜尋 ubuntu Image,可以看到第 1 筆就是「官方 (Official)」。


接著,使用「docker pull ubuntu」指令下載 ubuntu Image。


使用「docker images」指令便可以看到 ubuntu Image 大小及資訊。


運作 ubuntu 容器環境,然後執行相關指令確認 ubuntu 容器確實運作中。


小結,然而經過一些測試,目前看來 FreeBSD 在運作 Docker 容器環境上,跟 Linux 環境相較之下似乎還不太理想。舉例來說,下載及執行 hello-world Image 及 CentOS Image 都會發生些許問題。(相關問題討論請參考 Docker-freebsd won't work | The FreeBSD Forums)







參考資源


活動簡介

根據知名市調機構 Gartner 的統計調查結果,從 2016 年開始有「2/3 以上」的企業及組織,將開始建構及整合「Mode 2」的敏捷式 IT 基礎架構,所謂「基礎架構敏捷化」(Infrastructure Agility),便是著重於 IT 基礎架構中「Mode 2」的部分以便因應商業數位化的需求。

此外,根據 Gartner 的預測,在 2017 年時全球大型企業中將有高達「75 %」的比例,會建立 Mode 1 及 Mode 2 的雙重 IT 基礎架構稱之為「Bimodal IT」。在傳統 Mode 1 當中的工作負載、技術、流程、部署模式已經行之有年無須再驗證,但 Mode 2 是新興的方式並在根本上與 Mode 1 不同,它強調的是「敏捷性」(Agility)「可擴充性」(Scalability)以提高開發人員的生產力,達到快速推出新服務的一種方式,舉例來說,「容器」(Container)技術可以幫助開發人員達到更好的敏捷性。簡單來說,傳統的 Mode 1 運作架構專注於「基礎架構管理」,而新興的 Mode 2 則是專注於「工作負載為中心」。

在本次聚會中將快速與大家討論及實作,如何透過 Microsoft Azure 公有雲環境,快速建立 ubuntu、CentOS、FreeBSD 虛擬主機,並且安裝及建立 Docker 容器測試環境。同時,也將實作及展示 Windows Server 2016 Container 容器環境。



活動資訊




前言

簡單來說,「Docker」本來是 dotCloud 公司內部的一個業餘專案,並採用 Google 的 Go 語言進行實作的產品。後來 dotCloud 公司將此專案加入 Linux 基金會並在 GitHub 上進行維護,迅速受到開發人員的喜愛,甚至 dotCloud 公司改名為 Docker Inc。有關 Docker 的一些歷史及觀念介紹因為《Docker — 從入門到實踐­》已經很清楚的說明,請參考下列相關連結即可:

Docker 簡介
          什麼是 Docker
          為什麼要使用 Docker?
Docker 基本概念
          映像檔 (Image)
          容器 (Container)
          倉庫 (Repository)
Docker 底層技術
          基本架構
          命名空間 (NameSpaces)
          控制組 (Control Groups)
          Union 檔案系統 (Union File Systems)
          容器格式
          網路


那麼 2017 年的新年新希望,就讓我們開始從玩 Docker 開始吧,以下是其它的一些重點摘要:
  • 在開始玩 Docker Lab 之前,建議註冊 Docker HubGitHub 等帳號以便後續實作。
  • Container 目前尚未支援如 VM 的快照功能,但 Container 建立產生快速所以原則上並不需要快照功能。
  • Container 是指 Running 時的狀態,若是靜態的話則稱之為 Images。
  • Container 的概念,就是每個「服務」個別打包成「1 個」Container,例如,過往的 LAMP 在 Container 的運作概念中,就是分拆成 Apache Container, MySQL Container, PHP Container。


為了方便進行 Docker 環境的測試作業,我採用 Microsoft Azure 建立 CentOS 7 虛擬主機。因為本文並非要討論 Microsoft Azure 所以如何建立 CentOS 虛擬主機就不多說明了。😁






OS 需求

在 CentOS 運作環境中,為了確保可以順利安裝及執行 Docker 容器環境,請確認採用「CentOS 7 - 64 位元」版本。首先,透過「uname -a」指令確認目前採用的 Linux 版本為 64 位元,接著執行「cat /etc/redhat-release」 指令可以看到為 CentOS 7.3  符合 Docker 容器環境運作要求。






安裝 Docker 容器環境

完整且詳細的作法,請參考 Docker 官網提供的正規作法 Get Docker for CentOS - Docker。因為在 CentOS 7 版本中「CentOS-Extras」庫存中已經內建 Docker 套件,所以只要執行「sudo yum -y install docker」便可以安裝完成 (但是你會發現所安裝的 Docker 並非最新版本的 Docker,例如,目前最新為 1.13 但透過 CentOS-Extras 所安裝則為 1.12)。


所以,本文還是採用最簡單並取得最新 Docker 版本的安裝方式透過 curl 指令去安裝。
sudo yum -y update
sudo curl -sSL https://get.docker.com | sh


從 CentOS 7 開始,管理服務的部分已經從傳統的 Runlevel (/etc/rc.d/init.d),改為新一代的「systemd  (/etc/systemd/system)」,所以在安裝作業完成後,我們使用「systemctl start docker」指令來啟動 docker 服務,接著透過「systemctl enable docker」設定 CentOS 主機重新啟動後,仍然能夠自動啟動 docker 服務。
systemctl start docker
systemctl enable docker


接著,我們仍可以透過傳統的「ps aux |grep docker」來確認 Docker Daemon 是否啟動,或採用新一代的指令「systemctl status docker」來確認目前 Docker Daemon 的執行狀態、PID……等資訊。


執行下列指令,把實作的使用者帳戶 (dockerlab) 加入到「docker」群組當中,避免後續執行 docker client 指令都還要打 sudo。完成後,確認 dockerlab 這個使用者帳號已經加入到 docker 群組當中後,記得「登出再登入」以便套用生效。
sudo usermod -aG docker $(whoami)
grep "docker:" /etc/group
exit






基礎操作

透過「docker info」可以查看 Docker 容器環境的運作資訊,條列一下我覺得輸出資訊中比較重要的項目:
  • Server Version: 1.13.0
  • Docker Root Dir: /var/lib/docker


透過「docker version」指令,馬上確認目前 Docker 容器環境的 Client / Server 版本。






永遠的範例 Hello-World

那麼,讓我們開始使用 Docker 容器環境吧,不免俗的第 1 個範例就是透過 Docker 容器環境執行列出字串「Hello-World」吧。

其實在執行「docker run hello-world」指令後,在第 1 行資訊中 (Unable to find image 'hello-world:latest' locally) 可以看到,系統發現目前並沒有「Hello-World」這個 Images,所以就透過預設的系統設定去 Docker Hub 下載 Hello-World 這個容器映像檔 (所以自動執行「docker pull」的動作),最後執行它。其實在結果中看到回應的 4 點訊息,已經完全說明這個動作的流程。
docker run hello-world

接著,可以透過「docker images」查看目前系統中的 Docker Images 清單。此外,你也可以觀察一下 Docker Images 的預設資料夾「/var/lib/docker/*」下相關的變化。 初步練習就先到這裡,後續再慢慢深入吧。  💪






參考資源


前言

簡單來說,「Docker」本來是 dotCloud 公司內部的一個業餘專案,並採用 Google 的 Go 語言進行實作的產品。後來 dotCloud 公司將此專案加入 Linux 基金會並在 GitHub 上進行維護,迅速受到開發人員的喜愛,甚至 dotCloud 公司改名為 Docker Inc。有關 Docker 的一些歷史及觀念介紹因為《Docker — 從入門到實踐­》已經很清楚的說明,請參考下列相關連結即可:

Docker 簡介
          什麼是 Docker
          為什麼要使用 Docker?
Docker 基本概念
          映像檔 (Image)
          容器 (Container)
          倉庫 (Repository)
Docker 底層技術
          基本架構
          命名空間 (NameSpaces)
          控制組 (Control Groups)
          Union 檔案系統 (Union File Systems)
          容器格式
          網路


那麼 2017 年的新年新希望,就讓我們開始從玩 Docker 開始吧,以下是其它的一些重點摘要:
  • 在開始玩 Docker Lab 之前,建議註冊 Docker HubGitHub 等帳號以便後續實作。
  • Container 目前尚未支援如 VM 的快照功能,但 Container 建立產生快速所以原則上並不需要快照功能。
  • Container 是指 Running 時的狀態,若是靜態的話則稱之為 Images。
  • Container 的概念,就是每個「服務」個別打包成「1 個」Container,例如,過往的 LAMP 在 Container 的運作概念中,就是分拆成 Apache Container, MySQL Container, PHP Container。


為了方便進行 Docker 環境的測試作業,我採用 Microsoft Azure 建立 ubuntu 16.04.1 LTS 虛擬主機。因為本文並非要討論 Microsoft Azure 所以如何建立 ubuntu 虛擬主機就不多說明了。😁






OS 需求

在 Ubuntu 運作環境中,為了確保可以順利安裝及執行 Docker 容器環境,請確認採用「64 位元」Ubuntu 以及下列版本:

  • Yakkety 16.10
  • Xenial 16.04 (LTS)
  • Trusty 14.04 (LTS)


首先,透過「uname -a」指令確認目前採用的 Linux 版本為 64 位元,接著執行「lsb_release -a」 可以看到為 Ubuntu 16.04.1 LTS 符合 Docker 容器環境運作要求。






安裝 Docker 容器環境

完整且詳細的作法,請參考 Docker 官網提供的正規作法 Install Docker on Ubuntu - Docker。下列則是簡易作法,直接透過 curl 去把 Docker.com 上的 Shell Script 下載後執行安裝的動作。
sudo apt-get update
sudo curl -sSL https://get.docker.com | sh


安裝作業完成後,可以看到採用的 Docker Client / Server 的版本及相關資訊。同時,還提醒你要把目前的使用者帳號 (此實作為 dockerlab) 加入至「Docker」群組當中,以避免後續執行 docker 指令因為權限的關係還要額外加上 sudo 才能執行的困擾。



執行下列指令,把實作的使用者帳戶 (dockerlab) 加入到「docker」群組當中,避免後續執行 docker 指令都還要打 sudo。 完成後,確認 dockerlab 這個使用者帳號已經加入到 docker 群組當中後,記得「登出再登入」便套用生效。
sudo usermod -aG docker dockerlab
grep "docker:" /etc/group
exit



重新登入後,首先確認 Docker Daemon 是否正在執行中,以及後續倘若 Ubuntu 重新啟動後 Docker Daemon 是否會自動啟動。
ps aux | grep dockerd
service --status-all |grep docker






基礎操作

透過「docker info」可以查看 Docker 容器環境的運作資訊,條列一下我覺得輸出資訊中比較重要的項目:

  • Server Version: 1.13.0
  • Root Dir: /var/lib/docker/aufs
  • Docker Root Dir: /var/lib/docker



透過「docker version」指令,馬上確認目前 Docker 容器環境的 Client / Server 版本。






永遠的範例 Hello-World

那麼,讓我們開始使用 Docker 容器環境吧,不免俗的第 1 個範例就是透過 Docker 容器環境執行列出字串「Hello-World」吧。

其實在執行「docker run hello-world」指令後,在第 1 行資訊中 (Unable to find image 'hello-world:latest' locally) 可以看到,系統發現目前並沒有「Hello-World」這個 Images,所以就透過預設的系統設定去 Docker Hub 下載 Hello-World 這個容器映像檔 (所以自動執行「docker pull」的動作),最後執行它。其實在結果中看到回應的 4 點訊息,已經完全說明這個動作的流程。



接著,可以透過「docker images」查看目前系統中的 Docker Images 清單。此外,你也可以觀察一下 Docker Images 的預設資料夾「/var/lib/docker/*」下相關的變化。初步練習就先到這裡,後續再慢慢深入吧。💨






參考資源