Docker容器部署

1.Docker簡介

1.1虛擬化
1.1.1什麼是虛擬化
在計算機中,虛擬化(英語:Virtualization)是一種資源管理技術,是將計算機的各種實體資源,如服務器、網絡、內存及存儲等,予以抽象、轉換後呈現出來,打破實體結構間的不可切割的障礙,使用戶可以比原本的組態更好的方式來應用這些資源。這些資源的新虛擬部份是不受現有資源的架設方式,地域或物理組態所限制。一般所指的虛擬化資源包括計算能力和資料存儲。
在實際的生產環境中,虛擬化技術主要用來解決高性能的物理硬件產能過剩和老的舊的硬件產能過低的重組重用,透明化底層物理硬件,從而最大化的利用物理硬件 對資源充分利用
虛擬化技術種類很多,例如:軟件虛擬化、硬件虛擬化、內存虛擬化、網絡虛擬化(vip)、桌面虛擬化、服務虛擬化、虛擬機等等。

## 1.1.2虛擬化種類
(1)全虛擬化架構
在這裏插入圖片描述
(2)OS層虛擬化架構
在這裏插入圖片描述

(3)硬件層虛擬化
在這裏插入圖片描述
硬件層的虛擬化具有高性能和隔離性,因爲hypervisor直接在硬件上運行,有利於控制VM的OS訪問硬件資源,使用這種解決方案的產品有VMware ESXi 和 Xen server
Hypervisor是一種運行在物理服務器和操作系統之間的中間軟件層,可允許多個操作系統和應用共享一套基礎物理硬件,因此也可以看作是虛擬環境中的“元”操作系統,它可以協調訪問服務器上的所有物理設備和虛擬機,也叫虛擬機監視器(Virtual Machine Monitor,VMM)。
Hypervisor是所有虛擬化技術的核心。當服務器啓動並執行Hypervisor時,它會給每一臺虛擬機分配適量的內存、CPU、網絡和磁盤,並加載所有虛擬機的客戶操作系統。 宿主機
Hypervisor是所有虛擬化技術的核心,軟硬件架構和管理更高效、更靈活,硬件的效能能夠更好地發揮出來。常見的產品有:VMware、KVM、Xen等等。Openstack

1.2什麼是Docker

