docker實戰


Docker簡介

  • Docker 最初 dotCloud 公司內部的一個業餘項目mysql

  • Docker 基於 Go 語言nginx

  • Docker 項目的目標是實現輕量級的操做系統虛擬化解決方案web

  • Docker 的基礎是 Linux 容器(LXC)等技術redis

  • Docker 容器的啓動能夠在秒級實現,這相比傳統的虛擬機方式要快得多sql

  • Docker 對系統資源的利用率很高,一臺主機上能夠同時運行數千個 Docker 容器docker

  • 容器是獨立運行的一個或一組應用,以及它們的運行態環境。對應的,虛擬機能夠理解爲模擬運行的一整套操做系統(提供了運行態環境和其餘系統環境)和跑在上面的應用。shell

  • 容器是獨立運行的一個或一組應用,以及它們的運行態環境。對應的,虛擬機能夠理解爲模擬運行的一整套操做系統(提供了運行態環境和其餘系統環境)和跑在上面的應用。數據庫

      打開翻譯君輸入Docker 結果顯示碼頭工人,沒錯!碼頭工人搬運的是集裝箱,那麼今天要講的Docker其操做的也是集裝箱,這個集裝箱就靜態而言就是一個應用鏡像文件,就動態而言,就是一個容器。centos

       Docker從狹義上來說就是一個進程,從廣義上來說是一個虛擬容器,其實更專業的叫法是應用容器( Application Container ),Docker進程和普通的進程沒有任何區別,它就是一個普通的應用進程。不過是用來操做鏡像文件的。因此Docker進程+構建的應用鏡像文件就等於Docker容器。本文全部講的Docker都是指Docker容器哦。bash

注意 : 

當利用 docker run 來建立容器時,Docker 在後臺運行的標準操做包括:

 

  • 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載

  • 利用鏡像建立並啓動一個容器

  • 分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層

  • 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去

  • 從地址池配置一個 ip 地址給容器

  • 執行用戶指定的應用程序

  • 執行完畢後容器被終止

 

能夠利用 docker start 命令,直接將一個已經終止的容器啓動運行。

構建企業級Docker虛擬化平臺實戰

  1. 重點剖析虛擬化和雲計算概念;
  2. 分析Docker虛擬化的概念和原理;
  3. 從0開始實戰Docker虛擬化平臺;
  4. 基於Docker構建Nginx WEB服務器和CentOS虛擬機;
  5. 基於開源監控軟件Cadvisor監控Docker雲主機。

 

一、虛擬化技術的概念

     虛擬化,是目前比較火爆的技術,用於將物理資源轉變爲邏輯上能夠管理的資源,以打破物理結構之間的壁壘,計算元件運行在虛擬的設備上,而不是真實的設備上;

      虛擬化的原理,虛擬化的底層是要進行虛擬化的物理機器,基於虛擬化技術將物理機虛擬生成N個虛擬機資源,應用程序、軟件(Nginx、Apache、Tomcat、Redis、Memcached等)運行在虛擬機中;

     虛擬化的意義,虛擬化的技術不僅僅是將某臺物理機虛擬生成N臺虛擬機,更廣義的含義是將多組物理機資源轉變爲邏輯資源,同時能夠實現統一的資源管理和調度分配;

      虛擬化最終的目的,實現高配物理機硬件資源的合理的利用,將物理資源最大化的使用,不浪費任何的資源,淘汰一些效率比較低的服務器硬件,保證IT信息高速的發展;

        虛擬化技術,主要用來解決高性能的物理硬件產能過剩和老的舊的硬件產能太低的重組重用,透明化底層物理硬件,從而最大化的利用物理硬件資源。

     docker與傳統虛擬化(KVM,XEN等)對比:

     Docker容器是在操做系統層面上實現虛擬化,直接複製本地主機的操做系統,而傳統方式則是在硬件的基礎上,虛擬出本身的系統,再在系統上部署相關的    APP應用。

 

假設公司需求,須要部署100個Nginx服務,有以下的方案:

採購100臺低配物理機,每臺物理機部署一個Nginx服務;

