1. 程式人生 > 其它 >Leetcode 劍指 Offer 19. 正則表示式匹配

Leetcode 劍指 Offer 19. 正則表示式匹配

一、介紹

1、簡介

Docker 是一個開源專案,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘專案。它基於 Google 公司推出的 Go 語言實現。 專案後來加入了 Linux 基金會,遵從了 Apache 2.0 協議,專案程式碼在GitHub上進行維護。

Docker 專案的目標是實現輕量級的作業系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。

在 LXC 的基礎上 Docker 進行了進一步的封裝,讓使用者不需要去關心容器的管理,使得操作更為簡便。使用者操作 Docker 的容器就像操作一個快速輕量級的虛擬機器一樣簡單。

2、變遷

上述圖片比較了 Docker 和傳統虛擬化方式的不同之處,可見容器是在作業系統層面上實現虛擬化,直接複用本地主機的作業系統,而傳統方式則是在硬體層面實現。

3、特點

更快速的交付和部署
對開發和運維(devop)人員來說,最希望的就是一次建立或配置,可以在任意地方正常執行。

開發者可以使用一個標準的映象來構建一套開發容器,開發完成之後,運維人員可以直接使用這個容器來部署程式碼。 Docker 可以快速建立容器,快速迭代應用程式,並讓整個過程全程可見,使團隊中的其他成員更容易理解應用程式是如何建立和工作的。 Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節約開發、測試、部署的時間。

更高效的虛擬化
Docker 容器的執行不需要額外的 hypervisor 支援,它是核心級的虛擬化,因此可以實現更高的效能和效率。

更輕鬆的遷移和擴充套件
Docker 容器幾乎可以在任意的平臺上執行,包括物理機、虛擬機器、公有云、私有云、個人電腦、伺服器等。 這種相容性可以讓使用者把一個應用程式從一個平臺直接遷移到另外一個。

更簡單的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化並且高效的管理。

二、架構

1、映象

Docker 映象是怎麼實現增量的修改和維護的? 每個映象都由很多層次構成,Docker 使用Union FS將這些不同的層結合到一個映象中去。

通常 Union FS 有兩個用途, 一方面可以實現不借助 LVM、RAID 將多個 disk 掛到同一個目錄下,另一個更常用的就是將一個只讀的分支和一個可寫的分支聯合在一起,Live CD 正是基於此方法可以允許在映象不變的基礎上允許使用者在其上進行一些寫操作。 Docker 在 AUFS 上構建的容器也是利用了類似的原理。

(1)映象基礎運用

#獲取映象
docker pull 映象名
#檢視映象
docker images
docker inspect 映象名
#刪除映象
docker rmi 映象名或者映象id

(2)映象製作

  • 利用 docker commit 來建立映象

$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2 4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

其中,-m來指定提交的說明資訊,跟我們使用的版本控制工具一樣;-a可以指定更新的使用者資訊;之後是用來建立映象的容器的 ID;最後指定目標映象的倉庫名和 tag 資訊。建立成功後會返回這個映象的 ID 資訊。

  • 利用 Dockerfile 來建立映象

使用 docker commit 來擴充套件一個映象比較簡單,但是不方便在一個團隊中分享。我們可以使用 docker build 來建立一個新的映象。為此,首先需要建立一個 Dockerfile,包含一些如何建立映象的指令。

#新建一個目錄和一個 Dockerfile
$ mkdir sinatra
$ cd sinatra
$ touch Dockerfile

#Dockerfile 中每一條指令都建立映象的一層,例如:
# This is a comment
FROM ubuntu:14.04
MAINTAINER Docker Newbee <[email protected]>
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra

Dockerfile 基本的語法是:

  使用#來註釋
  FROM 指令告訴 Docker 使用哪個映象作為基礎
  接著是維護者的資訊
  RUN開頭的指令會在建立中執行,比如安裝一個軟體包,在這裡使用 apt-get 來安裝了一些軟體
編寫完成 Dockerfile 後可以使用 docker build 來生成映象。

#開始製作
$ sudo docker build -t="ouruser/sinatra:v2" .

其中-t標記來新增 tag,指定新的映象的使用者資訊。 “.” 是 Dockerfile 所在的路徑(當前目錄),也可以替換為一個具體的 Dockerfile 的路徑。

可以看到 build 程序在執行操作。它要做的第一件事情就是上傳這個 Dockerfile 內容,因為所有的操作都要依據 Dockerfile 來進行。 然後,Dockfile 中的指令被一條一條的執行。每一步都建立了一個新的容器,在容器中執行指令並提交修改(就跟之前介紹過的 docker commit 一樣)。當所有的指令都執行完畢之後,返回了最終的映象 id。所有的中間步驟所產生的容器都被刪除和清理了。

*注意一個映象不能超過 127 層

此外,還可以利用 ADD 命令複製本地檔案到映象;用 EXPOSE 命令來向外部開放埠;用 CMD 命令來描述容器啟動後執行的程式等。例如:

# put my local web site in myApp folder to /var/www
ADD myApp /var/www
# expose httpd port
EXPOSE 80
# the command to run
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

#現在可以利用新建立的映象來啟動一個容器。 $ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash root@8196968dac35:/#
#還可以用 docker tag 命令來修改映象的標籤。 $ sudo docker tag 5db5f8471261 ouruser/sinatra:devel $ sudo docker images ouruser/sinatra REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ouruser/sinatra latest 5db5f8471261
11 hours ago 446.7 MB ouruser/sinatra devel 5db5f8471261 11 hours ago 446.7 MB ouruser/sinatra v2 5db5f8471261 11 hours ago 446.7 MB