在這裏插入圖片描述
1.2.1容器技術
在計算機的世界中,容器擁有一段漫長且傳奇的歷史。容器與管理程序虛擬化(hypervisor virtualization,HV)有所不同,管理程序虛擬化通過中間層將一臺或者多臺獨立的機器虛擬運行與物理硬件之上,而容器則是直接運行在操作系統內核之上的用戶空間。因此,容器虛擬化也被稱爲“操作系統級虛擬化”,容器技術可以讓多個獨立的用戶空間運行在同一臺宿主機上。
由於“客居”於操作系統,容器只能運行與底層宿主機相同或者相似的操作系統,這看起來並不是非常靈活。例如:可以在Ubuntu服務中運行Redhat Enterprise Linux,但無法再Ubuntu服務器上運行Microsoft Windows。
相對於徹底隔離的管理程序虛擬化,容器被認爲是不安全的。而反對這一觀點的人則認爲,由於虛擬容器所虛擬的是一個完整的操作系統,這無疑增大了攻擊範圍,而且還要考慮管理程序層潛在的暴露風險。
儘管有諸多侷限性,容器還是被廣泛部署於各種各樣的應用場合。在超大規模的多租戶服務部署、輕量級沙盒以及對安全要求不太高的隔離環境中,容器技術非常流行。最常見的一個例子就是“權限隔離監牢”(chroot jail),它創建一個隔離的目錄環境來運行進程。如果權限隔離監牢正在運行的進程被入侵者攻破,入侵者便會發現自己“身陷囹圄”,因爲權限不足被困在容器所創建的目錄中,無法對宿主機進一步破壞。
最新的容器技術引入了OpenVZ、Solaris Zones以及Linux容器(LXC)。使用這些新技術,容器不在僅僅是一個單純的運行環境。在自己的權限類內,容器更像是一個完整的宿主機。對Docker來說,它得益於現代Linux特性,如控件組(control group)、命名空間(namespace)技術,容器和宿主機之間的隔離更加徹底,容器有獨立的網絡和存儲棧,還擁有自己的資源管理能力,使得同一臺宿主機中的多個容器可以友好的共存。
容器被認爲是精益技術,因爲容器需要的開銷有限。和傳統虛擬化以及半虛擬化相比,容器不需要模擬層(emulation layer)和管理層(hypervisor layer),而是使用操作系統的系統調用接口。這降低了運行單個容器所需的開銷,也使得宿主機中可以運行更多的容器。
儘管有着光輝的歷史,容器仍未得到廣泛的認可。一個很重要的原因就是容器技術的複雜性:容器本身就比較複雜,不易安裝,管理和自動化也很困難。而Docker就是爲了改變這一切而生的。
1.2.2容器與虛擬機比較
(1)本質上的區別
在這裏插入圖片描述
(2)使用上的區別
在這裏插入圖片描述
虛擬機已死,容器纔是未來。
1.2.3 Docker特點
(1)上手快。
用戶只需要幾分鐘,就可以把自己的程序“Docker化”。Docker依賴於“寫時複製”(copy-on-write)模型,使修改應用程序也非常迅速,可以說達到“隨心所致,代碼即改”的境界。
隨後,就可以創建容器來運行應用程序了。大多數Docker容器只需要不到1秒中即可啓動。由於去除了管理程序的開銷,Docker容器擁有很高的性能,同時同一臺宿主機中也可以運行更多的容器,使用戶儘可能的充分利用系統資源。
(2)職責的邏輯分類
使用Docker,開發人員只需要關心容器中運行的應用程序,而運維人員只需要關心如何管理容器。Docker設計的目的就是要加強開發人員寫代碼的開發環境與應用程序要部署的生產環境一致性。從而降低那種“開發時一切正常,肯定是運維的問題(測試環境都是正常的,上線後出了問題就歸結爲肯定是運維的問題)”
(3)快速高效的開發生命週期
Docker的目標之一就是縮短代碼從開發、測試到部署、上線運行的週期,讓你的應用程序具備可移植性,易於構建,並易於協作。(通俗一點說,Docker就像一個盒子,裏面可以裝很多物件,如果需要這些物件的可以直接將該大盒子拿走,而不需要從該盒子中一件件的取。)
(4)鼓勵使用面向服務的架構
Docker還鼓勵面向服務的體系結構和微服務架構。Docker推薦單個容器只運行一個應用程序或進程,這樣就形成了一個分佈式的應用程序模型,在這種模型下,應用程序或者服務都可以表示爲一系列內部互聯的容器,從而使分佈式部署應用程序,擴展或調試應用程序都變得非常簡單,同時也提高了程序的內省性。(當然,可以在一個容器中運行多個應用程序)

1.3 Docker組件

