12
PART I Docker 入門 1 認識 Docker 2 Docker 的基本概念和安裝 3 映像檔(Image4 容器(Container5 倉庫(Repository6 資料管理 7 網路基礎配置 8 使用 Dockerle 建立映像檔 歡迎來到 Docker 的世界! 本篇將介紹 Docker 的基礎知識,內容共有 8 章。第 1 章介紹 Docker 開源專 案以及它與現有的虛擬化技術,特別是 Linux 容器技術的關係;第 2 章介紹 Docker 的三大基本概念,以及如何在常見的作業系統環境中安裝 Docker3 章到第 5 章透過具體的實際操作講解 Docker 的常用命令;第 6 章解說如何 Docker 中使用 volume 來保留資料;第 7 章介紹如何使用容器網路,特別是 讓容器與外部網路和其他容器溝通;第 8 章介紹如何撰寫 Dockerle,以及使用 Dockerle 這佈署文件來建立映像檔的操作方法和注意事項。

Docker入門 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACA020700.pdf · 48 Part I‧Docker 入門 ... ansible/centos7-ansible Ansible on Centos7 34 [OK] tutum/centos Centos image

  • Upload
    vunhu

  • View
    240

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Docker入門 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACA020700.pdf · 48 Part I‧Docker 入門 ... ansible/centos7-ansible Ansible on Centos7 34 [OK] tutum/centos Centos image

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這佈署文件來建立映像檔的操作方法和注意事項。

Page 2: Docker入門 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACA020700.pdf · 48 Part I‧Docker 入門 ... ansible/centos7-ansible Ansible on Centos7 34 [OK] tutum/centos Centos image

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公司的一個內部專案。

Page 3: Docker入門 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACA020700.pdf · 48 Part I‧Docker 入門 ... ansible/centos7-ansible Ansible on Centos7 34 [OK] tutum/centos Centos image

11Chapter 1‧ 認識 Docker

 1-1a:傳統虛擬化方式

 1-1b:Docker虛擬化方式

圖 1-1 Docker和傳統虛擬機器方式的不同之處

傳統方式是在硬體層面實現虛擬化,需要有額外的虛擬機器管理軟體和虛擬機

器作業系統層。Docker容器是在作業系統層上實現虛擬化,直接使用本機的作

業系統(Host OS),因此更加輕量化。

1.4 小結

透過本章的介紹,相信您已經對 Docker技術有了初步的認識,並為它帶來的諸

多優勢所深深吸引。透過替 Linux容器技術提供更簡便的使用和管理方式、更

有效率的版本控管機制,Docker讓容器技術一下子變得前所未有的方便易用。

筆者相信,隨著雲端計算技術的持續發展,以 Docker技術為代表的容器虛擬化

技術,必定在整個虛擬化領域占有一席之地。

Page 4: Docker入門 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACA020700.pdf · 48 Part I‧Docker 入門 ... ansible/centos7-ansible Ansible on Centos7 34 [OK] tutum/centos Centos image

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

Page 5: Docker入門 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACA020700.pdf · 48 Part I‧Docker 入門 ... ansible/centos7-ansible Ansible on Centos7 34 [OK] tutum/centos Centos image

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

Page 6: Docker入門 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACA020700.pdf · 48 Part I‧Docker 入門 ... ansible/centos7-ansible Ansible on Centos7 34 [OK] tutum/centos Centos image

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檔案將保存使用者的認證

資訊。

Page 7: Docker入門 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACA020700.pdf · 48 Part I‧Docker 入門 ... ansible/centos7-ansible Ansible on Centos7 34 [OK] tutum/centos Centos image

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公司建立、驗

證、支援、提供。這樣的映像檔往往只使用軟體名稱作為名字。

Page 8: Docker入門 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACA020700.pdf · 48 Part I‧Docker 入門 ... ansible/centos7-ansible Ansible on Centos7 34 [OK] tutum/centos Centos image

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/

Page 9: Docker入門 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACA020700.pdf · 48 Part I‧Docker 入門 ... ansible/centos7-ansible Ansible on Centos7 34 [OK] tutum/centos Centos image

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]

Page 10: Docker入門 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACA020700.pdf · 48 Part I‧Docker 入門 ... ansible/centos7-ansible Ansible on Centos7 34 [OK] tutum/centos Centos image

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將這個容器轉變成一個映像檔,最

Page 11: Docker入門 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACA020700.pdf · 48 Part I‧Docker 入門 ... ansible/centos7-ansible Ansible on Centos7 34 [OK] tutum/centos Centos image

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

Page 12: Docker入門 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACA020700.pdf · 48 Part I‧Docker 入門 ... ansible/centos7-ansible Ansible on Centos7 34 [OK] tutum/centos Centos image

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