顯示具有 Docker 標籤的文章。 顯示所有文章
顯示具有 Docker 標籤的文章。 顯示所有文章

[2017/3/14 Update] 上傳活動照片及簡報

活動簡介

根據知名市調機構 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 容器環境。



活動資訊



活動照片及簡報

對於今天無法到場參與 Live Hands-On 及討論的朋友,可以參考看看今天議程的簡報。😎





前言

Photon 由 VMware 官方在 2015 年 4 月發行,它是由 VMware 自家所開發的 Linux 版本專為 vSphere 環境所優化的 Container 運作平台 (同時,也支援其它常見的容器格式,例如,Docker, Rocket (rkt), Pivotal Garden),並且移除 Linux Kernel 及 vSphere Hypervisor 重複的核心快取,以便提升整體運作效能。

此外,Photon OS 可以部署在 vSphere ESXi 5.5、6.0 虛擬化平台,以及 vCloud Air、VMware Fusion、VMware Workstation 等虛擬化環境中。下列為入門 Photon OS 很棒的參考文件及影片:





Photon 安裝需求

Photon OS 安裝及初始設定的詳細操作步驟,請參考官方影片及說明文件:


在此次的實作環境中,採用的 Photon-1.0 ISO 大小為 2.06 GB,倘若採用 VM 的方式安裝 photon 時,記得在選擇 OS 類型時採用「Linux - Other Linux 3.x kernel 64-bit」。下列為安裝 Photon OS 的最低硬體需求:
  • 2 vCPU
  • 384 MB Memory
  • 20 GB HDD


在安裝 Photon 過程中,將有下列 4 種安裝選項可供選擇:
  • Photon Minimal: 為最輕量的 Container Host Runtime 運作環境,具備最高效能及安全性的版本。
  • Photon Full: 包含額外的套件以方便建立及打包應用程式為容器環境,適合一開始使用 Photon 進行驗證及測試的版本。
  • Photon OSTree Host: 將會建立 Photon OS Instance 並從 RPM-OSTree Server 下載相關 Package 及 Library,並且後續由 OSTree Server 集中管理。
  • Photon OSTree Server: 將會建立 Repository 及負責管理 OSTree Hosts,為單位生命週期管理及企業級規模擴充的工作任務。


此次實作環境中,選擇「Photon Full」安裝選項並花費 225 秒即安裝完畢。





基礎操作

查看 Photon OS 主機系統資訊。此外,倘若 Photon OS 是運作在 VM 虛擬主機的話,可以透過「systemctl status vmtoolsd」指令查看 VMware Tools 服務的運作情況。
# uname -a
# cat /etc/photon-release
# hostnamectl


從 RHEL 7 / CentOS 7 開始,管理服務的部分已經從傳統的 Runlevel (/etc/rc.d/init.d),改為新一代的 systemd  (/etc/systemd/system)。因此,採用與 RedHat / CentOS 相關 Linux 核心的 Photon OS 便可以使用「systemctl start docker」指令來啟動 docker 服務,接著透過「systemctl enable docker」設定 Photon 主機重新啟動後,仍然能夠自動啟動 docker 服務。接著,可以透過傳統的「ps aux |grep docker」來確認 Docker Daemon 是否啟動,或採用新一代的指令「systemctl status docker」來確認目前 Docker Daemon 的執行狀態、PID……等資訊。
# systemctl start docker
# systemctl enable docker
# ps aux |grep docker
# systemctl status docker


透過「docker info」可以查看 Docker 容器環境的運作資訊,條列一下我覺得輸出資訊中比較重要的項目:
  • Server Version: 1.11.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/*」下相關的變化。


接著,我們來練習第 2 個範例為透過 Docker 容器環境執行 Nginx 網頁伺服器。但是在開始之前因為在本文實作環境中,採用「Photon Full」安裝選項所以預設會自動啟動 httpd 服務 (佔用 TCP Port 80),所以把 httpd 調整為預設停用,以避免 Photon OS 重新啟動後佔用 TCP Port 80。
# systemctl disable httpd
# systemctl list-unit-files --type service | grep enabled


確認 Photon OS 停用 httpd 預設啟動的組態設定後,便可以練習第 2 個範例為透過 Docker 容器環境執行 Nginx 網頁伺服器。
# docker run -d -p 80:80 vmwarecna/nginx

Photon OS 預設 Iptables 防火牆規則只允許 TCP Port 22 放行,我們開啟常用的 ICMP 回應 (ping) 以及 TCP Port 80 將其放行。有關 iptables 防火牆的基本操作,請參考站內文章 邁向 RHCE 之路 (Day22) - IPTables 防火牆 文章內容。


請修改「/etc/systemd/scripts/iptables」組態設定檔,開啟 ICMP 回應 (ping) 以及 TCP Port 80 放行 (如下 2 行放行規則)。然後,就可以重新啟動 iptables 服務以便防火牆規則能夠套用生效,再採用「iptables -L」指令確認 ICMP 及允許 TCP Port 80 的防火牆規則已經套用生效。
# vi /etc/systemd/scripts/iptables
  iptables -A INPUT -p icmp -j ACCEPT
  iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# systemctl restart iptables
# systemctl status iptables
# iptables -L


確認 Photon OS 的 iptables 防火牆允許 TCP Port 80 後,便可以開啟瀏覽器確認是否能夠看到 Nginx 網頁伺服器的歡迎頁面。






MeFAQ

Q1. 預設情況下 Photon OS 雖然 sshd 服務有啟動,但不允許 Root 帳號遠端 SSH 登入?

Ans: 請參考 Photon Wiki - FAQ - Why can't I SSH in as root? 文章內容。簡單來說,Photon OS 預設情況下「/etc/ssh/sshd_config」設定檔內容中,預設值為「PermitRootLogin no」所以,不允許 Root 管理帳號可以遠端登入。所以,只要修改為「PermitRootLogin yes」後重新啟動 sshd daemon 即可 (當然,這樣就會多了安全性風險就不在本文討論範圍了。)
# grep PermitRootLogin /etc/ssh/sshd_config
  PermitRootLogin yes
# systemctl restart sshd
# systemctl status sshd




Q2. 運作 nginx 時顯示 Localhost TCP Port 80 已經被使用了?

Ans: 倘若在安裝 Photon OS 時,採用「Photon Full」選項的話,那麼預設就會安裝及啟用 httpd 服務所以 TCP Port 80 就會被佔用。倘若,選擇 Minimal 的話就不會。相關討論串請參考 TCP Port 80 in use | VMware CommunitiesRunning Photon OS on vSphere example iptables issue · Issue #35 · vmware/photon-controller


可以看到預設情況下 Photon OS 已經 Listen tcp6 port 80。
# netstat -na | grep ":80"
tcp6       0      0 :::80                   :::*                    LISTEN


如果,希望是 Listen tcp4 port 80 的話,可以修改「/etc/httpd/httpd.conf」把「Listen 80」改成「Listen 0.0.0.0:80」,然後「systemctl httpd restart」就會變成 IPv4 httpd 了。
# netstat -na | grep ":80"
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN


但是,我們希望把 httpd 調整為預設停用並停止服務,以避免 Photon OS 重新啟動的話會佔用 TCP Port 80。
# systemctl stop httpd
# systemctl disable httpd
# systemctl list-unit-files --type service | grep enabled






參考資源



前言

簡單來說,「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)







參考資源