1.3.1 Docker客戶端和服務器
Docker是一個客戶端-服務器(C/S)架構程序。Docker客戶端只需要向Docker服務器或者守護進程發出請求,服務器或者守護進程將完成所有工作並返回結果。Docker提供了一個命令行工具Docker以及一整套RESTful API。你可以在同一臺宿主機上運行Docker守護進程和客戶端,也可以從本地的Docker客戶端連接到運行在另一臺宿主機上的遠程Docker守護進程。
在這裏插入圖片描述
1.3.2 Docker鏡像
鏡像是構建Docker的基石。用戶基於鏡像來運行自己的容器。鏡像也是Docker生命週期中的“構建”部分。鏡像是基於聯合文件系統的一種層式結構,由一系列指令一步一步構建出來。例如:
添加一個文件;
執行一個命令;
打開一個窗口。
也可以將鏡像當作容器的“源代碼”。鏡像體積很小,非常“便攜”,易於分享、存儲和更新。
1.3.3 Registry(註冊中心)
Docker用Registry來保存用戶構建的鏡像。Registry分爲公共和私有兩種。Docker公司運營公共的Registry叫做Docker Hub。用戶可以在Docker Hub註冊賬號,分享並保存自己的鏡像(說明:在Docker Hub下載鏡像巨慢,可以自己構建私有的Registry)。
1.3.4 Docker容器
Docker可以幫助你構建和部署容器,你只需要把自己的應用程序或者服務打包放進容器即可。容器是基於鏡像啓動起來的,容器中可以運行一個或多個進程。我們可以認爲,鏡像是Docker生命週期中的構建或者打包階段,而容器則是啓動或者執行階段。 容器基於鏡像啓動,一旦容器啓動完成後,我們就可以登錄到容器中安裝自己需要的軟件或者服務。
在這裏插入圖片描述
所以Docker容器就是:
一個鏡像格式;
一些列標準操作;
一個執行環境。
Docker借鑑了標準集裝箱的概念。標準集裝箱將貨物運往世界各地,Docker將這個模型運用到自己的設計中,唯一不同的是:集裝箱運輸貨物,而Docker運輸軟件。
和集裝箱一樣,Docker在執行上述操作時,並不關心容器中到底裝了什麼,它不管是web服務器,還是數據庫,或者是應用程序服務器什麼的。所有的容器都按照相同的方式將內容“裝載”進去。
Docker也不關心你要把容器運到何方:我們可以在自己的筆記本中構建容器,上傳到Registry,然後下載到一個物理的或者虛擬的服務器來測試,在把容器部署到具體的主機中。像標準集裝箱一樣,Docker容器方便替換,可以疊加,易於分發,並且儘量通用。
使用Docker,我們可以快速的構建一個應用程序服務器、一個消息總線、一套實用工具、一個持續集成(CI)測試環境或者任意一種應用程序、服務或工具。我們可以在本地構建一個完整的測試環境,也可以爲生產或開發快速複製一套複雜的應用程序棧。

2.Docker安裝與啓動

2.1安裝環境說明
Docker官方建議在Ubuntu中安裝,因爲Docker是基於Ubuntu發佈的,而且一般Docker出現的問題Ubuntu是最先更新或者打補丁的。在很多版本的CentOS中是不支持更新最新的一些補丁包的。
由於我們學習的環境都使用的是CentOS,因此這裏我們將Docker安裝到CentOS上。注意:這裏建議安裝在CentOS7.x以上的版本,在CentOS6.x的版本中,安裝前需要安裝其他很多的環境而且Docker很多補丁不支持更新。
2.2在VMware Workstation中安裝CentOS7
資料已經準備了安裝好的鏡像,直接掛載即可。
掛載後,使用ip addr命令查看本地IP

**

2.3安裝Docker

**
使用yum命令在線安裝

yum install docker

在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

2.4安裝後查看Docker版本

docker -v

在這裏插入圖片描述

2.5啓動與停止Docker

systemctl命令是系統服務管理器指令,它是 service 和 chkconfig 兩個命令組合。

  • 啓動docker:systemctl start docker
  • 停止docker:systemctl stop docker
  • 重啓docker:systemctl restart docker
  • 查看docker狀態:systemctl status docker
  • 開機啓動:systemctl enable docker
    在這裏插入圖片描述
  • 查看docker概要信息:docker info
  • 查看docker幫助文檔:docker --help

3.Docker鏡像操作

3.1什麼是Docker鏡像
Docker鏡像是由文件系統疊加而成(是一種文件的存儲形式)。最底端是一個文件引導系統,即bootfs,這很像典型的Linux/Unix的引導文件系統。Docker用戶幾乎永遠不會和引導系統有什麼交互。實際上,當一個容器啓動後,它將會被移動到內存中,而引導文件系統則會被卸載,以留出更多的內存供磁盤鏡像使用。Docker容器啓動是需要的一些文件,而這些文件就可以稱爲Docker鏡像。
在這裏插入圖片描述

3.2列出鏡像