採購10臺高配物理機,每臺物理機虛擬10臺虛擬機(配置同低配物理機),每一個虛擬機部署一個Nginx服務(每一個虛擬機部署一個WEB服務)(企業推薦)

      Docker虛擬化技術,三個概念:Docker鏡像,Docker容器,Docker倉庫;

      Docker鏡像Docker images相似ISO鏡像文件,靜止的,不能被修改,一個模板文件;就相似於VM虛擬機裏面的快照,可是可比快照輕量化多了。經過ID或者易識別的名字+tag來確認惟一的目標鏡像。ImagesID是一個64位的字符,可是通常咱們都是使用前面12位就足夠區別了。

      鏡像是分層的,有基礎鏡像,僅僅包含操做系統,好比centos鏡像;有中間件鏡像,好比redis等數據庫鏡像;最後是應用鏡像,就是指具體的應用服務了,應用鏡像能夠很是豐富,隨時能夠發佈,這三者之間依次疊加。

      使用 Docker構建鏡像的時候,每個命令都會在前一個命令的基礎上造成一個新鏡像層。以下圖,基礎鏡像就是centos鏡像,中間件鏡像就是兩個紅色圈,應用鏡像就是紫色圈。其中redis+centos這樣疊加組合的中間件鏡像就能夠供A服務或者B服務使用,這樣疊加組合更加靈活。仍和一種鏡像均可以從Docker hub公共倉庫中拉取。

      Docker容器Docker containers,基於Docker鏡像運行的實體,相似程序和進程的關係,進程是程序(軟件)運行的實體;從鏡像中建立容器,這如同從快照中建立虛擬機;      打個比方,你首先下載了一個Ubuntu的鏡像,而後又安裝mysql和Django應用及其依賴,來完成對它Ubutun鏡像的修改,很是完美應用鏡像生成了

       Docker容器,基於Docker鏡像運行後的實體,相似程序和進程的

       鏡像就生成一個容器。容器啓動以後就會運行Django服務了。

       容器就是一個個獨立的封閉的集裝箱,可是也須要對外提供服務的,因此Docker容許公開容器的特定端口,在啓動Docker的時候,咱們就能夠將容器的特定端口映射到宿主機上面的任意一個端口,因此,若是幾個服務都須要80端口,那麼容器的對外端口是80,可是映射到宿主機上面就是任意端口,就不會產生衝突,因此就不須要經過代理來解決衝突。容器對外端口與宿主機的端口映射能夠經過下面的命令來完成。

啓動docker容器
 docker run -d -p 2222:22 --name 容器名 鏡像名
 -d 守護容器,就是後臺運行,退出命令窗口容器也不會中止
 -it 交互式容器 退出命令窗口容器就中止運行了
 -p宿主機端口和容器端口映射
 8081:80 宿主機端口:容器公開的端口

 

       Docker倉庫Docker registeries,存儲鏡像的倉庫,存儲鏡像的地方,分爲公共倉庫(Public)、私有倉庫(Private);公有倉庫docker hub提供了很是多的鏡像文件,這些鏡像直接拉取下來就能夠運行了,你也能夠上傳本身的鏡像到docker hub上面。同時也能夠本身搭建私有倉庫用於團隊項目管理。

Docker的生命週期

1:開發構建鏡像並將鏡像push到Docker倉庫;

2:測試或者運維從Docker倉庫拷貝一份鏡像到本地;

3:經過鏡像文件開啓Docker容器並提供服務。

Docker特色

1:構建容易分發簡單;

2:隔離應用解除依賴;

3:快速部署測完就銷。

Docker與傳統虛擬機區別

     VM 的 Hypervisor 須要實現對硬件的虛擬化,而且還要搭載本身的操做系統,其中虛擬機操做系統佔用內存是比較大的,一個操做系統有好幾個G,天然在啓動速度和資源利用率以及性能上有很是大的開銷

          Docker 應用容器相對於 VM 有如下幾個優勢:

1:啓動速度快,容器啓動本質就是一個開啓一個進程而已,所以都是秒啓,而 VM 一般要更久;

2:資源利用率高,一臺普通 PC 能夠跑成百上千個容器,你跑十個 VM 試試;

3:性能開銷小, VM 一般須要額外的 CPU 和內存來完成 OS 的功能,這一部分佔據了額外的資源。

 

運行docker

       Docker 容器只是一個運行於宿主操做系統host OS上的應用進程,因此你須要一個鏡像來運行它Docker 鏡像以進程的方式運行時就叫作 Docker 容器。你能夠加載本地 Docker 鏡像,也能夠從 Docker Hub 上下載。Docker Hub 是一個提供公有和私有鏡像來進行拉取pull操做的集中倉庫。官方的 Docker Hub 位於 hub.docker.com。 當你指示 Docker 引擎運行容器時,它會首先搜索本地鏡像,若是沒有找到,它會從 Docker Hub 上拉取相應的鏡像。

     運行一個 Apache web 服務器的 Docker 鏡像,好比 httpd 進程。你須要運行 docker container run 命令。舊的命令爲 docker run, 但後來 Docker 添加了子命令部分,因此新版本支持下列命令:

