Docker學習1
- 1 Docker概述
-
- 1.1 虛拟化技術發展史
- 1.2 虛拟化技術是什麼
- 1.3 虛拟化技術分類
- 1.4 虛拟化技術優缺點
- 1.5 容器技術的發展
- 1.6 Docker的發展曆史
- 1.7 Docker是什麼
- 1.8 容器和虛拟機的差別
- 1.9 為什麼使用Docker
- 2 Docker環境的搭建
-
- 2.1 Docker的版本
- 2.2 Docker的安裝
- 2.3 Docker 服務啟動
- 2.4 Docker服務資訊
- 2.5 Docker 使用初體驗
-
- 2.5.1 Docker 的運作機制
- 2.5.2 第一個Docker 容器
- 2.5.3 進入Docker容器
- 2.5.4 客戶機通路容器
- 3 Docker核心元件
-
- 3.1 Docker架構
- 3.2 Docker核心要素
- 3.3 鏡像
-
- 3.3.1 鏡像的基本概念
- 3.3.2 鏡像的組成結構
- 3.3.3 鏡像的日常操作
- 3.4 容器
-
- 3.4.1 容器的基本概念
- 3.4.2 容器的日常操作
- 3.5 倉庫
-
- 3.5.1 倉庫的基本概念
- 3.5.2 倉庫的日常操作
1 Docker概述
1.1 虛拟化技術發展史
在虛拟化技術出現之前,如果我們想搭建一台伺服器,我們需要做如
下的工作:
1、購買一台硬體伺服器;
2、在硬體伺服器上安裝配置作業系統系統;
3、在作業系統之上配置應用運作環境;
4、部署并運作應用;
這種方式的缺點就是:部署應用非常慢;需要花費的成本非常高(時間成本、伺服器成本);應用遷移麻煩;要将應用遷移,又得重複部署應用的過程:購買伺服器 -> 安裝作業系統 OS -> 配置運作環境 -> 部署應用是以,為了解決這個問題,後續出現了虛拟化技術。
1.2 虛拟化技術是什麼
虛拟化(英語:Virtualization)是一種計算機資源管理技術,是将計算機的各種硬體資源,比如伺服器、網絡、CPU、記憶體及存儲等,予以抽象和轉換後呈現出一套新的硬體資源環境,在這一套新的硬體環境下可以安裝我們的作業系統,部署我們的應用運作環境等,它打破計算機硬體資源不可切割的障礙,使我們可以比原本的計算機硬體資源結構更好的方式來組合應用這些資源。
1.3 虛拟化技術分類
虛拟化一般分為:
硬體級虛拟化(hardware-level-virtualization)
作業系統級虛拟化(os-level-virtualization)
硬體級虛拟化 是運作在硬體之上的虛拟化技術,它的核心技術是Hypervisor 發音 [,haipə’vaizə],Hypervisor 是一種運作在基礎實體伺服器硬體之上的軟體層,可以虛拟化硬體資源,例如 cpu、硬碟、記憶體資源等。然後我們可以通過在虛拟化出來的資源之上安裝作業系統,這也就是所謂的虛拟機。像 VMWare, VirtualBox 等都是使用該技術,我們經常使用的桌面版的虛拟機 VMWare 就是采用這種虛拟化技術。如下圖所示:
通過 Hypervisor 層,我們可以建立不同的虛拟機,并且每個虛拟機都是分離、獨立的,這樣一來,我們就可以在一台硬體伺服器和本地作業系統之上虛拟化出多個伺服器,用來部署我們的應用;
1.4 虛拟化技術優缺點
虛拟化技術的優點:
一台實體伺服器可以虛拟化出多個虛拟的伺服器,讓計算機資源得以充分利用;
虛拟化技術的缺點:
1、每建立一個虛拟機的時候,都會建立一個作業系統,這個作業系統會占用很多資源,這樣無疑大大的增加了資源的消耗,當安裝的虛拟機越多,資源消耗就越多。
2、環境相容性問題,開發時的環境運作正常,部署到虛拟機環境測試則有可能發生錯誤;
1.5 容器技術的發展
基于硬體級虛拟化技術的缺點和不足,後續又發展出來了另一種虛拟化技術,即作業系統級虛拟化技術;作業系統級虛拟化 是運作在作業系統之上的虛拟化技術,它模拟的是運作在一個作業系統上的多個不同程序,并将其封裝在一個密閉的容器裡面,該技術也稱為容器化技術。在容器化技術領域,Docker 是目前最流行的一種實作。Docker 釋出于 2013 年,Docker 基于 LXC 技術,LXC 是 Linux 平台上的容器化技術實作。
注:LXC 是 Linux Container 的簡寫,它是一種核心虛拟化技術,可以提供輕量級的虛拟化,以便隔離程序和資源,它與主控端使用同一個核心,性能損耗小,這種技術是 Linux 提供的,但是直到 Docker出世,該技術才被發揮出來。
1.6 Docker的發展曆史
2010 年,幾個年輕人在舊金山成立了一家做 PaaS(Platform as a Service平台及服務)平台的創業公司,起名為 dotCloud,并且還獲得了創業孵化器 Y Combinator 的支援,雖然 dotCloud 期間獲得過一些融資,但随着 IT 巨頭(微軟、谷歌、亞馬遜等)也殺入 PaaS 平台,dotCloud舉步維艱。
2013 年,dotCloud 的創始人,28 歲的 Solomon Hykes 做了一個艱難的決定:将 dotCloud 的核心引擎開源,這項核心引擎技術能夠将 Linux容器中的應用代碼打包,輕松的在伺服器之間遷移。然而這個基于 LXC(Linux Container)技術的核心管理引擎開源後, 讓全世界的技術人員感到驚豔,感歎這一切太友善了……。也正是dotCloud 的創始人這個艱難的孤注一擲的決定讓所有的 IT 巨頭們也為之一顫。
Docker 創始人 Solomon Hykes (Docker 之父)
從 2013 年 Docker 開源開始,Docker 技術風靡全球,于是 dotCloud公司決定将 Docker 作為主要業務進行發展,并把公司改名為 DockerInc,全身心投入到 Docker 的開發中,并于 2014 年 8 月,Docker 宣布把 PaaS(Platform as a Service,平台及服務)業務 dotCloud 出售給位于德國柏林的同樣專注于平台即服務業務的提供商 cloudControl,從此 Docker 可以輕裝上陣,專注于 Docker 的研發。
從 2013 年 2 月決定開源,到 2013 年 3 月 20 日釋出 Docker 0.1,隻用了一個月時間。目前 Docker 的最新版本是 18.03;Docker 迅速成長,在 2014 年 6 月 9 日,Docke 團隊宣布釋出 Docker1.0,1.0 版本标志着 Docker 平台已經足夠成熟,并可以被應用到生産産品中(還提供了一些需要付費的支援選項)。
一年的時間,使一個圍繞着 Docker 的小型初創企業生态體系逐漸形成,Docker 先後赢得了 Google、 微軟、Amazon、VMware 等 IT 巨頭的青睐,他們紛紛表示将保證自己平台與 Docker 容器技術的相容性。
2016 年 2 月 29 日,CloudControl 公司在其官方部落格中宣告即将破産,隸屬于 cloudControl 公司的 dotCloud 也宣布将于 2 月 29 日關閉服務。作為 Docker 的前身,DotCloud 目睹 Docker 的成長,成為雲平台的一顆新星,而自己卻力不從心,Docker 的繁榮間接地導緻 Docker 的前身 dotCloud 在 PaaS 平台的衰敗,興衰成敗,令人唏噓不已,這也許是颠覆式創新的經典案例。
1.7 Docker是什麼
1、Docker 是一個開源的應用容器引擎,它基于 Google 公司推出的Go 語言實作,項目代碼托管在 GitHub 上進行維護;https://github.com/docker/docker-ce
2、Docker 技術讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,打包好的容器可以釋出到任何流行的 Linux 伺服器上運 行,這樣就可以解決開發環境與運維環境不一緻的問題了,是以容器技術解決了開發和運維之間的沖突,讓開發專注于開發,運維專注于運維,不要被環境問題所打擾;
3、Docker 徹底釋放了虛拟化的威力,極大降低了計算機資源供應的成本,Docker 重新定義了程式開發測試、傳遞和部署過程,Docker 提出了“建構一次,到處運作”的理念,讓應用的開發、測試、部署和分發都變得前所未有的高效和輕松!
4、Docker 是一種輕量級的作業系統虛拟化解決方案,Docker 的基礎是 Linux 容器(LXC)技術,在 LXC 的基礎上 Docker 進行了進一步的封裝,讓使用者不需要去關心容器的管理,使得操作更為簡便。使用者操作 Docker 的容器就像操作一個快速輕量級的虛拟機一樣簡單;Docker 自開源後受到廣泛的關注,Docker 最早是基于 Ubuntu 開發的,但後續 CentOS、Debian、Fedora 等主流的 Linux 作業系統都支援 Docker。
總結:簡單地說,Docker 是對軟體和其依賴環境的标準化打包,應用之間互相隔離,共享一個 OS Kernel(解決了資源浪費的問題),可以運作在很多主流作業系統上;但是也需要澄清一下,Docker 本身不是容器,Docker 隻是管理容器引擎。
1.8 容器和虛拟機的差別
容器是将代碼和環境的關系打包在一起的一個集合,而虛拟機是在實體層面上,分出來的一個作業系統;
多個容器可以運作在同一台實體伺服器上,并共享一個作業系統的核心資源。多個虛拟機也可以運作在同一台機器上,但每個虛拟機都需要一個完整的作業系統;下圖比較了 Docker 和傳統虛拟化方式的不同之處:
特性 | 容器 | 虛拟機 |
---|---|---|
啟動 | 秒級 | 分鐘級 |
硬碟空間 | 一般為幾十MB | 一般為10GB |
性能 | 接近原生 | 弱于原生 |
系統支援量 | 單機支援上千個容器 | 一般幾十個 |
作業系統 | 與主控端共享OS | 宿機OS上運作虛拟機OS |
1.9 為什麼使用Docker
作為一種新興的虛拟化技術,Docker 跟傳統的虛拟化方式相比具有衆多的優勢。
1、Docker 容器的啟動可以在秒級實作,這相比傳統的虛拟機方式要快得多。
2、Docker 對系統資源的使用率很高,一台主機上可以同時運作數千個 Docker 容器。
3、容器除了運作其中的應用外,基本不消耗額外的系統資源,使得應用的性能很高。傳統虛拟機方式運作 10 個完全不同的應用可能我們會起 10 個虛拟機來部署,而Docker 隻需要啟動 10 個隔離的應用即可。
4、Docker 可以更快速的傳遞和部署,大量地節約開發、測試、部署的時間,對開發和運維人員來說,最希望的就是一次建立或配置,可以在任意地方正常運作。
5、更高效的虛拟化,Docker 容器的運作不需要額外的 hypervisor 支援,它是核心級的虛拟化,是以可以實作更高的性能和效率。
6、更輕松的遷移和擴充,Docker 容器幾乎可以在任意的平台上運作,包括實體機、虛拟機、公有雲、私有雲、個人電腦、伺服器等,這種相容性可以讓使用者輕松地把一個應用程式從一個平台直接遷移到另一個平台。
2 Docker環境的搭建
2.1 Docker的版本
Docker 從 2013 年 3 月 20 日釋出 Docker 0.1,到現在已經釋出了多個版本,從 2017 年 3 月開始 docker 在原來的基礎上分為兩個分支版本: Docker CE 和 Docker EE。Docker CE 即社群免費版,可永久免費使用;Docker EE 即企業版,功能更全,更強調安全,但需付費使用;這裡介紹 Docker CE 版本,目前 Docker 版本為 18.03Docker 官方網站:https://www.docker.com/
2.2 Docker的安裝
首先, Docker 并不是容器,它是一個管理容器的引擎。采用Linux 版本是 CentOS 7,Docker 也更推薦在 Linux 環境下使用;Docker 支援 CentOS 6 及以後的版本;CentOS7 系統可以直接通過 yum 進行安裝:安裝前可以檢視一下系統是否已經安裝了 Docker:
yum list installed | grep docker
安裝:
yum install docker -y
安裝後,使用 docker –version(docker version,docker -v)檢視 docker是否安裝成功,解除安裝:
yum remove docker.x86_64 -y
yum remove docker-client.x86_64 -y
yum remove docker-common.x86_64 -y
2.3 Docker 服務啟動
安裝之後啟動 Docker 服務;
啟動:systemctl start docker 或者 service docker start
停止:systemctl stop docker 或者 service docker stop
重新開機:systemctl restart docker 或者 service docker restart
檢查 docker 程序的運作狀态:
systemctl status docker 或者 service docker status
檢視 docker 程序:
ps -ef | grep docker
2.4 Docker服務資訊
檢視 docker 系統資訊
docker info
檢視所有的幫助資訊
docker commond –help
2.5 Docker 使用初體驗
2.5.1 Docker 的運作機制
Docker 并不是容器,而隻是一個管理容器的引擎;Docker 的底層運作原理:Docker 服務啟動–>下載下傳鏡像–>啟動該鏡像得到一個容器–>容器裡運作着我們想要的程式;
2.5.2 第一個Docker 容器
根據 Docker 的運作機制,我們将按照如下步驟運作第一個 Docker 容器;
1、将 Docker 服務啟動
2、下載下傳一個鏡像,Docker 運作一個容器前需要本地存在有對應的鏡像,如果鏡像不存在本地,Docker 會從鏡像倉庫下載下傳(預設是 Docker Hub 公共注冊伺服器中的倉庫 https://hub.docker.com)。 CentOS 下怎麼下載下傳(pull)鏡像?
從 docker hub 官網搜尋要使用的鏡像,也可以在指令行使用指令搜尋要使用的鏡像,比如 docker search tomcat 進行搜尋,然後下載下傳所需要的鏡像:
下載下傳鏡像:
docker pull tomcat
運作鏡像:
docker run tomcat
前台運作, 要背景運作,加參數 -d
docker run -d tomcat
檢視本地已安裝鏡像
docker images
在列出資訊中,可以看到幾個字段資訊
清單 | 描述 |
---|---|
REPOSITORY | 來自于哪個倉庫,比如 docker.io/tomcat |
TAG | 鏡像的标記,比如 latest |
IMAGE ID | 鏡像的 ID 号(唯一) |
CREATED | 建立時間 |
SIZE | 鏡像大小 |
3、啟動下載下傳下來的鏡像得到一個容器:
docker run -d -p 8080:8080 tomcat
-p表示将Linux的8080端口映射到Docker的8080端口
4、通過 ps -ef | grep tomcat 檢視,檢查 tomcat 鏡像是否啟動容器成功;
2.5.3 進入Docker容器
列出docker運作的所有容器
docker ps
進入容器:
其中 i 表示互動式的,也就是保持标準輸入流打開;t 表示虛拟控制台,配置設定到一個虛拟控制台;
退出容器
exit
2.5.4 客戶機通路容器
從客戶機上通路容器,需要有端口映射,docker 容器預設采用橋接模式與主控端通信,需要将主控端的 ip 端口映射到容器的 ip 端口上
停止容器:
docker stop 容器 ID/名稱
啟動容器:
docker run -d -p 8080:8080 docker.io/tomcat 或者 41a54fe1f79d(鏡像id)
3 Docker核心元件
3.1 Docker架構
Docker 使用用戶端-伺服器 (C/S) 架構模式,使用遠端 API 來管理和建立 Docker 容器。
Docker 容器通過 Docker 鏡像來建立。鏡像與容器的關系類似于面向對象程式設計中的類與對象的關系。
Docker | 面向對象 |
---|---|
鏡像 | 類 |
容器 | 對象 |
3.2 Docker核心要素
Docker 包括三個核心要素 鏡像(Image)、容器(Container)、倉庫(Repository)了解了這三個概念,就了解了 Docker 的整個生命周期。Docker 的運作離不開以上核心幾個元件的支援,Docker 的成功也是拜這幾個元件所賜。可能會誤以為,Docker 就是容器,但 Docker 不是容器,而是管理容器的引擎。
3.3 鏡像
3.3.1 鏡像的基本概念
Docker 鏡像就是一個隻讀的模闆,可以用來建立 Docker 容器。例如:一個鏡像可以包含一個完整的 centos 作業系統環境,裡面僅安裝了 mysql 或使用者需要的其它應用程式。Docker 提供了一個非常簡單的機制來建立鏡像或者更新現有的鏡像,使用者甚至可以直接從其他人那裡下載下傳一個已經做好的鏡像來直接使用。
3.3.2 鏡像的組成結構
鏡像是由許多層的檔案系統疊加構成的,最下面是一個引導檔案系統bootfs,第二層是一個 root 檔案系統 rootfs,root 檔案系統通常是某種作業系統,比如 centos、Ubuntu,在 root 檔案系統之上又有很多
層檔案系統,這些檔案系統疊加在一起,構成 docker 中的鏡像;
3.3.3 鏡像的日常操作
1、下載下傳鏡像,比如下載下傳 redis 鏡像:
docker pull redis:latest
reids 是查詢到的鏡像名稱,latest 是鏡像的标簽 tag .擷取一個鏡像有兩種方式,一種是從官方鏡像倉庫下載下傳,一種是自己通過 Dockerfile 檔案建構。如果有官方鏡像,我們就不必自己用 Dockerfile 檔案建構了,除非官 方沒有才會自己去 Dockerfile 檔案建構;
2、列出已經下載下傳的鏡像:
docker images,或者 docker images redis
3、運作鏡像:其中-d 表示在背景運作
docker run -d redis
然後通過 ps -ef | grep redis 可以查到 redis 程序
4、檢視容器鏡像的狀态:
docker ps
5、進入容器:
docker exec -it a8584016f9b6(容器 ID) bash 進入 redis 容器
5、删除鏡像:
docker rmi redis:latest
注意是 rmi,不是 rm,rm 是删除容器;
3.4 容器
3.4.1 容器的基本概念
容器是從鏡像建立的運作執行個體。它可以被啟動、停止、删除。每個容器都是互相隔離的、保證安全平台。可以把看做一個簡易版的 Linux環境,包括 root 使用者權限、程序空間、使用者空間和網絡空間和運作
在其中的應用程式。Docker 利用容器來運作應用,鏡像是隻讀的,容器在啟動的時候建立一層可寫層作為最上層。
3.4.2 容器的日常操作
啟動容器有兩種方式,一種是基于鏡像建立一個容器并啟動,另外一個是将在終止狀态的容器重新啟動。
1、通過鏡像啟動容器:
docker run -d redis
2、檢視運作中的容器:
docker ps
3、檢視所有的容器:
docker ps -a
4、停止容器:
docker stop 容器 id 或容器名稱
5、開啟容器:
docker start 容器 id 或容器名稱
已經停止的容器,可以使用指令 docker start 來啟動。
因為 Docker 的容器實在太輕量級了,很多時候使用者都是随時删除和新建立容器。
6、删除容器:
docker rm 容器 id 或容器名稱
删除容器時,容器必須是停止狀态,否則會報錯;
7、進入容器:
docker exec -it 容器 id 或容器名稱 bash
還可以使用 docker inspect + 容器 id 或容器名稱 檢視容器的更多資訊;
8、停用全部運作中的容器:
9、删除全部容器:
10、一條指令實作停用并删除容器:
3.5 倉庫
3.5.1 倉庫的基本概念
倉庫是集中存放鏡像檔案的場所,有時候會把倉庫和倉庫注冊伺服器(Registry)看做同一事物,并不嚴格區分。實際上,倉庫注冊伺服器上往往存放着多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的标簽(tag);倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式;最大的公開倉庫是 Docker Hub (https://hub.docker.com/),存放了數量龐大的鏡像供使用者下載下傳;當然,使用者也可以在本地網絡内建立一個私有倉庫;當使用者建立了自己的鏡像之後就可以使用 push 指令将它上傳到公有或者私有倉庫,這樣下次在另外一台機器上使用這個鏡像時候,隻需要從倉庫上 pull 下來即可;
注:Docker 倉庫的概念跟 Git 類似,注冊伺服器也類似于 GitHub 這樣的托管服務;
3.5.2 倉庫的日常操作
使用者可通過 docker search 指令來查找官方倉庫中的鏡像:docker search rabbitmq可以看到傳回了很多包含關鍵字的鏡像,其中包括鏡像名字、描述、星級(表示該鏡像的受歡迎程度)、是否官方建立、是否自動建立;官方的鏡像說明是官方項目組建立和維護的,automated 資源允許使用者驗證鏡像的來源和内容;根據是否是官方提供,可将鏡像資源分為兩類;
一種是類似 centos 這樣的基礎鏡像,被稱為基礎或根鏡像。這些基礎鏡像是由 Docker 公司建立、驗證、支援、提供。這樣的鏡像往往使用單個單詞作為名字; 還有一種類型,比如 tianon/centos 鏡像,它是由 Docker 的使用者建立并維護的,往往帶有使用者名稱字首。可以通過字首 user_name/ 來指定使用某個使用者提供的鏡像,比如 tianon 使用者;并利用 docker pull 指令來将它下載下傳到本地:
docker pull rabbitmq
docker pull centos