前言
簡單來說,「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 環境的測試作業,我採用 Microsoft Azure 建立 FreeBSD 11 虛擬主機。因為本文並非要討論 Microsoft Azure 所以如何建立 FreeBSD 虛擬主機就不多說明了。😁
在 FreeBSD 運作環境中,為了確保可以順利安裝及執行 Docker 容器環境,請確認採用「FreeBSD 11-Current 及後續版本」(簡單來說,就是 2015 年 6 月發行的版本並支援 x86-64 Linux Binaries 即可)。首先,透過「uname -a」指令確認目前採用的 FreeBSD 版本資訊以便符合 Docker 容器環境運作要求,此實作環境採用 FreeBSD 11.0-RELEASE-p7 版本。
接著,執行建立 zpool 及 ZFS dataset on /usr/docker 掛載的動作
了解後,請執行下列指令以便建立 Docker 容器環境。
因此,執行指令完畢後請先修改「/etc/fstab」檔案內容,加上「fdesc /dev/fd fdescfs rw 0 0」,以便 FreeBSD 主機重新啟動後能夠自動掛載 zfs 相關路徑。
後續,當 FreeBSD 重新啟動後,仍會自動掛載相關掛載點 (/dev/fd, /usr/docker, /zroot)。
接著,修改「/etc/rc.conf」設定檔內容,以便 FreeBSD 主機重新啟動後能夠自動啟動 Docker daemon 及 zfs 服務。
然後,就可以透過「service docker start」指令啟動 Docker 服務,我們仍可以透過傳統的「ps aux |grep docker」來確認目前 Docker Daemon 的執行狀態、PID……等資訊,或使用「service docker status」來確認 Docker Daemon 是否啟動。
接著,使用「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)
Docker 簡介
什麼是 Docker
為什麼要使用 Docker?
Docker 基本概念
映像檔 (Image)
容器 (Container)
倉庫 (Repository)
Docker 底層技術
基本架構
命名空間 (NameSpaces)
控制組 (Control Groups)
Union 檔案系統 (Union File Systems)
容器格式
網路
那麼 2017 年的新年新希望,就讓我們開始從玩 Docker 開始吧,以下是其它的一些重點摘要:
- 在開始玩 Docker Lab 之前,建議註冊 Docker Hub、GitHub 等帳號以便後續實作。
- 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)