Docker 的 run 命令將鏡像名做爲強制參數,另外還有不少可選參數。經常使用的參數有:

  • -d:從當前 shell 脫離容器

  • -p X:Y:綁定容器的端口 Y 到宿主機的端口 X

  • --name:命名你的容器。若是未指定,它將被賦予隨機生成的名字

  • -e:當啓動容器時傳遞環境編輯及其值

    經過上面的圖片, 將 httpd 做爲鏡像名來運行容器。接着,本地鏡像沒有找到,Docker 引擎從 Docker Hub 拉取了它。注意,它下載了鏡像 httpd:latest, 其中 :後面跟着版本號。若是你須要運行特定版本的容器,你能夠在鏡像名後面註明版本名。若是不提供版本名,Docker 引擎會自動拉取最新的版本。

輸出的最後一行顯示了你新運行的 httpd 容器的惟一 ID。

查看 Docker 容器的歷史紀錄

      在第一步咱們使用了 -d 參數來將容器,在它一開始運行的時候,就從當前的 shell 中脫離出來。在這種狀況下,咱們不知道容器裏面發生了什麼。因此爲了查看容器的歷史紀錄,Docker 提供了 logs 命令。它採用容器名稱或 ID 做爲參數。

這裏使用了容器名稱做爲參數。你能夠看到httpd 容器中與 Apache 相關的歷史紀錄。

肯定 Docker 容器的進程

    容器是一個使用宿主資源來運行的進程。這樣,你能夠在宿主系統的進程表中定位容器的進程。讓咱們在宿主系統上肯定容器進程。

 

      Docker 使用著名的 top 命令做爲子命令的名稱,來查看容器產生的進程。它採用容器的名稱或 ID 做爲參數。在舊版本的 Docker 中,只可運行 docker top 命令。在新版本中,docker top 和 docker container top 命令均可以生效。

在第一個輸出中,列出了容器產生的進程的列表。它包含了全部細節,包括用戶號uid、進程號pid,父進程號ppid、開始時間、命令,等等。這裏全部的進程號你均可以在宿主的進程表裏搜索到。這就是咱們在第二個命令裏作得。這證實了容器確實是宿主系統中的進程

中止 Docker 容器

採用容器名稱或 ID 做爲參數。

列出中止的或不活動的 Docker 容器

如今中止了容器,這時若是使用 ls 命令,它將不會出如今列表中。

在這種狀況下,若是想要查看中止的或不活動的容器,你須要在 ls 命令裏同時使用 -a 參數。

在這種狀況下,若是想要查看中止的或不活動的容器,你須要在 ls 命令裏同時使用 -a 參數。

從新啓動 Docker 容器

啓動和運行的區別。當你運行一個容器時,你將啓動一個全新的容器。當你啓動一個容器時,你將開始一個已經中止並保存了當時運行狀態的容器。它將以中止時的狀態從新開始運行。

移除 Docker 容器

     注意:不能夠移除運行中的容器。移除以前須要先中止容器。你可使用 -f 參數搭配 rm 命令來強制移除容器,但並不推薦這麼作。

一旦移除了容器,即便再使用 ls -a 命令也查看不到容器了。

 

  1. 虛擬化技術進行分類,分爲三大類:徹底虛擬化、半虛擬化、輕量級虛擬化(Docker),虛擬化技術,分層抽象圖:

      互聯網主流的虛擬化技術:KVM、ESXI、HP-V、XEN、Docker、Virtual Box等,使用量最多:Docker、KVM、ESXI、。

       徹底虛擬化技術:經過軟件實現對操做系統的資源再分配,比較成熟,例如,KVM,virtualBOX.

       半虛擬化技術:是經過代碼修改已有的系統,造成一種新的可虛擬化的系統,調用硬件資源去安裝多個系統,總體速度上相對高一點,表明產品有Xen.

        輕量級虛擬化:Docker(介於徹底虛擬化、半虛擬化之間)

     Docker技術的產物是Docker容器(集裝箱),容器中存放各類依賴文件、庫、應用軟件,能夠打包繁雜的庫文件、依賴程序到容器中,能夠方便遷移到其餘的平臺;

  1. 傳統虛擬化技術,若是想部署Nginx服務,必須基於底層硬件-VMM-GuestOS-Nginx服務;
  2. Docker虛擬化技術,若是想部署Nginx服務,必須基於底層硬件-VMM-Nginx服務;
  3. 虛擬化的用途(優點)快速分配資源、對服務器資源進行統一的調度和分配,能夠作到彈性擴容和縮容。(好比:10臺物理機--虛擬成100虛擬機)
  4. 虛擬化要求物理機的配置高,基於高配物理機生成N個虛擬機,京東線上虛擬機物理機配置:CPU 64C , MEN   256G   ,Disk   4T(RAID10),線上生成環境配置:2C4G40G;   4C8G40G;    8C16G100G;