列出docker下的所有鏡像:docker images
在這裏插入圖片描述

  • REPOSITORY:鏡像所在的倉庫名稱
  • TAG:鏡像標籤
  • IMAGE ID:鏡像ID
  • CREATED:鏡像的創建日期(不是獲取該鏡像的日期)
  • SIZE:鏡像大小
  • 這些鏡像都是存儲在Docker宿主機的/var/lib/docker目錄下
  • 在這裏插入圖片描述
    爲了區分同一個倉庫下的不同鏡像,Docker提供了一種稱爲標籤(Tag)的功能。每個鏡像在列出來時都帶有一個標籤,例如12.10、12.04等等。每個標籤對組成特定鏡像的一些鏡像層進行標記(比如,標籤12.04就是對所有Ubuntu12.04鏡像層的標記)。這種機制使得同一個倉庫中可以存儲多個鏡像。— 版本號
    我們在運行同一個倉庫中的不同鏡像時,可以通過在倉庫名後面加上一個冒號和標籤名來指定該倉庫中的某一具體的鏡像,例如docker run --name custom_container_name –i –t docker.io/ubunto:12.04 /bin/bash,表明從鏡像Ubuntu:12.04啓動一個容器,而這個鏡像的操作系統就是Ubuntu:12.04。在構建容器時指定倉庫的標籤也是一個好習慣。

3.3搜索鏡像

如果你需要從網絡中查找需要的鏡像,可以通過以下命令搜索

docker search 鏡像名稱

在這裏插入圖片描述

  • NAME:倉庫名稱
  • DESCRIPTION:鏡像描述
  • STARS:用戶評價,反應一個鏡像的受歡迎程度
  • OFFICIAL:是否官方

AUTOMATED:自動構建,表示該鏡像由Docker Hub自動構建流程創建的

3.4拉取鏡像

3.4.1從Docker Hub拉取
Docker鏡像首頁,包括官方鏡像和其它公開鏡像。Docker Hub上最受歡迎的10大鏡像(通過Docker registry API獲取不了鏡像被pull的個數,只能通過鏡像的stars數量,來衡量鏡像的流行度。毫無疑問,擁有最高stars數量的庫都是官方庫)。

在這裏插入圖片描述
國情的原因,國內下載 Docker HUB 官方的相關鏡像比較慢,可以使用國內(docker.io)的一些鏡像加速器,鏡像保持和官方一致,關鍵是速度塊,推薦使用。Mirror與Private Registry的區別:
Private Registry(私有倉庫)是開發者或者企業自建的鏡像存儲庫,通常用來保存企業內部的 Docker 鏡像,用於內部開發流程和產品的發佈、版本控制。
Mirror是一種代理中轉服務,我們(比如daocloud)提供的Mirror服務,直接對接Docker Hub的官方Registry。Docker Hub 上有數以十萬計的各類 Docker 鏡像。
在使用Private Registry時,需要在Docker Pull 或Dockerfile中直接鍵入Private Registry 的地址,通常這樣會導致與 Private Registry 的綁定,缺乏靈活性。
使用 Mirror 服務,只需要在 Docker 守護進程(Daemon)的配置文件中加入 Mirror 參數,即可在全局範圍內透明的訪問官方的 Docker Hub,避免了對 Dockerfile 鏡像引用來源的修改。
簡單來說,Mirror類似CDN,本質是官方的cache;Private Registry類似私服,跟官方沒什麼關係。對用戶來說,由於用戶是要拖docker hub上的image,對應的是Mirror。yum/apt-get的Mirror又有點不一樣,它其實是把官方的庫文件整個拖到自己的服務器上做鏡像,並定時與官方做同步;而Docker Mirror只會緩存曾經使用過的image。

使用命令拉取:docker pull centos:7

