【笔记】docker核心概念和使用 docker命令
介紹
在Linux服務(wù)器部署一個(gè)單體JavaWeb應(yīng)用,一般會(huì)在服務(wù)器安裝Tomcat、MySql、Redis、JDK等相關(guān)環(huán)境或軟件,安裝完軟件之后需要進(jìn)行相關(guān)配置,最后把項(xiàng)目打成War包,放在服務(wù)器進(jìn)行部署。這樣有幾個(gè)缺點(diǎn),那就是面對(duì)黑糊糊的命令行,如果想部署成功需要一定的Linux知識(shí)儲(chǔ)備,再者就是如果我們想在另一臺(tái)服務(wù)器上部署,也需要重復(fù)剛剛的下載軟件、配置環(huán)境、部署,極為繁瑣。而Docker作為一門容器技術(shù),很好的解決這一問題。
我們只需要在一臺(tái)Linux機(jī)器上完成軟件的安裝和配置,然后把他們做成鏡像,MySQL做成MySQL-Docker鏡像,Tomcat做成Tomcat-Docker鏡像。當(dāng)我們?cè)诹硪慌_(tái)Linux服務(wù)器
安裝的時(shí)候只需要安裝Docker這個(gè)軟件,然后把鏡像拿過來運(yùn)行即可,這個(gè)鏡像就成了一個(gè)容器。容器啟動(dòng)是非常快速的。類似windows里面的ghost操作系統(tǒng),安裝好后什么都有了,這樣就降低了對(duì)linux操作的難度。
原理
:
和宿主機(jī)共享內(nèi)核,所有容器運(yùn)行在容器引擎之上,容器并非一個(gè)完整的操作系統(tǒng),所有容器共享操作系統(tǒng),在進(jìn)程級(jí)
進(jìn)行隔離
根據(jù)操作系統(tǒng)的不同,可以通過shell或者遠(yuǎn)程桌面進(jìn)行
不同與傳統(tǒng)容器,docker早起基于LXC,后來基于自研的libContainer,docker對(duì)于傳統(tǒng)容器做了許多優(yōu)化,如下:
Docker采用了C/S架構(gòu),分為Docker客戶端(Docker可執(zhí)行程序)與Docker守護(hù)進(jìn)程,Docker客戶端通過命令行和API的形式與Docker守護(hù)進(jìn)程進(jìn)行通信,Docker守護(hù)進(jìn)程則提供Docker服務(wù)。因此,我們操作的各種docker命令實(shí)際上都是由docker客戶端發(fā)送到docker守護(hù)進(jìn)程上去執(zhí)行。我們?cè)跇?gòu)建
一個(gè)鏡像時(shí),不可避免的需要將一些本地文件拷貝到鏡像中,用戶在構(gòu)建鏡像時(shí),需要指定構(gòu)建鏡像的上下文路徑(即前文的.),docker build在獲得這個(gè)路徑之后,會(huì)將路徑下的所有內(nèi)容打包,然后上傳給Docker引擎
docker應(yīng)用場(chǎng)景
Docker的核心概念
docker鏡像(Images):Docker 鏡像是用于創(chuàng)建Docker 容器的 模板。
docker容器(Container):容器是獨(dú)立運(yùn)行的一個(gè)或一組應(yīng)用。
docker客戶端(Client):客戶端通過命令行或者其他工具使用 Docker API 與Docker
的守護(hù)進(jìn)程通信
docker主機(jī)(Host):一個(gè)物理或者虛擬的機(jī)器用于執(zhí)行 Docker 守護(hù)進(jìn)程和容器
docker倉庫(Registry):Docker 倉庫用來保存鏡像,可以理解 為代碼控制中的代碼倉
庫,Docker Hub(https://hub.docker.com) 提供了龐大的鏡像集合供使用
docker容器查看命令
docker中的容器就是一個(gè)輕量級(jí)的虛擬機(jī),是鏡像運(yùn)行起來的一個(gè)狀態(tài)
如果需要查看所有容器,則可以通過docker ps -a命令查看
使用docker ps -l可以查看最近創(chuàng)建的容器
可以使用docker ps -n=XXX來查看最新創(chuàng)建的n個(gè)容器
如果開發(fā)者需要既創(chuàng)建又啟動(dòng)容器,則可以使用docker run命令。docker run命令又可以啟動(dòng)兩種不同模式的容器:后臺(tái)型容器和交互型容器,顧名思義,后臺(tái)型容器就是一個(gè)在后臺(tái)運(yùn)行的容器,默默的在后臺(tái)執(zhí)行計(jì)算就行了,不需要和開發(fā)者進(jìn)行交互,而交互型容器則需要接收開發(fā)者的輸入進(jìn)行處理給出反饋。對(duì)于開發(fā)者而言,大部分情況下創(chuàng)建的都是后臺(tái)型容器,不過在很多時(shí)候,即使是后臺(tái)型容器也不可避免的需要進(jìn)行交互,下面分別來看。
docker run --name nginx1 -d -p 8080:80 nginx
–name含義和上文一樣,表示創(chuàng)建的容器的名字,-d表示容器在后臺(tái)運(yùn)行,-p表示將容器的80端口映射到宿主
機(jī)的8080端口,創(chuàng)建過程如下圖:
首先依然會(huì)去本地檢查,本地沒有相應(yīng)的容器,則會(huì)去Docker Hub上查找,查找到了下載并運(yùn)行,并且生
成了一個(gè)容器id。運(yùn)行成功后,在瀏覽器中輸http://localhost:8080就能看到Nginx的默認(rèn)頁面了
docker run --name ubuntu -it ubuntu /bin/bash
-it參數(shù),i表示開發(fā)容器的標(biāo)準(zhǔn)輸入(STDIN),t則表示告訴docker,為容器創(chuàng)建一個(gè)命令行終端。執(zhí)行結(jié)果如下
docker stop命令可以終止一個(gè)容器,如下:
可以通過docker rm命令刪除一個(gè)容器。刪除容器時(shí),只能刪除已經(jīng)停止運(yùn)行的容器,不能刪除正在運(yùn)行的容器
容器也可以批量刪除,命令如下:
docker rm $(docker ps -a -q)
docker ps -a -q會(huì)列出所有容器的id,供rm命令刪除。
如下命令也支持刪除已退出的孤立的容器:
docker container prune
docker attach
依附容器這個(gè)主要是針對(duì)交互型容器而言的,該命令有一定的局限性,可以作為了解。
通過docker inspect命令查看容器的詳細(xì)信息,這些詳細(xì)信息包括容器的id、容器名、環(huán)境變量、運(yùn)行命令、主機(jī)配置、網(wǎng)絡(luò)配置以及數(shù)據(jù)卷配置等信息
使用docker top命令可以查看容器中正在運(yùn)行的進(jìn)程,首先確保容器已經(jīng)啟動(dòng),然后執(zhí)行docker top命令
如果要查看日志,則可以使用docker提供的docker logs
使用export命令可以導(dǎo)出容器,具體操作如下:
本案例中我首先創(chuàng)建一個(gè)nginx容器,然后啟動(dòng),啟動(dòng)成功后,將本地一個(gè)index.html文件上傳到容器中,修改nginx首頁的顯示內(nèi)容。具體操作步驟如下
容器導(dǎo)入成功后,就可以使用docker run命令運(yùn)行了。
可以通過docker images命令查看本地所有鏡像
鏡像可以通過docker rmi命令進(jìn)行刪除,參數(shù)為鏡像的id或者鏡像名,參數(shù)可以有多個(gè),多個(gè)參數(shù)之間用空
格隔開。如下:
鏡像
鏡像的體系結(jié)構(gòu)
鏡像的體系結(jié)構(gòu)
鏡像的最底層是一個(gè)啟動(dòng)文件系統(tǒng)(bootfs)鏡像,bootfs的上層鏡像叫做根鏡像,一般來說,根鏡像是一個(gè)操作系統(tǒng),例如Ubuntu、CentOS等,用戶的鏡像必須構(gòu)建于根鏡像之上,在根鏡像之上,用戶可以構(gòu)建出各種各樣的其他鏡像。
從上面的介紹讀者可以看出,鏡像的本質(zhì)其實(shí)就是一系列文件的集合,一層套一層的結(jié)構(gòu)有點(diǎn)類似于Git。
通過docker run命令指定一個(gè)容器創(chuàng)建鏡像時(shí),實(shí)際上是在該鏡像之上創(chuàng)建一個(gè)空的可讀寫的文件系統(tǒng)層級(jí),
可以將這個(gè)文件系統(tǒng)層級(jí)當(dāng)成一個(gè)臨時(shí)的鏡像來對(duì)待,而命令中所指的模版鏡像則可以稱之為父鏡像。父鏡像的內(nèi)容都是以只讀的方式掛載進(jìn)來的,容器會(huì)讀取共享父鏡像的內(nèi)容,用戶所做的所有修改都是在文件系統(tǒng)中,不會(huì)對(duì)父鏡像造成任何影響。當(dāng)然用戶可以通過其他一些手段使修改持久化到父鏡像中。
總結(jié)
以上是生活随笔為你收集整理的【笔记】docker核心概念和使用 docker命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【算法学习笔记】 图(四)用优先级队列优
- 下一篇: 【练习】2021下半年数据结构刷题笔记和