(3)映象存出、載入與上傳

  • 載入映象

#比如,先下載了一個 ubuntu-14.04 的映象,之後使用以下命令匯入:
sudo cat ubuntu-14.04-x86_64-minimal.tar.gz  |docker import - ubuntu:14.04

 #可以使用 docker load 從匯出的本地檔案中再匯入到本地映象庫,例如

$ sudo docker load --input ubuntu_14.04.tar

#或者

$ sudo docker load < ubuntu_14.04.tar
#這將匯入映象以及其相關的元資料資訊(包括標籤等)。

  • 存出鏡像

#如果要匯出映象到本地檔案,可以使用 docker save 命令。
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              14.04               c4ff7513909d        5 weeks ago         225.4 MB
...
$sudo docker save -o ubuntu_14.04.tar ubuntu:14.04

  • 上傳映象

#使用者可以通過 docker push 命令,把自己建立的映象上傳到倉庫中來共享。例如,使用者在 Docker Hub 上完成註冊後,可以推送自己的映象到倉庫中。
$ sudo docker push ouruser/sinatra

2、容器

(1)容器基礎運用

#例如,下面的命令輸出一個 “Hello World”,之後終止容器。
$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world

#下面的命令則啟動一個 bash 終端,允許使用者進行互動。
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#
#其中,-t 選項讓Docker分配一個偽終端(pseudo-tty)並繫結到容器的標準輸入上, -i 則讓容器的標準輸入保持開啟。

#刪除容器
docker rm 容器名或者容器id #可以利用 docker start 命令,直接將一個已經終止的容器啟動執行。 docker start 容器名或者容器id #可以利用 docker stop命令,直接將一個已經啟動的容器終止執行。 docker stop 容器名或者容器id
#可以利用 docker restart命令,直接將一個容器重新執行。
docker restart 容器名或者容器id
#檢視容器 docker ps或者docker ps -a
#要獲取容器的輸出資訊,可以通過 docker logs 命令。 $ sudo docker logs 容器名或者容器id

(2)容器進入

在使用 -d 引數時,容器啟動後會進入後臺。 某些時候需要進入容器進行操作,有很多種方法,包括使用 docker attach 命令或 nsenter 工具等。

  • attach 命令

  docker attach容器名或者容器id

  • exec命令

  dockerexec容器名或者容器id

  • nsenter 命令

(3)容器載入和匯出

#如果要匯出本地某個容器,可以使用 docker export 命令。
$ sudo docker export 7691a814370e > ubuntu.tar

#可以使用 docker import 從容器快照檔案中再匯入為映象
$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0

#此外,也可以通過指定 URL 或者某個目錄來匯入,例如
$sudo docker import http://example.com/exampleimage.tgz example/imagerepo

*注:使用者既可以使用 docker load 來匯入映象儲存檔案到本地映象庫,也可以使用 docker import 來匯入一個容器快照到本地映象庫。這兩者的區別在於容器快照檔案將丟棄所有的歷史記錄和元資料資訊(即僅儲存容器當時的快照狀態),而映象儲存檔案將儲存完整記錄,體積也要大。此外,從容器快照檔案匯入時可以重新指定標籤等元資料資訊。

3、庫

(1)Docker Hub

倉庫(Repository)是集中存放映象的地方。

一個容易混淆的概念是註冊伺服器(Registry)。實際上註冊伺服器是管理倉庫的具體伺服器,每個伺服器上可以有多個倉庫,而每個倉庫下面有多個映象。從這方面來說,倉庫可以被認為是一個具體的專案或目錄。例如對於倉庫地址dl.dockerpool.com/ubuntu來說,dl.dockerpool.com是註冊伺服器地址,ubuntu是倉庫名。

大部分時候,並不需要嚴格區分這兩者的概念。

目前 Docker 官方維護了一個公共倉庫Docker Hub,其中已經包括了超過 15,000 的映象。大部分需求,都可以通過在 Docker Hub 中直接下載映象來實現。

  • 登入

可以通過執行docker login命令來輸入使用者名稱、密碼和郵箱來完成註冊和登入。 註冊成功後,本地使用者目錄的.dockercfg中將儲存使用者的認證資訊。

  • 基本操作

使用者無需登入即可通過 docker search 命令來查詢官方倉庫中的映象,並利用 docker pull 命令來將它下載到本地。

(2)私有倉庫

(3)配置檔案

Docker 的 Registry 利用配置檔案提供了一些倉庫的模板(flavor),使用者可以直接使用它們來進行開發或生產部署。

  • 模板

config_sample.yml檔案中,可以看到一些現成的模板段:

  • common:基礎配置
  • local:儲存資料到本地檔案系統
  • s3:儲存資料到 AWS S3 中
  • dev:使用local模板的基本配置
  • test:單元測試使用
  • prod:生產環境配置(基本上跟s3配置類似)
  • gcs:儲存資料到 Google 的雲端儲存
  • swift:儲存資料到 OpenStack Swift 服務
  • glance:儲存資料到 OpenStack Glance 服務,本地檔案系統為後備
  • glance-swift:儲存資料到 OpenStack Glance 服務,Swift 為後備
  • elliptics:儲存資料到 Elliptics key/value 儲存

使用者也可以新增自定義的模版段。

預設情況下使用的模板是dev,要使用某個模板作為預設值,可以新增SETTINGS_FLAVOR到環境變數中,例如:

export SETTINGS_FLAVOR=dev

另外,配置檔案中支援從環境變數中載入值,語法格式為_env:VARIABLENAME[:DEFAULT]

三、部署