目前國內訪問docker hub速度上有點尷尬,使用docker Mirror勢在必行。現有國內提供docker鏡像加速服務的商家有不少,下面重點ustc鏡像。
3.4.2 ustc的鏡像
ustc是老牌的linux鏡像服務提供者了,還在遙遠的ubuntu 5.04版本的時候就在用。ustc的docker鏡像加速器速度很快。ustc docker mirror的優勢之一就是不需要註冊,是真正的公共服務。
https://lug.ustc.edu.cn/wiki/mirrors/help/docker
步驟:
(1)編輯該文件:vi /etc/docker/daemon.json // 如果該文件不存在就手動創建;說明:在centos7.x下,通過vi。
在這裏插入圖片描述
(2)在該文件中輸入如下內容:
{ "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] }
(3)注意:一定要重啓docker服務,如果重啓docker後無法加速,可以重新啓動OS

在這裏插入圖片描述
然後通過docker pull命令下載鏡像:速度槓槓的。

3.5刪除鏡像

1、docker rmi $IMAGE_ID:刪除指定鏡像
2、docker rmi docker images -q:刪除所有鏡像
在這裏插入圖片描述

4.Docker容器操作

**

4.1查看容器

**

  • 查看正在運行容器:
 - docker ps
  • 查看所有的容器(啓動過的歷史容器):
docker ps –a

在這裏插入圖片描述

  • 查看最後一次運行的容器:
docker ps –l

在這裏插入圖片描述

  • docker ps -f status=exited

4.2創建與啓動容器

  • 創建容器常用的參數說明:
  • 創建容器命令:docker run
  • -i:表示運行容器
  • -t:表示容器啓動後會進入其命令行。加入這兩個參數後,容器創建就能登錄進去。即分配一個僞終端。
  • –name :爲創建的容器命名。
  • -v:表示目錄映射關係(前者是宿主機目錄,後者是映射到宿主機上的目錄),可以使用多個-v做多個目錄或文件映射。注意:最好做目錄映射,在宿主機上做修改,然後共享到容器上。
  • -d:在run後面加上-d參數,則會創建一個守護式容器在後臺運行(這樣創建容器後不會自動登錄容器,如果只加-i
    -t兩個參數,創建後就會自動進去容器)。
  • -p:表示端口映射,前者是宿主機端口,後者是容器內的映射端口。可以使用多個-p做多個端口映射
    4.1.1交互式容器
    創建一個交互式容器並取名爲mycentos
docker run -it --name=mycentos centos:7 /bin/bash

這時我們通過ps命令查看,發現可以看到啓動的容器,狀態爲啓動狀態
在這裏插入圖片描述
使用exit命令 退出當前容器
在這裏插入圖片描述
然後用ps -a 命令查看發現該容器也隨之停止:
在這裏插入圖片描述
4.1.2守護式容器
創建一個守護式容器:如果對於一個需要長期運行的容器來說,我們可以創建一個守護式容器。命令如下(容器名稱不能重複):

docker run -di --name=mycentos2 centos:7
  • 登錄守護式容器方式:

docker exec -it container_name (或者 container_id) /bin/bash(exit退出時,容器不會停止)
在這裏插入圖片描述

4.3停止與啓動容器

  • 停止正在運行的容器:docker stop $CONTAINER_NAME/ID
    在這裏插入圖片描述
    啓動已運行過的容器:docker start $CONTAINER_NAME/ID
    在這裏插入圖片描述

4.4文件拷貝

如果我們需要將文件拷貝到容器內可以使用cp命令

docker cp 需要拷貝的文件或目錄 容器名稱:容器目錄

也可以將文件從容器內拷貝出來

docker cp 容器名稱:容器目錄 需要拷貝的文件或目錄

4.5目錄掛載

我們可以在創建容器的時候,將宿主機的目錄與容器內的目錄進行映射,這樣我們就可以通過修改宿主機某個目錄的文件從而去影響容器。
創建容器 添加-v參數 後邊爲 宿主機目錄:容器目錄

docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos2 centos:7

如果你共享的是多級的目錄,可能會出現權限不足的提示。
在這裏插入圖片描述
這是因爲CentOS7中的安全模塊selinux把權限禁掉了,我們需要添加參數 --privileged=true 來解決掛載的目錄沒有權限的問題

4.6查看容器IP地址

我們可以通過以下命令查看容器運行的各種數據

docker inspect mycentos2

也可以直接執行下面的命令直接輸出IP地址

docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos2

4.7刪除容器

刪除指定的容器:docker rm $CONTAINER_ID/NAME

在這裏插入圖片描述
注意,只能刪除停止的容器

  • 刪除所有容器:docker rm docker ps -a -q
    在這裏插入圖片描述

5.部署應用

5.1 MySQL部署

5.1.1拉取MySQL鏡像

docker pull mysql

在這裏插入圖片描述
查看鏡像
在這裏插入圖片描述
5.1.2創建MySQL容器

docker run -di --name pinyougou_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

-p 代表端口映射,格式爲 宿主機映射端口:容器運行端口
-e 代表添加環境變量 MYSQL_ROOT_PASSWORD是root用戶的登陸密碼
5.1.3進入MySQL容器,登陸MySQL
進入mysql容器

docker exec -it pinyougou_mysql /bin/bash

登陸mysql

mysql -u root -p

5.1.4遠程登陸MySQL
(1)我們在我們本機的電腦上去連接虛擬機Centos中的Docker容器,這裏192.168.247.130是虛擬機操作系統的IP
在這裏插入圖片描述
(2)在本地客戶端執行建庫腳本
執行“資源/建庫語句/pinyougoudb.sql”
在這裏插入圖片描述
5.1.5查看容器IP地址
我們可以通過以下命令查看容器運行的各種數據

docker inspect pinyougou_mysql

運行效果如下:
在這裏插入圖片描述
我們可以看到我們的數據庫服務器的IP是172.17.0.2

5.2 tomcat部署

5.2.1拉取tomcat鏡像

docker pull tomcat:7-jre7

5.2.2創建tomcat容器
創建容器用於部署單點登錄系統(CAS) -p表示地址映射

docker run -di --name=pinyougou_tomcat -p 9000:8080 
-v /usr/local/myhtml:/usr/local/tomcat/webapps --privileged=true tomcat:7-jre7

5.2.3部署web應用
(1)修改cas系統的配置文件,修改數據庫連接的url

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		p:driverClass="com.mysql.jdbc.Driver"
		p:jdbcUrl="jdbc:mysql://172.17.0.6:3306/pinyougoudb?characterEncoding=utf8"
		p:user="root"
		p:password="123456" />

5.3 Nginx部署

5.3.1拉取Nginx鏡像

docker pull nginx

5.3.2創建Nginx容器

docker run -di --name=pinyougou_nginx -p 80:80  nginx/bin/ba

5.3.4配置反向代理
官方的nginx鏡像,nginx配置文件nginx.conf 在/etc/nginx/目錄下。
在容器內編輯配置文件不方便,我們可以先將配置文件從容器內拷貝到宿主機,編輯修改後再拷貝回去。
(1)從容器拷貝配置文件到宿主機

docker cp pinyougou_nginx:/etc/nginx/nginx.conf nginx.conf 

(2)編輯nginx.conf,添加反向代理配置

upstream tomcat-cas {
	server 172.17.0.7:8080;
}
server {
	listen 80;
	server_name passport.pinyougou.com;
	location / {
		proxy_pass http://tomcat-cas;
		index index.html index.htm;
	}
}

(3)將修改後的配置文件拷貝到容器

docker cp nginx.conf  pinyougou_nginx:/etc/nginx/nginx.conf

(4)重新啓動容器

docker restart pinyougou_nginx

(5)設置域名指向

192.168.247.135 passport.pinyougou.com 

5.4 Redis部署

5.4.1拉取Redis鏡像

docker pull redis

5.4.2創建Redis容器

 docker run -di --name=pinyougou_redis -p 6379:6379 redis

5.4.3客戶端測試
在你的本地電腦命令提示符下,用window版本redis測試

redis-cli -h 192.168.247.135

**

6.備份與遷移

**

6.1容器保存爲鏡像

我們可以通過以下命令將容器保存爲鏡像

docker commit pinyougou_nginx mynginx

pinyougou_nginx是容器名稱
mynginx是新的鏡像名稱
此鏡像的內容就是你當前容器的內容,接下來你可以用此鏡像再次運行新的容器

6.2鏡像備份

docker  save -o mynginx.tar mynginx

-o 輸出到的文件
執行後,運行ls命令即可看到打成的tar包
**

6.3鏡像恢復與遷移

**
首先我們先刪除掉mynginx鏡像
然後執行此命令進行恢復

docker load -i mynginx.tar

-i 輸入的文件
執行後再次查看鏡像,可以看到鏡像已經恢復

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章