Upload
vunhu
View
240
Download
3
Embed Size (px)
Citation preview
1
P A R T I
Docker 入門
第 1章 認識 Docker
第 2章 Docker的基本概念和安裝
第 3章 映像檔(Image)
第 4章 容器(Container)
第 5章 倉庫(Repository)
第 6章 資料管理
第 7章 網路基礎配置
第 8章 使用 Docker le建立映像檔
歡迎來到 Docker的世界!
本篇將介紹 Docker的基礎知識,內容共有 8章。第 1章介紹 Docker開源專
案以及它與現有的虛擬化技術,特別是 Linux容器技術的關係;第 2章介紹
Docker的三大基本概念,以及如何在常見的作業系統環境中安裝 Docker;
第 3章到第 5章透過具體的實際操作講解 Docker的常用命令;第 6章解說如何
在 Docker中使用 volume 來保留資料;第 7章介紹如何使用容器網路,特別是
讓容器與外部網路和其他容器溝通;第 8章介紹如何撰寫 Docker le,以及使用
Docker le這佈署文件來建立映像檔的操作方法和注意事項。
1 C H A P T E R 1
認識 Docker
如果說個人主機時代大家比較的關鍵是 CPU時脈的高低和記憶體的大小,那麼
在雲端時代,虛擬化技術無疑是整座資料中心(Data Center)最關鍵的核心。
伴隨著大數據技術產業的發展,虛擬化技術已經應用到各種關鍵情境中。從最
早 1960年代 IBM推出的大型主機(MainFrame z/OS)虛擬化到後來 x86平台
上的虛擬化,虛擬化技術自身也在不斷演化和革新。
虛擬化既可透過硬體模擬來實現,也可以透過操作系統來實現。而近幾年出現
的容器式虛擬化方式,更是充分利用了操作系統本身已有的機制和特性 ,得以
實現輕量級的虛擬化,甚至有人把它稱為新一代的虛擬化技術。Docker 毫無疑
問就是其中的佼佼者。
那麼,什麼是 Docker?它會帶來什麼好處?它跟現有虛擬化技術又有何關係
呢?本章在介紹 Docker專案的起源和發展之後,會解釋 Docker和 Linux容器
技術(Linux Container - LXC)的密切關聯,以及在開發和維運中使用 Docker
的具體優勢。最後,還會闡述 Docker在整個虛擬化領域中的定位。
1.1 什麼是 Docker
Docker開源項目
Docker是基於 Go語言實現的雲端技術開源專案,誕生於 2013年初,最初發
起是提供 PaaS(Platform as a Service)服務 dotCloud公司的一個內部專案。
11Chapter 1‧ 認識 Docker
1-1a:傳統虛擬化方式
1-1b:Docker虛擬化方式
圖 1-1 Docker和傳統虛擬機器方式的不同之處
傳統方式是在硬體層面實現虛擬化,需要有額外的虛擬機器管理軟體和虛擬機
器作業系統層。Docker容器是在作業系統層上實現虛擬化,直接使用本機的作
業系統(Host OS),因此更加輕量化。
1.4 小結
透過本章的介紹,相信您已經對 Docker技術有了初步的認識,並為它帶來的諸
多優勢所深深吸引。透過替 Linux容器技術提供更簡便的使用和管理方式、更
有效率的版本控管機制,Docker讓容器技術一下子變得前所未有的方便易用。
筆者相信,隨著雲端計算技術的持續發展,以 Docker技術為代表的容器虛擬化
技術,必定在整個虛擬化領域占有一席之地。
21Chapter 2‧ Docker的基本概念和安裝
2.3 本書環境介紹
本書的操作環境是一台裝有 Linux Mint 17的筆記型電腦,並使用虛擬機器軟體
VirtualBox虛擬了一套 Ubuntu 14.04系統,兩套系統上都安裝了 Docker的 1.3
版本,虛擬機器透過 VirturBox網路的 NAT方式連接到外部,如圖 2-5所示。
圖 2-5 本機環境
其中,Ubuntu 14.04 虛擬機將是主要的操作環境(自動取得的 IP位址為
10.0.2.15/24),而筆記本上裝的 Linux Mint環境(內網位址為 10.0.2.2/24,外
網位址為 192.168.1.0/24網段位址)將作為本機私有倉庫的伺服器,示範跟倉
庫相關的操作。
讀者可根據自己本機環境,嘗試建構類似的環境。
Docker容器
Docker容器
docker
docker
私有倉庫Ubuntu 14.04虛擬機10.0.2.15
VirtualBox
4 C H A P T E R 4
容器
容器(Container)是 Docker的另一個關鍵概念。
簡單地說,容器是映像檔的一個執行實例(Instance),所不同的是,它帶有額
外的可寫層。
如果認為虛擬機可以理解為模擬執行的一整套作業系統(提供了執行必要環境
和其他系統環境)和跑在上面的應用程式。那麼 Docker容器就是獨立執行的一
個或一組應用,以及它們必需的執行環境。
本章將介紹容器相關的重要操作,包括建立一個容器、啟動容器、終止一個容
器、進入容器內執行操作、刪除容器和透過匯入匯出容器來實現容器搬遷等。
4.1 建立容器
Docker的容器十分輕量,使用者可以隨時建立或刪除容器。
建立容器
可以使用 docker create指令新建一個容器,例如:
$ sudo docker create -it ubuntu:latest
7a0c26f96889de46b6276608501b7e8f99e4e31e42ec4a288a1f8e7644316637
$sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a0c26f96889 ubuntu:latest "/bin/bash" 6 seconds ago stoic_albattani
5 C H A P T E R 5
倉庫
倉庫(Repository)是集中存放映像檔的地方。
另一個容易與其混淆的概念是註冊伺服器(Registry)。實際上註冊伺服器是存
放倉庫的具體伺服器,每個伺服器上可以有多個倉庫,而每個倉庫下面有多個
映像檔。從這方面來說,倉庫可以被認為是一個具體的專案或目錄。例如對於
倉庫位址 dl.dockerpool.com/ubuntu來說,dl.dockerpool.com是註冊伺服器位址,
ubuntu是倉庫名稱。
倉庫又分公開倉庫和私有倉庫,在本章,將分別示範如何使用 Docker Hub官方
倉庫進行登錄、下載等基本操作,以及使用 DockerPool社群提供的倉庫下載映
像檔;最後還將介紹建構和使用私有倉庫的基本操作。
5.1 Docker Hub
目前 Docker官方維護了一個公開倉庫 https://hub.docker.com,其中已經包括
15000多個的映像檔。大部分需要的軟體都可以透過在 Docker Hub中直接下載
映像檔來執行,如圖 5-1所示。
登入
可以透過執行 docker login命令來輸入使用者名、密碼和 Email來完成註冊和登
錄。註冊成功後,本機上使用者目錄中的 .dockercfg檔案將保存使用者的認證
資訊。
Part I‧Docker入門48
基本操作
使用者無需登入即可透過 docker search命令來查找官方倉庫中的映像檔,並利
用 docker pull命令將其下載到本機上。
圖 5-1 Docker Hub
在搜尋映像檔的章節,已經具體介紹了如何使用 docker pull指令。例如以
centos為關鍵字進行搜尋:
$ sudo docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 865 [OK]
ansible/centos7-ansible Ansible on Centos7 34 [OK]
tutum/centos Centos image with SSH access. For the root... 13 [OK]
jdeathe/centos-ssh-apache-php CentOS-6 6.5 x86_64 / Apache / PHP / PHP m... 8 [OK]
blalor/centos Bare-bones base CentOS 6.5 image 8 [OK]
...
根據是否為官方提供,可將這些映像檔資源分為兩類。一種是類似 centos這樣
的基礎映像檔,稱為基礎或 root映像檔。這些映像檔是由 Docker公司建立、驗
證、支援、提供。這樣的映像檔往往只使用軟體名稱作為名字。
7 C H A P T E R 7
網路基礎配置
大型的 Internet應用服務通常包括多個運作元件,這往往需要多個容器之間透
過網路溝通進行協同運作。
Docker目前提供了對映容器連接埠到 HOST主機和容器互連機制來為容器提供
網路服務。
本章將講解如何使用 Docker的網路功能 1。包括使用連接埠對映機制來將容器
內應用服務提供給外部網路,以及透過容器連結系統讓多個容器之間進行便利
的網路溝通。
7.1 對映連接埠來存取容器
從外部存取容器應用程式
啟動容器時,如果不指定連接埠對映參數,容器外部就無法透過網路來存取容
器內的各項網路應用和服務。
當在容器內執行一些網路應用程式,要讓外部存取這些服務時,可以透過 -P
或 -p參數來指定連接埠對映。當只使用 -P標記時,Docker會隨機對映一個
49000∼ 49900範圍的連接埠到容器內部開放的所有連接埠:
1 Linking Containers Together:https://docs.docker.com/userguide/dockerlinks/
Part II‧實戰案例88
9.3 CentOS/Fedora
CentOS和 Fedora都是基於 Redhat的 Linux發行版本。前者以相容 Redhat軟體
而聞名,CentOS是企業級伺服器的常用選項;後者則主要專注在個人使用者。
搜尋 CentOS
$ sudo docker search -s 2 centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 542 [OK]
tianon/centos CentOS 5 and 6 created using rinse instea... 28
ansible/centos7-ansible Ansible on Centos7 13 [OK]
blalor/centos Bare-bones base CentOS 6.5 image 7 [OK]
saltstack/centos-6-minimal 7 [OK]
steeef/graphite-centos CentOS 6.x with Graphite and Carbon via ng... 6 [OK]
ariya/centos6-teamcity-server TeamCity Server 8.1 on CentOS 6 6 [OK]
tutum/centos-6.4 DEPRECATED. Use tutum/centos:6.4 instead. ... 5 [OK]
tutum/centos Centos image with SSH access. For the root... 5 [OK]
對最新的 CentOS7感興趣的讀者,只需一個命令,就可以在 Docker中體驗
CentOS7的魅力了。
搜尋 Fedora
首先,改用 docker search命令來搜尋星評至少為 2的 fedora相關映像檔,結果
如下:
$ sudo docker search -s 2 fedora
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
fedora (Semi) Official Fedora base image. 84 [OK]
mattdm/fedora A basic Fedora image corresponding roughly... 51
fedora/apache 27 [OK]
fedora/couchdb 22 [OK]
fedora/mariadb 22 [OK]
fedora/redis 19 [OK]
fedora/nginx 19 [OK]
fedora/python 18 [OK]
fedora/qpid 18 [OK]
Part II‧實戰案例134
圖 11-4 典型的 Weblogic部署
筆者推薦將應用程式安裝在 administration server上面,需要擴增(scaling)的
時候,啟動多個 administration server節點即可,將 administration server當作
Manged server使用。這樣做的優點和缺點和傳統的部署方法恰好相反。
使用 docker commit + Docker le方式建立映像檔
以 下 將 以 Weblogic 12.11、jdk 1.6、Ubuntu14.04 為 例 子, 建 立 一 個 帶 有
Weblogic服務的映像檔。
1. 準備工作
由於Weblogic的安裝、部署方式較為複雜,筆者將先透過 docker run -ti進入容
器完成大部分操作,然後透過 docker commit將這個容器轉變成一個映像檔,最
1 3 C H A P T E R 1 3
程式語言
本章主要介紹如何使用 Docker快速部署常見程式語言的開發環境及其常用框
架,包括 C、C++、Java、PHP、Python、Perl、Ruby、JavaScript、Ruby等。其
中,筆者將重心放在介紹常用Web程式語言 PHP的 Docker使用。
13.1 PHP
13.1.1 PHP Stack
PHP1是一種廣泛使用的動態指令碼語言,尤其適用於各種Web方案。由於 PHP
易於入門,易於維護的特性,它被大量地用於快速Web開發。即使隨著網站
PV(訪問量)/UV(單一訪客)的增長,需要支援更大的並行處理時,基於原
有 PHP系統進行分層最佳化和業務整合也是相對容易的。PHP的哲學是 quick
and dirty(快速有效為先),任何對開發速度、靈活性甚至營運成本有要求的創
業團隊,可以大膽地選擇 PHP。
接下來,將主要解說 PHP語言的 Docker環境,並簡述 PHP常用 MVC框架的
Docker環境。
1 PHP官網:http://php.net
175Chapter 13‧ 程式語言
1. 在 PHP專案的根目錄中新增一個 Docker le,並使用 Docker Hub官方的基
礎映像檔:
FROM php:5.6-apache
COPY src/ /var/www/html/
src/是包含所有 PHP程式碼的目錄。
2. 使用此 Docker le建構自訂映像檔:
$ sudo docker build -t my-php-app .
3. 建立並執行此映像檔:
$ sudo docker run -it --rm --name my-running-app my-php-app
筆者建議加入一個自訂的 php.ini設定檔,將其拷貝到 /usr/local/lib。這樣就可
以對 PHP環境做更多的設定優化,如開啟某些 PHP外掛程式,或者對 PHP解
譯器進行一些安全和性能相關的調整。
增加方法很簡單:
FROM php:5.6-apache
COPY config/php.ini /usr/local/lib/
COPY src/ /var/www/html/
src/是目前存放 PHP程式碼的資料夾, config/資料夾
包含 php.ini檔。No t e
如果您希望直接使用 Docker Hub官方映像檔執行 PHP專案,可以執行:
$ sudo docker run -it --rm --name my-apache-php-app -v "$(pwd)":/var/www/html php:5.6-
apache