例子:物理機8C16G,最多虛擬 :   7臺+   1臺4c      +1臺2C           虛擬機 

      雲計算和虛擬化有什麼關係?虛擬化是雲計算的基礎,虛擬化是雲計算組成部分,是雲計算中負責虛擬化資源管理的模塊。

 

二、Docker虛擬化概念

  1. Docker虛擬化技術相似集裝箱打包技術,Docker最終的產物是Docker容器(集裝箱);
  2. 基於Docker虛擬化技術,將各類依賴包、環境、系通通一打包成一個容器,將該容器便捷的遷移,例如內網打包環境,外網直接發佈環境;
  3. 開發人員內網調試一套環境,很是複雜,系統涉及到不少依賴包、環境、系統,想要發佈到線上,還須要在線上去調試環境,有了Docker技術以後,能夠直接將內部的環境統一打包、集成;
  4. 下圖爲傳統虛擬化方案:à須要部署Nginx,先部署OS系統,基於OS系統再部署Nginx;

 

    五、以下爲Docker虛擬化方案:à須要部署Nginx,無需部署OS系統,基於Docker引擎直接部署Nginx;

 

三、0開始構建Docker虛擬化平臺

  1. 如何構建企業級Docker虛擬化平臺?有什麼要求呢?
  2. 要求有一臺物理機設備,同時要求物理機安裝Linux操做系統,推薦CentOS,對Linux內核要求,官方3.8.x+;
  3. 生產環境的,推薦使用Linux內核3.10.0+,推薦的Linux操做系統CentOS7.3,對物理機的配置:CPU:16C,內存:32G,硬盤:600G;

  四、基於CentOS7.x安裝部署Docker平臺,

setenforce 0               #先關閉防火牆

yum install epel-release docker* -y

   五、基於CentOS6.x安裝部署Docker平臺,若是系統版本低於CentOS6.5話,須要先升級內核,

而後運行命令:

setenforce 0               #先關閉防火牆

rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm           #擴展源

yum install epel-release lxc docker-io device-map* cgroup lxc  libcgroup device-mapper-event-libs device-mapper* -y

              一、啓動docker 容器命令:/etc/init.d/docker start

              二、查看docker進程 :ps -ef | grep docker 

              三、啓動nginx容器命令:docker run -itd nginx = /usr/local/nginx/sbin/nginx

              四、進入nginx容器指令:docker exec -it b43031c78a5d /bin/bash

  六、Docker軟件引擎安裝完畢,重啓Docker服務,service docker restart

  七、同時查看Docker引擎的版本,客戶端和服務端的版本信息:

注意:Docker啓動容器,必須先有鏡像,鏡像比如是一個模板!容器

八、啓動Docker引擎獨立服務,指令以下:

service  docker  restart                              #用於CentOS6.x

systemctl restart docker.service              #用於CentOS7.x

ps -ef | grep docker                    #通用CentOS6和7;查看容器是否啓動

 

九、從官網倉庫搜索而且下載鏡像的指令如

              docker search nginx 搜索外網倉庫Nginx鏡像;

              docker pull docker.io/nginx 下載外網倉庫Nginx鏡像;

              docker images 查看本地服務器鏡像列表;

 

十、從Docker官網下載Nginx、CentOS鏡像,下載以前先搜索鏡像:docker search nginx 或者docker search centos;

  1. 基於Docker鏡像運行和啓動一個Docker Nginx容器,執行以下指令:

                        docker  run  -itd  docker.io/nginx

    2.如何訪問Docker Nginx容器的80服務呢?首先獲取Docker容器的IP地址:docker inspect 容器ID |grep -i ipaddr,如圖所示:

開啓一百臺nginx服務,從20臺到120臺,端口從6020到60120,啓動80端口的nginx服務。

#for i in 'seq 20  120';do docker run -itd -p 60$i:80 docker.io/nginx;done

進入容器以後,,使用ifconfig   查看IP地址。下面有docker的IP地址

啓動22端口,開啓遠程鏈接。

#/etc/init.d/ssh restart 

#netstat -lntp                            #查看22端口有沒有開啓

在另外一臺虛擬機上登陸,命令:ssh -l root 172.17.0.1

 

 

參考連接:https://mp.weixin.qq.com/s/lMVzelHgm2neLKuUQ91r7g

https://mp.weixin.qq.com/s/LeaYn-CUeu3wognse1fSzw

 

更多操做連接 : https://mp.weixin.qq.com/s/xjkW8O-YasgCNJeX2jR4ZQ

相關文章
相關標籤/搜索