Docker 超詳細版(基礎(chǔ)+進階)(一)
1. 簡介
1.1 什么是虛擬化
在計算機中,虛擬化(Virtualization)是一種資源管理技術(shù),是將計算機的各種實體資源,如服務(wù)器、網(wǎng)絡(luò)、內(nèi)存及存儲等,予以抽象、轉(zhuǎn)換后呈現(xiàn)出來,打破實體結(jié)構(gòu)間的不可切割的障礙,使用戶可以比原本的組態(tài)更好的方式來應(yīng)用這些資源。這些資源的新虛擬部分是不受現(xiàn)有資源的架構(gòu)方式,地域或物理組態(tài)所限制。一般所指的虛擬化資源包括計算能力和資料存儲
在實際的生產(chǎn)環(huán)境中,虛擬化技術(shù)主要用來解決高性能的物理硬件產(chǎn)能過剩和老的舊的硬件產(chǎn)能過低的重組重用,透明化底層物理硬件,從而最大化的利用物理硬件。對資源充分利用虛擬化技術(shù)種類很多,例如:軟件虛擬化、硬件虛擬化、內(nèi)存虛擬化、網(wǎng)絡(luò)虛擬化(vip)、桌面虛擬化、服務(wù)虛擬化、虛擬機等等
1.2 什么是 docker
Docker 是一個開源項目,誕生于2013年初,最初是 dotCloud 公司內(nèi)部的一個業(yè)余項目。它基于 Google 公司推出的 Go 語言實現(xiàn)。項目后來加入了 Linux 基金會,遵從了 Apache 2.0 協(xié)議,項目代碼在Github(https://github.com/docker/docker)上進行維護
Docker 自開源后受到廣泛的關(guān)注和討論,以至于 dotCloud 公司后來都改名為 Docker Inc。Redhat 已經(jīng)在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 產(chǎn)品中廣泛應(yīng)用
Docker 項目的目標是實現(xiàn)輕量級的操作系統(tǒng)虛擬化解決方案。Docker 的基礎(chǔ)是 Linux 容器(LXC)等技術(shù)
在 LXC 的基礎(chǔ)上 Docker 進行了進一步的封裝,讓用戶不需要去關(guān)心容器的管理,使得操作更為簡便。用戶操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單
1.3 為什么選擇Docker?
更高效的利用系統(tǒng)資源
由于容器不需要進行硬件虛擬以及運行完整操作系統(tǒng)等額外開銷,Docker 對系統(tǒng)資源的利用率更高。無論是應(yīng)用執(zhí)行速度、內(nèi)存損耗或者文件存儲速度,都要比傳統(tǒng)虛擬機技術(shù)更高效。因此,相比虛擬機技術(shù),一個相同配置的主機,往往以及運行更多數(shù)量的應(yīng)用
更快速的啟動時間
傳統(tǒng)的虛擬機技術(shù)啟動應(yīng)用服務(wù)往往需要數(shù)分鐘,而 Docker 容器應(yīng)用,由于直接運行于宿主內(nèi)核,無需啟動完整的操作系統(tǒng),因此可以做到秒級、甚至毫秒級的啟動時間。大大節(jié)約了開發(fā)、測試、部署的時間
一致的運行環(huán)境
開發(fā)過程中一個常見的問題是環(huán)境一致性問題。由于開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境不一致,導(dǎo)致有些bug并未在開發(fā)過程中被發(fā)現(xiàn)。而 Docker 的鏡像提供了除內(nèi)核外完整的運行時環(huán)境,確保了應(yīng)用環(huán)境一致性,從而不會再出現(xiàn)【這段代碼在機器上沒問題啊】這類問題
持續(xù)交付和部署
對開發(fā)和運維(DevOps)人員來說,最希望的就是一次創(chuàng)建或配置,可以在任意地方正常運行
使用 Docker 可以通過定制應(yīng)用鏡像來實現(xiàn)持續(xù)集成、持續(xù)交付、部署,開發(fā)人員可以通過 Dockerfile 來進行鏡像構(gòu)建,并結(jié)合持續(xù)集成(Continuous Integration)系統(tǒng)進行集成測試,而運維人員則可以直接在生產(chǎn)環(huán)境中快速部署改鏡像,甚至結(jié)合持續(xù)部署(Continuous Delivery/Deployment)系統(tǒng)進行自動部署
而且使用 Dockerfile 使鏡像構(gòu)建透明化,不僅僅開發(fā)團隊可以理解應(yīng)用運行環(huán)境,也方便運維團隊理解應(yīng)用運行所需條件,幫助更好的生產(chǎn)環(huán)境中部署該鏡像
更輕松的遷移
由于 Docker 確保了執(zhí)行環(huán)境的一致性,使得應(yīng)用的遷移更加容易。Docker 可以在很多平臺上運行,無論是物理機、虛擬機、公有云、私有云,甚至是筆記本,其運行結(jié)果是一致的。因此用戶可以很輕易地將在有個平臺上運行的應(yīng)用,遷移到另一個平臺上,而不用擔心運行環(huán)境的變化導(dǎo)致應(yīng)用無法正常運行的情況
更輕松的維護和擴展
Docker 使用的分層存儲已經(jīng)鏡像的技術(shù),使得應(yīng)用重復(fù)部分的復(fù)用更為容易,也使得應(yīng)用的維護更新更加簡單,基于基礎(chǔ)鏡像進一步擴展鏡像也變得非常簡單。此外,Docker 團隊同各個開源項目團隊一起維護了一大批高質(zhì)量的官方鏡像,既可以直接在生產(chǎn)環(huán)境使用,又可以作為基礎(chǔ)進一步定制,大大大降低了應(yīng)用服務(wù)的鏡像制作成本
1.4 容器與虛擬機的比較
容器是在操作系統(tǒng)層面上進行虛擬機,直接復(fù)用本地主機的操作系統(tǒng),而傳統(tǒng)方式則是在硬件層面實現(xiàn)
與傳統(tǒng)的虛擬機相比,Docker 優(yōu)勢體現(xiàn)為啟動速度快、占用體積小
2. Docker 組件
2.1 Docker 服務(wù)器與客戶端
Docker 是一個客戶端-服務(wù)器(C/S)架構(gòu)程序。Docker 客戶端只需要向 Docker 服務(wù)器或者守護進程發(fā)出請求,服務(wù)器或者守護進程將完成所有工作并返回結(jié)果。Docker 提供了一個命令行工具 Docker 以及一整套 RESTful API。你可以在同一臺宿主機上運行 Docker 守護進程和客戶端,也可以從本地的 Docker 客戶端連接運行在另一臺宿主機上的遠程 Docker 守護進程
2.2 Docker 鏡像與容器
鏡像是構(gòu)建 Docker 的基石。用于基于鏡像來運行自己的容器。鏡像也是 Docker 生命周期中的“構(gòu)建”部分。鏡像是基于聯(lián)合文件系統(tǒng)的一種層式結(jié)構(gòu),由一系列指令一步一步構(gòu)建出來,例如:
添加一個文件
執(zhí)行一個命令
打開一個窗口
也可以將鏡像當作容器的“源代碼”。鏡像體積很小,非常“便攜”,易于分享、存儲和更新
Docker 可以幫助你構(gòu)建和部署容器,你只需要把自己的應(yīng)用程序或者服務(wù)打包放進容器即可。容器是基于鏡像啟動起來的,容器中可以運行一個或多個進程。我們可以認為,鏡像是Docker 生命周期中的構(gòu)建或者打包階段,而容器則是啟動或者執(zhí)行階段。容器基于鏡像啟動,一旦容器啟動完成后,我們就可以登錄到容器中安裝自己需要的軟件或者服務(wù),所以Docker 容器就是:
一個鏡像格式
一些列標準操作
一個執(zhí)行環(huán)境
Docker 借鑒了標準集裝箱的概念。標磚集裝箱將貨物運往世界各地,Docker 將這個模型運用到自己的設(shè)計中,唯一不同的是:集裝箱運輸貨物,而Docker 運輸軟件
和集裝箱一樣,Docker 在執(zhí)行上述操作時,并不關(guān)心容器中到底裝了什么,它不管是web服務(wù)器,還是數(shù)據(jù)庫,或者是應(yīng)用程序服務(wù)器什么的。所有的容器都按照相同的方式將內(nèi)容“裝載”進去
Docker 也不關(guān)心你要把容器運到何方:我們可以在自己的筆記本中構(gòu)建容器,上傳到Registry,然后下載到一個物理的或者虛擬的服務(wù)器來測試,再把容器部署到具體的主機中。就像標準集裝箱一樣,Docker 容器方便替換,可以疊加,易于分發(fā),并且盡量通用
2.3 Registry(注冊中心)
Docker 用 Registry 來保存用戶構(gòu)建的鏡像。Registry 分為公共和私有兩種。Docker 公司運營公共的 Registry 叫做 Docker Hub。用戶可以在 Docker Hub 注冊賬號,分享并保存自己的鏡像(說明:在Docker Hub 下載鏡像很慢,可以自己構(gòu)建私有的 Registry)
3. Docker 安裝
更新 yum
yum update
安裝所需的軟件包,yum-utils 提供yum-config-manager功能,另外兩個是devicemapper驅(qū)動依賴的
yum install -y yum-utils device-mapper-persistent-data lvm2
設(shè)置 yum 源為阿里云
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安裝 docker(ce:社區(qū)免費版,ee:企業(yè)版)
yum -y install docker-ce
查看是否安裝成功
docker -v
設(shè)置ustc鏡像
docker的一些站點都在國外,拉取對應(yīng)鏡像可能速度有點慢/失敗,需要將其設(shè)置成ustc鏡像,能夠加快鏡像下載的速度,同上面將yum源改為阿里一樣
mkdir -p /etc/docker vim /etc/docker/daemon.json
添加如下內(nèi)容
{ "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] }
啟動 docker
systemctl start docker
查看是否啟動成功
systemctl status docker
查看docker對應(yīng)信息
docker info
查看 docker 幫助文檔
docker --help
停止docker
systemctl stop docker
重啟 docker
systemctl restart docker
開機自啟動docker
systemctl enable docker
4. 常用命令
4.1 鏡像常用命令
docker images
REPOSITORY:鏡像名稱
TAG:鏡像標簽
IMAGE ID:鏡像ID
CREATED:鏡像的創(chuàng)建日期(不是獲取該鏡像的日期)
SIZE:鏡像大小
這些鏡像都是存儲在Docker宿主機的var/lib/docker目錄下
docker search [名稱]
NAME:鏡像名稱
DESCRIPTION:鏡像的簡單描述
STARS:星數(shù),類似于GitHub
OFFICIAL:鏡像是否為官方
AUTOMATED:鏡像是否由dockerhub自動構(gòu)建流程創(chuàng)建
# 不加版本默認為最新版本 docker pull [名稱:版本]
# 一般后面跟鏡像id,因為id唯一 docker rmi [鏡像id/名稱] # 刪除所有鏡像 docker rmi `docker images -q`
4.2 容器相關(guān)命令
查看正在運行的容器
docker ps
CONTAINER ID:容器ID
IMAGE:鏡像
COMMAND:命令
CREATED:創(chuàng)建時間
STATUS:狀態(tài)
PORTS:端口映射
NAMES:容器名稱
查看所有容器
docker ps -a
查看最后一次運行的容器
docker ps -l
查看停止的容器
docker ps -f status=exited
創(chuàng)建容器
docker run
-i:表示運行容器
-t:表示容器啟動后會進入其命令行。加入這個兩個參數(shù)后,容器創(chuàng)建就能登錄進去。即分配一個偽終端
--name:為創(chuàng)建的容器命名(名稱唯一,重復(fù)會報錯)
-v:表示目錄映射關(guān)系(目錄掛載)(前者是宿主機目錄,后者是映射到宿主機上的目錄),可以使用多個-v做多個目錄或文件映射。注意:最好做目錄映射,在宿主機上做修改,然后共享到容器上
-d:在run后面加上-d參數(shù),則會創(chuàng)建一個守護式容器在后臺運行(這樣創(chuàng)建容器后不會自動登錄容器,如果只加-i -tl兩個參數(shù),創(chuàng)建后就會自動進去容器)
-p:表示端口映射,前者是宿主機端口,后者是容器內(nèi)的映射端口。可以使用多個-p做多個端口映射
交互式方式創(chuàng)建容器
-e:添加環(huán)境變量
# 標簽即版本號,如上面的centos:7,如果下載的是最新版本。可省略 # /bin/bash 表示啟動后以命令行的方式訪問驚醒 docker run -it --name=容器名稱 鏡像名稱:標簽 /bin/bash
使用前面下載好的centos:7鏡像創(chuàng)建容器
docker run -it --name=mycentos centos:7 /bin/bash
我們使用命令docker ps 發(fā)現(xiàn)會報錯,這是因為我們當前終端在容器下,此容器中我們并未安裝docker
新開一個會話查看一下當前運行的容器
退出當前容器
exit
守護方式創(chuàng)建容器
docker run -id --name=容器名稱 鏡像名稱:標簽
同樣的,使用之前下載好的centos:7鏡像創(chuàng)建容器
docker run -id --name=mycentos2 centos:7
登錄容器
# 守護方式創(chuàng)建容器,登錄后再退出,容器還是會在后臺運行 docker exec -it 容器名稱/id /bin/bash
停止容器
docker stop 容器id/名稱
停止后臺的mycentos2容器
docker stop 658f00347e9a
docker start 容器id/名稱
啟動剛才停止的容器
docker start 658f00347e9a
# 將宿主機文件拷貝到容器 docker cp 宿主機文件路徑 容器id/名稱:容器中文件路徑 # 容器中文件拷貝到宿主機 docker cp 容器id/名稱:容器中文件路徑 宿主機路徑
我們隨便講當前目錄下的一個文件拷貝到容器的usr/local目錄下
docker cp anaconda-ks.cfg 658f00347e9a:/usr/local
將上面拷貝到容器中的文件再拷貝會宿主機,并修改名稱
docker cp mycentos2:/usr/local/anaconda-ks.cfg anaconda-ks2.cfg
我們可以在創(chuàng)建容器的時候,將宿主機的目錄與容器內(nèi)的目錄進行映射,這樣我們就可以通過修改宿主機某個目錄的文件從而去影響容器
創(chuàng)建容器 添加-v參數(shù),后邊為宿主機目錄:容器目錄
docker run -id -v 宿主機目錄:容器目錄 --name=容器名稱 鏡像名稱:標簽
查看容器的各種數(shù)據(jù)
docker inspect 容器名稱/id
直接輸出IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱/id
不能刪除正在運行的容器,要先停止運行再刪除
docker rm 容器名稱/id
刪除前面創(chuàng)建的mycentos3容器
docker rm mycentos3
由于文章字數(shù)受限,這里分為兩部分
Docker 虛擬化
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。