Docker入門學習筆記
Docker
什麼是Docker
虛擬化技術
在計算機中,虛擬化是一種資源管理技術,將計算機中的各種實體資源如:CPU、硬碟、記憶體等予以抽象、轉換後呈現出來打破實體結構間的不可切割的障礙,使使用者可以比原本的組態更好的方式來應用這些資源。在實際的生產環境當中,虛擬化技術主要用來解決高效能運算機產能過剩和老舊的機器產能過低的重組重用。對硬體進行最大化利用
虛擬化種類
- 全虛擬化架構
虛擬機器的監視器(hypervisor)是類似於使用者的應用程式執行在主機的OS之上,如VMware的workstation,這種虛擬化產品提供了虛擬的硬體。可以在一臺裝置上執行不同核心的作業系統
OS層虛擬化技術
硬體層虛擬化
硬體層的虛擬化具有高效能和隔離性,因為hypervisor(虛擬機器的監視器)直接在硬體上執行,有利於控制VM的OS訪問硬體資源,使用這種解決方案的產品有VMwareESXi 和 Xen server
Hypervisor是一種執行在物理伺服器和作業系統之間的中間軟體層,可允許多個作業系統和應用共享一套基礎物理硬體,因此也可以看作是虛擬環境中的“元”作業系統,它可以協調訪問伺服器上的所有物理裝置和虛擬機器,也叫虛擬機器監視器(Virtual Machine Monitor,VMM)。
Hypervisor是所有虛擬化技術的核心。當伺服器啟動並執行Hypervisor時,它會給每一臺虛擬機器分配適量的記憶體、CPU、網路和磁碟,並載入所有虛擬機器的客戶作業系統。 宿主機
Hypervisor是所有虛擬化技術的核心,軟硬體架構和管理更高效、更靈活,硬體的效能能夠更好地發揮出來。常見的產品有:VMware、KVM、Xen等等。Openstack
Docker
特點:
上手快
使用者只需要幾分鐘,就可以把自己的程式“Docker化”。Docker依賴於“寫時複製”(copy-on-write)模型,使修改應用程式也非常迅速,可以說達到“隨心所致,程式碼即改”的境界。
隨後,就可以建立容器來執行應用程式了。大多數Docker容器只需要不到1秒中即可啟動。由於去除了管理程式的開銷,Docker容器擁有很高的效能,同時同一臺宿主機中也可以執行更多的容器,使使用者儘可能的充分利用系統資源。
職責的邏輯分類
使用Docker,開發人員只需要關心容器中執行的應用程式,而運維人員只需要關心如何管理容器。Docker設計的目的就是要加強開發人員寫程式碼的開發環境與應用程式要部署的生產環境一致性。從而降低那種“開發時一切正常,肯定是運維的問題(測試環境都是正常的,上線後出了問題就歸結為肯定是運維的問題)”
快速高效的開發週期
Docker的目標之一就是縮短程式碼從開發、測試到部署、上線執行的週期,讓你的應用程式具備可移植性,易於構建,並易於協作。(通俗一點說,Docker就像一個盒子,裡面可以裝很多物件,如果需要這些物件的可以直接將該大盒子拿走,而不需要從該盒子中一件件的取。)
鼓勵使用面向服務的架構
Docker還鼓勵面向服務的體系結構和微服務架構。Docker推薦單個容器只執行一個應用程式或程序,這樣就形成了一個分散式的應用程式模型,在這種模型下,應用程式或者服務都可以表示為一系列內部互聯的容器,從而使分散式部署應用程式,擴充套件或除錯應用程式都變得非常簡單,同時也提高了程式的內省性。(當然,可以在一個容器中執行多個應用程式)
Docker元件
Docker是一個客戶端-伺服器(C/S)架構程式。Docker客戶端只需要向Docker伺服器或者守護程序發出請求,伺服器或者守護程序將完成所有工作並返回結果。Docker提供了一個命令列工具Docker以及一整套RESTful API。你可以在同一臺宿主機上執行Docker守護程序和客戶端,也可以從本地的Docker客戶端連線到執行在另一臺宿主機上的遠端Docker守護程序。
Docker映象
映象是構建Docker的基石。使用者基於映象來執行自己的容器。映象也是Docker生命週期中的“構建”部分。映象是基於聯合檔案系統的一種層式結構,由一系列指令一步一步構建出來。例如:
新增一個檔案;
執行一個命令;
開啟一個視窗。
也可以將映象當作容器的“原始碼”。映象體積很小,非常“便攜”,易於分享、儲存和更新。
Registry(註冊中心)
Docker用Registry來儲存使用者構建的映象。Registry分為公共和私有兩種。Docker公司運營公共的Registry叫做Docker Hub。使用者可以在Docker Hub註冊賬號,分享並儲存自己的映象(說明:在Docker Hub下載映象巨慢,可以自己構建私有的Registry)
Docker容器
Docker可以幫助你構建和部署容器,你只需要把自己的應用程式或者服務打包放進容器即可。容器是基於映象啟動起來的,容器中可以執行一個或多個程序。我們可以認為,映象是Docker生命週期中的構建或者打包階段,而容器則是啟動或者執行階段。容器基於映象啟動,一旦容器啟動完成後,我們就可以登入到容器中安裝自己需要的軟體或者服務
Docker安裝
使用 yum 命令線上安裝
yum install docker
檢視 docker 版本
docker -v
啟動和關閉
啟動 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
Docker映象操作
Docker映象
Docker映象是由檔案系統疊加而成(是一種檔案的儲存形式)。最底端是一個檔案引導系統,即bootfs,這很像典型的Linux/Unix的引導檔案系統。Docker使用者幾乎永遠不會和引導系統有什麼互動。實際上,當一個容器啟動後,它將會被移動到記憶體中,而引導檔案系統則會被解除安裝,以留出更多的記憶體供磁碟映象使用。Docker容器啟動是需要的一些檔案,而這些檔案就可以稱為Docker映象。
列出映象:
docker images
列名 | 含義 |
---|---|
repository | 映象所在的倉庫名稱 |
tag | 映象標籤,一般對應該映象的版本號 |
image id | 映象的ID |
created | 映象建立日期 |
size | 映象大小 |
搜尋映象:
docker search 映象名稱
列名 | 介紹 |
---|---|
NAME | 倉庫名稱 |
DESCRIPTION | 映象描述 |
STARS | 使用者評價,反應一個映象的受歡迎程度。應該類似於GitHub收藏數?或者是基於某種演算法計算而來 |
OFFICIAL | 是否官方 |
AUTOMATED | 自動構建,表示該映象由Docker Hub自動構建流程建立的 |
拉取映象
由於一些不可控的原因,我們從中央倉庫下載映象速度是很慢的,學過 MAVEN/NPM 的同學應該也知道,這時候就要我們來使用國內的遠端映象倉庫了。
使用遠端倉庫的方法:
編輯該檔案:
vi /etc/docker/daemon.json // 如果該檔案不存在就手動建立;說明:在centos7.x下,通過vi
在該檔案中輸入如下內容:
{ "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] }
重啟 docker 服務,如果速度還是很慢就重啟一下虛擬機器
刪除映象
docker rmi $IMAGE_ID:刪除指定映象
docker rmi `docker images -q`:刪除所有映象
Docker容器操作
檢視容器
檢視正在執行的容器
docker ps
檢視所有的容器
docker ps -a
檢視最後一次執行的容器
docker ps –l
檢視停止的容器
docker ps -f status=exited
建立與啟動容器
建立容器命令:
docker run
-i:表示執行容器
-t:表示容器啟動後會進入其命令列。加入這兩個引數後,容器建立就能登入進去。即分配一個偽終端。
--name :為建立的容器命名。
-v:表示目錄對映關係(前者是宿主機目錄,後者是對映到宿主機上的目錄),可以使用多個-v做多個目錄或檔案對映。注意:最好做目錄對映,在宿主機上做修改,然後共享到容器上。
-d:在run後面加上-d引數,則會建立一個守護式容器在後臺執行(這樣建立容器後不會自動登入容器,如果只加-i -t兩個引數,建立後就會自動進去容器)。
-p:表示埠對映,前者是宿主機埠,後者是容器內的對映埠。可以使用多個-p做多個埠對映
互動式容器(前臺啟動容器)
建立一個互動式容器並取名為mycentos
docker run -it --name=mycentos centos:7 /bin/bash
退出當前容器
exit
守護式容器(後臺啟動容器)
建立一個守護式容器:如果對於一個需要長期執行的容器來說,我們可以建立一個守護式容器。命令如下(容器名稱不能重複)
docker run -id --name=mycentos2 centos:7
登入守護式容器:
docker exec -it 容器名 (或者 容器ID) /bin/bash(exit退出時,容器不會停止)
停止與啟動容器
停止正在執行的容器:
docker stop 容器名/ID
啟動已執行過的容器:
docker start 容器名/ID
檔案拷貝
將宿主機器的檔案拷貝到 docker 容器中
docker cp 需要拷貝的檔案或目錄 容器名稱:容器目錄
將容器中的檔案拷貝到宿主機器中
docker cp 容器名稱:容器目錄 需要拷貝的檔案或目錄
目錄掛載
我們可以在建立容器的時候,將宿主機的目錄與容器內的目錄進行對映,這樣我們就可以通過修改宿主機某個目錄的檔案從而去影響容器。建立容器 新增-v引數 後邊為 宿主機目錄:容器目錄
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos2 centos:7
如果你共享的是多級的目錄,可能會出現許可權不足的提示。這是因為CentOS7中的安全模組selinux把許可權禁掉了,我們需要新增引數 --privileged=true
來解決掛載的目錄沒有許可權的問題
檢視容器IP地址
docker inspect 容器名
對應的欄位是 ipaddr
刪除容器
docker rm 容器名/ID // 僅支援刪除未執行的容器
// 刪除所有容器:
docker rm `docker ps -a -q
部署應用
MySQL部署
- 拉取 MySQL 映象:docker pull mysql
- 建立 MySQL 容器:docker run -id --name=pinyougou_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
-p 代表埠對映,格式為 宿主機對映埠:容器執行埠
-e 代表新增環境變數 MYSQL_ROOT_PASSWORD是root使用者的登陸密碼
- 進入 MySQL 容器,登陸 MySQL
docker exec -it pinyougou_mysql /bin/bash
TomCat部署
- 拉取 TomCat 映象:docker pull tomcat:7-jre7
- 建立 TomCat 容器:
docker run -id --name=pinyougou_tomcat -p 8080:8080 -v /usr/local/myhtml:/usr/local/tomcat/webapps --privileged=true tomcat:7-jre7
// -v 就是指定檔案對映路徑(這裡 myhtml是一個CAS單點登陸的工程)
// -p 就是埠對映,可以通過宿主IP:埠 來訪問容器裡面部署的專案
- 修改web專案中的配置檔案,這裡修改CAS專案連線的資料庫地址為部署 MySQL 的容器的 IP(注意不是宿主機器的IP)
Nginx部署
- 拉取 Nginx 映象:docker pull nginx
建立 Nginx 容器:docker run -id --name=pinyougou_nginx -p 80:80 nginx
測試 Nginx
配置反向代理:
官方的nginx映象,nginx配置檔案nginx.conf 在/etc/nginx/目錄下。在容器內編輯配置檔案不方便,我們可以先將配置檔案從容器內拷貝到宿主機,編輯修改後再拷貝回去。
從容器拷貝配置檔案到宿主機:
docker cp pinyougou_nginx:/etc/nginx/nginx.conf nginx.conf
編輯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;
}
}
將修改後的配置檔案拷貝到容器:
docker cp nginx.conf pinyougou_nginx:/etc/nginx/nginx.conf
重新啟動容器
設定域名指向:
這裡推薦使用:SwitchHost這個管理Host的小工具。下載地址:https://oldj.github.io/SwitchHosts/
記得以管理員身份執行,這裡只能配 IP 和 域名的對映關係,如果想要區別埠,在瀏覽器輸入域名:埠號就OK
Redis部署
- 拉取 Redis 映象:docker pull redis
建立 Redis 容器:docker run -id --name=pinyougou_redis -p 6379:6379 redis
測試,在redis目錄下啟動cmd,輸入以下命令: redis-cli -h 宿主機器IP 【埠號預設6379】
C:\develop\redis-2.8.9>redis-cli -h 192.168.40.131
備份與遷移
容器儲存為映象
docker commit 容器名 映象名
映象備份
docker save -o mynginx.tar mynginx
// -o 指定輸出到的檔名
映象恢復與遷移
docker load -i mynginx.tar