01【熟悉】docker簡介
1,什么是docker
? ??? ??Docker是一個(gè)開源項(xiàng)目歼捐,誕生于2013年初职辨,最初是dotCloud公司內(nèi)部的一個(gè)業(yè)余項(xiàng)目铁孵。它基于Google公司推出的Go語言實(shí)現(xiàn)。項(xiàng)目后來加入了Linux基金會(huì)旧巾,遵從了Apache2.0協(xié)議耸序,項(xiàng)目代碼在GitHub上進(jìn)行維護(hù)。Docker自開源后受到廣范的關(guān)注和討論鲁猩,以至于dotCloud公司后來都改名為Docker Inc坎怪。RedHat已經(jīng)在其RHEL6.5中集中支持Docker;Google也在其PaaS產(chǎn)品中廣泛應(yīng)用。Docker的目標(biāo)是實(shí)現(xiàn)經(jīng)量級的操作系統(tǒng)虛擬化解決方案廓握。Docker的基礎(chǔ)是Linux容器(LXC)等技術(shù)搅窿。在LXC的基礎(chǔ)上Docker進(jìn)行了進(jìn)一步的封裝,讓用戶不需要關(guān)心容器的管理隙券,使得操作更加簡單戈钢。用戶操作Docker的容器就像操作一個(gè)快速輕量級的虛擬機(jī)一樣簡單。
? ??? ??下圖比較了Docker和傳統(tǒng)虛擬化方式的不同之處是尔,可見容器是在操作系統(tǒng)層面上實(shí)現(xiàn)的虛擬化殉了,直接復(fù)用本地主機(jī)的操作系統(tǒng),而傳統(tǒng)方式則是在硬件層現(xiàn)實(shí)現(xiàn)
[if !vml]
[endif]
2拟枚,docker的設(shè)計(jì)思想
? ??? ??Docker的思想來自于集裝箱薪铜,集裝箱解決了什么問題?在一艘大船上恩溅,可以把貨物規(guī)整的擺放起來隔箍。并且各種各樣的貨物被集裝箱標(biāo)準(zhǔn)化了,集裝箱和集裝箱之間不會(huì)互相影響脚乡。那么我就不需要專門運(yùn)送水果的船和專門運(yùn)送化學(xué)品的船了蜒滩。只要這些貨物在集裝箱里封裝的好好的滨达,那我就可以用一艘大船把他們都運(yùn)走。docker就是類似的理念「┘瑁現(xiàn)在都流行云計(jì)算了捡遍,云計(jì)算就好比大貨輪。docker就是集裝箱竹握。
1.不同的應(yīng)用程序可能會(huì)有不同的應(yīng)用環(huán)境画株,比如.net開發(fā)的網(wǎng)站和php開發(fā)的網(wǎng)站依賴的軟件就不一樣,如果把他們依賴的軟件都安裝在一個(gè)服務(wù)器上就要調(diào)試很久啦辐,而且很麻煩谓传,還會(huì)造成一些沖突。比如IIS和Apache訪問端口沖突芹关。這個(gè)時(shí)候你就要隔離.net開發(fā)的網(wǎng)站和php開發(fā)的網(wǎng)站续挟。常規(guī)來講,我們可以在服務(wù)器上創(chuàng)建不同的虛擬機(jī)在不同的虛擬機(jī)上放置不同的應(yīng)用侥衬,但是虛擬機(jī)開銷比較高庸推。docker可以實(shí)現(xiàn)虛擬機(jī)隔離應(yīng)用環(huán)境的功能,并且開銷比虛擬機(jī)小浇冰,小就意味著省錢了。
2.你開發(fā)軟件的時(shí)候用的是Ubuntu聋亡,但是運(yùn)維管理的都是centos肘习,運(yùn)維在把你的軟件從開發(fā)環(huán)境轉(zhuǎn)移到生產(chǎn)環(huán)境的時(shí)候就會(huì)遇到一些Ubuntu轉(zhuǎn)centos的問題,比如:有個(gè)特殊版本的數(shù)據(jù)庫坡倔,只有Ubuntu支持漂佩,centos不支持,在轉(zhuǎn)移的過程當(dāng)中運(yùn)維就得想辦法解決這樣的問題罪塔。這時(shí)候要是有docker你就可以把開發(fā)環(huán)境直接封裝轉(zhuǎn)移給運(yùn)維投蝉,運(yùn)維直接部署你給他的docker就可以了。而且部署速度快征堪。
3.在服務(wù)器負(fù)載方面瘩缆,如果你單獨(dú)開一個(gè)虛擬機(jī),那么虛擬機(jī)會(huì)占用空閑內(nèi)存的佃蚜,docker部署的話庸娱,這些內(nèi)存就會(huì)利用起來。
總之docker就是集裝箱原理谐算。
3熟尉,為什么要使用docker
? ??? ??作為一種新興的虛擬化方式,Docker 跟傳統(tǒng)的虛擬化方式相比具有眾多的優(yōu)勢洲脂。首先斤儿,Docker 容器的啟動(dòng)可以在秒級實(shí)現(xiàn),這相比傳統(tǒng)的虛擬機(jī)方式要快得多。其次往果,Docker 對系統(tǒng)資源的利用率很高疆液,一臺(tái)主機(jī)上可以同時(shí)運(yùn)行數(shù)千個(gè)Docker 容器。
容器除了運(yùn)行其中應(yīng)用外棚放,基本不消耗額外的系統(tǒng)資源枚粘,使得應(yīng)用的性能很高,同時(shí)系統(tǒng)的開銷盡量小飘蚯。
傳統(tǒng)虛擬機(jī)方式運(yùn)行10 個(gè)不同的應(yīng)用就要起10 個(gè)虛擬機(jī)馍迄,而Docker 只需要啟動(dòng)10 個(gè)隔離的應(yīng)用即可。具體說來局骤,Docker 在如下幾個(gè)方面具有較大的優(yōu)勢攀圈。
1,更快速的交付和部署
對開發(fā)和運(yùn)維(devop)人員來說峦甩,最希望的就是一次創(chuàng)建或配置赘来,可以在任意地方正常運(yùn)行。開發(fā)者可以使用一個(gè)標(biāo)準(zhǔn)的鏡像來構(gòu)建一套開發(fā)容器凯傲,開發(fā)完成之后犬辰,運(yùn)維人員可以直接使用這個(gè)容器來部署代碼。Docker 可以快速創(chuàng)建容器冰单,快速迭代應(yīng)用程序幌缝,并讓整個(gè)過程全程可見,使團(tuán)隊(duì)中的其他成員更容易理解應(yīng)用程序是如何創(chuàng)建和工作的诫欠。Docker 容器很輕很快涵卵!容器的啟動(dòng)時(shí)間是秒級的,大量地節(jié)約開發(fā)荒叼、測試轿偎、部署的時(shí)間.
2,更輕松的遷移和擴(kuò)展
Docker 容器幾乎可以在任意的平臺(tái)上運(yùn)行被廓,包括物理機(jī)坏晦、虛擬機(jī)、公有云嫁乘、私有云英遭、個(gè)人電腦、服務(wù)器
等亦渗。這種兼容性可以讓用戶把一個(gè)應(yīng)用程序從一個(gè)平臺(tái)直接遷移到另外一個(gè)挖诸。
3,更簡單的管理
使用Docker法精,只需要小小的修改多律,就可以替代以往大量的更新工作痴突。所有的修改都以增量的方式被分發(fā)和更新,從而實(shí)現(xiàn)自動(dòng)化并且高效的管理狼荞。對比虛擬機(jī)
[if !vml]
[endif]
3辽装,docker的局限性
[if !supportLists]1.???[endif]Docker是基于Linux 64bit的,無法在32bit的linux/Windows/unix環(huán)境下使用
[if !supportLists]2.???[endif]LXC是基于cgroup等linux kernel功能的相味,因此container的guest系統(tǒng)只能是linux base的
[if !supportLists]3.???[endif]隔離性相比KVM之類的虛擬化方案還是有些欠缺拾积,所有container公用一部分的運(yùn)行庫
[if !supportLists]4.???[endif]網(wǎng)絡(luò)管理相對簡單,主要是基于namespace隔離
[if !supportLists]5.???[endif]cgroup的cpu和cpuset提供的cpu功能相比KVM的等虛擬化方案相比難以度量(所以dotcloud主要是按內(nèi)存收費(fèi))
[if !supportLists]6.???[endif]Docker對disk的管理比較有限
[if !supportLists]7.???[endif]container隨著用戶進(jìn)程的停止而銷毀丰涉,container中的log等用戶數(shù)據(jù)不便收集
4拓巧,docker在開發(fā)、測試一死、部署中的定位
1肛度,嘗試新軟件
對開發(fā)者而言,每天會(huì)催生出的各式各樣的新技術(shù)都需要嘗試投慈,然而開發(fā)者卻不太可能為他們一一搭建好環(huán)境并進(jìn)行測試承耿。時(shí)間非常寶貴,正是得益于 Docker伪煤,讓我們有
可能在一條或者幾條命令內(nèi)就搭建完環(huán)境加袋。Docker 有一個(gè)傻瓜化的獲取軟件的方法,Docker 后臺(tái)會(huì)自動(dòng)獲得環(huán)境鏡像并且運(yùn)行環(huán)境抱既。
并不僅僅是新技術(shù)環(huán)境搭建用得到 Docker职烧。如果你想快速在你的筆記本上運(yùn)行一個(gè) MySQL 數(shù)據(jù)庫,或者一個(gè) Redis 消息隊(duì)列蝙砌,那么使用 Docker 便可以非常容易地做到。例如 Docker 只需要一條命令便可以運(yùn)行 MySQL 數(shù)據(jù)庫:docker run -d -p 3306:3306 tutum/mysql跋理。
2择克,進(jìn)行演示
工作中自己開發(fā)的成果對客戶或者別人做一兩個(gè)演示。搭建演示環(huán)境的過程非常麻煩前普。Docker是演示這些工具的最合理的方式肚邢。同時(shí),對于客戶來說拭卿,可以直接將 Docker?鏡像提供給他們骡湖,而不必去做任何環(huán)境配置的工作,工作的效果也會(huì)和在他們演示中所看到的一模一樣峻厚,同時(shí)不必?fù)?dān)心他們的環(huán)境配置會(huì)導(dǎo)致我們的產(chǎn)品無法運(yùn)行响蕴。
3,避免“我機(jī)器上可以運(yùn)行”
無論是上一篇介紹的企業(yè)部署 Docker 還是本文的個(gè)人 Docker 用例惠桃,都提到了這個(gè)情況浦夷。因?yàn)榄h(huán)境配置不同辖试,很多人在開發(fā)中也會(huì)遇到這個(gè)情況,甚至開發(fā)的軟件到了測試人員的機(jī)器上便不能運(yùn)行劈狐。但這都不是重點(diǎn)罐孝。重點(diǎn)是,如果我們有一個(gè)可靠的肥缔、可分發(fā)的標(biāo)準(zhǔn)開發(fā)環(huán)境莲兢,那么我們的開發(fā)將不會(huì)像現(xiàn)在這么痛苦。Docker 便可以解決這個(gè)問題续膳。Docker 鏡像并不會(huì)因?yàn)榄h(huán)境的變化而不能運(yùn)行,也不會(huì)在不同的電腦上有不同的運(yùn)行結(jié)果姑宽∏菜#可以給測試人員提交含有應(yīng)用的 Docker 鏡像,這樣便不再會(huì)發(fā)生“在我機(jī)器上是可以運(yùn)行的”這種事情炮车,很大程度上減輕了開發(fā)人員測試人員互相檢查機(jī)器環(huán)境設(shè)置帶來的時(shí)間成本舵变。
4,更好地利用資源
虛擬機(jī)的粒度是“虛擬出的機(jī)器”瘦穆,而 Docker 的粒度則是“被限制的應(yīng)用”烛愧,相比較而言 Docker 的內(nèi)存占用更少,更加輕量級吝秕。對我來說這是 Docker 的一個(gè)優(yōu)勢:因?yàn)樵谌绻陔娔X中運(yùn)行多個(gè) Docker 應(yīng)用瓢颅,使用 Docker 比使用虛擬機(jī)更加簡單,方便熙兔,粒度更細(xì)悲伶,也能持續(xù)地跟蹤容器狀態(tài)。
5住涉,為微服務(wù)定制
我們一直在講“微服務(wù)(Microservices)”的概念麸锉。Docker 可以很好地和微服務(wù)結(jié)合起來。從概念上來說舆声,一個(gè)微服務(wù)便是一個(gè)提供一整套應(yīng)用程序的部分功能花沉,Docker 便可以在開發(fā)、測試和部署過程中一直充當(dāng)微服務(wù)的容器媳握。甚至生產(chǎn)環(huán)境也可以在 Docker 中部署微服務(wù)碱屁。
6,在云服務(wù)提供商之間移植
大多數(shù)的云主機(jī)提供商已經(jīng)全面支持 Docker蛾找。對于開發(fā)人員來說娩脾,這表示你可以很方便地切換云服務(wù)提供商,當(dāng)然也可以很方便地將你本地的開發(fā)環(huán)境移動(dòng)到云主機(jī)上打毛,不需要本地上配置一次運(yùn)行環(huán)境晦雨、在云主機(jī)上還配置一次運(yùn)行環(huán)境架曹。全面部署 Docker (Docker here and Docker there) 作為標(biāo)準(zhǔn)運(yùn)行環(huán)境可以極大地減輕應(yīng)用上線時(shí)的工作量和產(chǎn)生 BUG。
7闹瞧,技術(shù)的創(chuàng)新
Docker 正在快速發(fā)展绑雄,工具也在不斷更新,沒有人能預(yù)見到未來 Docker 會(huì)是什么樣子的奥邮。你在復(fù)雜的系統(tǒng)中 Docker 使用的越多万牺,越是可能會(huì)發(fā)現(xiàn)技術(shù)上的空白和未來技術(shù)發(fā)展的方向。現(xiàn)在還處在 Docker 的發(fā)展期洽腺,任何你使用 Docker 創(chuàng)建的工具都有可能成為社區(qū)關(guān)注的熱點(diǎn)脚粟。這是 Docker 的機(jī)會(huì),也是成就你自己的機(jī)會(huì)蘸朋。
02【掌握】docker和虛擬技術(shù)比較
1核无,之前的虛擬技術(shù)
虛擬機(jī)(virtual machine)就是帶環(huán)境安裝的一種解決方案。
它可以在一種操作系統(tǒng)里面運(yùn)行另一種操作系統(tǒng)藕坯,比如在Windows 系統(tǒng)里面運(yùn)行Linux 系統(tǒng)团南。應(yīng)用程序?qū)Υ撕翢o感知,因?yàn)樘摂M機(jī)看上去跟真實(shí)系統(tǒng)一模一樣炼彪,而對于底層系統(tǒng)來說吐根,虛擬機(jī)就是一個(gè)普通文件,不需要了就刪掉辐马,對其他部分毫無影響拷橘。這類虛擬機(jī)完美的運(yùn)行了另一套系統(tǒng),能夠使應(yīng)用程序喜爷,操作系統(tǒng)和硬件三者之間的邏輯不變冗疮。
[if !vml]
[endif]
虛擬機(jī)的缺點(diǎn):
1 資源占用多 2 冗余步驟多 3 啟動(dòng)慢
2,docker容器化技術(shù)
? ??由于前面虛擬機(jī)存在這些缺點(diǎn)檩帐,Linux 發(fā)展出了另一種虛擬化技術(shù):Linux 容器(Linux Containers术幔,縮寫為 LXC)。
Linux 容器不是模擬一個(gè)完整的操作系統(tǒng)轿塔,而是對進(jìn)程進(jìn)行隔離特愿。有了容器仲墨,就可以將軟件運(yùn)行所需的所有資源打包到一個(gè)隔離的容器中勾缭。容器與虛擬機(jī)不同,不需要捆綁一整套操作系統(tǒng)目养,只需要軟件工作所需的庫資源和設(shè)置俩由。系統(tǒng)因此而變得高效輕量并保證部署在任何環(huán)境中的軟件都能始終如一地運(yùn)行。
[if !vml]
[endif]
比較了 Docker 和傳統(tǒng)虛擬化方式的不同之處:
*傳統(tǒng)虛擬機(jī)技術(shù)是虛擬出一套硬件后癌蚁,在其上運(yùn)行一個(gè)完整操作系統(tǒng)幻梯,在該系統(tǒng)上再運(yùn)行所需應(yīng)用進(jìn)程兜畸;
*而容器內(nèi)的應(yīng)用進(jìn)程直接運(yùn)行于宿主的內(nèi)核,容器內(nèi)沒有自己的內(nèi)核碘梢,而且也沒有進(jìn)行硬件虛擬咬摇。因此容器要比傳統(tǒng)虛擬機(jī)更為輕便。
* 每個(gè)容器之間互相隔離煞躬,每個(gè)容器有自己的文件系統(tǒng) 肛鹏,容器之間進(jìn)程不會(huì)相互影響,能區(qū)分計(jì)算資源恩沛。
3在扰,開發(fā)和運(yùn)維的春天
容器技術(shù)特點(diǎn):一次構(gòu)建,到處運(yùn)行[雷哥教你再也不用糾結(jié)環(huán)境問題啦]
1雷客,更快的應(yīng)用交付和部署芒珠。傳統(tǒng)的應(yīng)用開發(fā)完成后,需要提供一堆安裝程序和配置說明文檔搅裙,安裝部署后需根據(jù)配置文檔進(jìn)行繁雜的配置才能正常運(yùn)行皱卓。Docker化之后只需要交付少量容器鏡像文件,在正式生產(chǎn)環(huán)境加載鏡像并運(yùn)行即可呈宇,應(yīng)用安裝配置在鏡像里已經(jīng)內(nèi)置好好爬,大大節(jié)省部署配置和測試驗(yàn)證時(shí)間。
2甥啄,更快的和擴(kuò)縮容存炮。隨著微服務(wù)架構(gòu)和Docker的發(fā)展,大量的應(yīng)用會(huì)通過微服務(wù)方式架構(gòu)蜈漓,應(yīng)用的開發(fā)構(gòu)建將變成搭樂高積木一樣穆桂,每個(gè)Docker容器將變成一塊“積木”,應(yīng)用的升級將變得非常容易融虽。當(dāng)現(xiàn)有的容器不足以支撐業(yè)務(wù)處理時(shí)享完,可通過鏡像運(yùn)行新的容器進(jìn)行快速擴(kuò)容,使應(yīng)用系統(tǒng)的擴(kuò)容從原先的天級變成分鐘級甚至秒級有额。
3般又,更簡單的系統(tǒng)運(yùn)維。應(yīng)用容器化運(yùn)行后巍佑,生產(chǎn)環(huán)境運(yùn)行的應(yīng)用可與開發(fā)茴迁、測試環(huán)境的應(yīng)用高度一致,容器會(huì)將應(yīng)用程序相關(guān)的環(huán)境和狀態(tài)完全封裝起來萤衰,不會(huì)因?yàn)榈讓踊A(chǔ)架構(gòu)和操作系統(tǒng)的不一致性給應(yīng)用帶來影響堕义,產(chǎn)生新的BUG。當(dāng)出現(xiàn)程序異常時(shí)脆栋,也可以通過測試環(huán)境的相同容器進(jìn)行快速定位和修復(fù)倦卖。
4洒擦,更高效的計(jì)算資源利用。 Docker是內(nèi)核級虛擬化怕膛,其不像傳統(tǒng)的虛擬化技術(shù)一樣需要額外的Hypervisor支持熟嫩,所以在一臺(tái)物理機(jī)上可以運(yùn)行很多個(gè)容器實(shí)例,可大大提升物理服務(wù)器的CPU和內(nèi)存的利用率褐捻。
4邦危,企業(yè)級應(yīng)用
新浪
[if !vml]
[endif][if !vml]
[endif][if !vml]
[endif][if !vml]
[endif]
美團(tuán)
[if !vml]
[endif]
等等………………
03【掌握】docker下載
1,Docker 下載
1舍扰,官網(wǎng)http://www.docker.com
2倦蚪,中文官網(wǎng)https://docker-cn.com
2边苹,Docker 安裝前提說明
2.1 CentOS Docker 安裝
Docker支持以下的CentOS版本:
CentOS 7 (64-bit)
CentOS 6.5 (64-bit) 或更高的版本
2.2 前提條件
目前陵且,CentOS 僅發(fā)行版本中的內(nèi)核支持 Docker。
Docker 運(yùn)行在 CentOS 7上个束,要求系統(tǒng)為64位慕购、系統(tǒng)內(nèi)核版本為 3.10 以上。[我們基于7以上的版本來講的哦]
Docker 運(yùn)行在CentOS-6.5 或更高的版本的 CentOS 上茬底,要求系統(tǒng)為64位沪悲、系統(tǒng)內(nèi)核版本為 2.6.32-431 或者更高版本[。
2.3 查看自己的內(nèi)核
uname命令用于打印當(dāng)前系統(tǒng)相關(guān)信息(內(nèi)核版本號阱表、硬件架構(gòu)殿如、主機(jī)名稱和操作系統(tǒng)類型等)。
uname-r
版本OK木有問題
注意在centos6.5下面也可以安裝最爬。但是有點(diǎn)麻煩涉馁。想裝的可以自己去查資源
3,Docker 的基本組成
[if !vml]
[endif]
04【掌握】docker安裝
1爱致,centos 下安裝Docker 文檔
https://docs.docker.com/install/linux/docker-ce/centos/
2烤送,Docker 安裝
2.1,確定是centos7的版本
2.2糠悯,yum安裝gcc相關(guān)
[if !supportLineBreakNewLine]
[endif]
1帮坚,確定centos7能上外網(wǎng)
2,yum-yinstallgcc
3互艾,yum-yinstallgcc-c++
2.3试和,卸載舊版本
[if !supportLineBreakNewLine]
[endif]
yumremovedocker\
????????????????? docker-client\
????????????????? docker-client-latest\
????????????????? docker-common\
????????????????? docker-latest\
????????????????? docker-latest-logrotate\
????????????????? docker-logrotate\
????????????????? docker-engine
2.4,安裝方法
yuminstalldocker
2.5忘朝,啟動(dòng)docker
systemctlstartdocker
systemctlenabledocker開機(jī)自啟
2.6灰署,查看版本
dockerversion
2.7判帮,測試運(yùn)行 hello-world
dockerrunhello-world
由于本地沒有hello-world這個(gè)鏡像局嘁,所以會(huì)下載一個(gè)hello-world的鏡像溉箕,并在容器內(nèi)運(yùn)行。
2.8悦昵,測試運(yùn)行nginx
docker run-p8080:80-ddocker.io/nginx?? //將80端口映射為8080肴茄,或者80:80還是原先的80端口,不可以不寫但指。
測試
是不是很爽呀
2.9寡痰,卸載docker
systemctlstopdocker
yum-yremover docker
rm-rf/var/lib/docker
05【掌握】docker加速配置
為什么要加速
因?yàn)閐ocker的運(yùn)行需要在本地有相關(guān)的鏡像,如果本地沒有棋凳,就會(huì)去鏡像倉庫里面下載到本地拦坠,再運(yùn)行,有時(shí)候下載比較慢剩岳,所以要配置鏡像加速
阿里云的加速
找到加速地址
https://homenew.console.aliyun.com/
[if !vml]
[endif]?[if !vml]
[endif]
編輯
vim /etc/docker/daemon.json
修改配置
{
?"registry-mirrors":? ["https://32xw0apq.mirror.aliyuncs.com"]
}
刷新重啟
其它的加速
https://www.daocloud.io/mirror#accelerator-doc
[if !vml]
[endif]
vim /etc/docker/daemon.json
[if !vml]
[endif]
刷新重啟
[if !vml]
[endif]
06【掌握】docker底層原理
1贞滨,Docker是如何工作的
Docker是一個(gè)Client-Server結(jié)構(gòu)的系統(tǒng),Docker守護(hù)進(jìn)程運(yùn)行在主機(jī)上拍棕, 然后通過Socket連接從客戶端訪問晓铆,守護(hù)進(jìn)程從客戶端接受命令并管理運(yùn)行在主機(jī)上的容器。 容器绰播,是一個(gè)運(yùn)行時(shí)環(huán)境骄噪,就是我們前面說到的集裝箱。
[if !vml]
[endif]
2蠢箩,docker run了啥
[if !vml]
[endif]
07【掌握】docker命令[幫助+鏡像]
1链蕊,幫助命令
docker version 查看docker版本
docker info 顯示全系統(tǒng)信息
docker --help 顯示docker相關(guān)的所有命令及功能說明
2,鏡像命令
2.1 docker images ?列表本機(jī)上的鏡像
[if !vml]
[endif]
REPOSITORY:表示鏡像的倉庫源
TAG:鏡像的標(biāo)簽
IMAGE ID:鏡像ID
CREATED:鏡像創(chuàng)建時(shí)間
SIZE:鏡像大小
可選項(xiàng)
-a 列表本地的所有鏡像及子鏡像
-q 只顯示鏡像ID
--digests 顯示鏡像的摘要信息
--no-trunc 顯示完整的鏡像信息
2.2 docker search 鏡像搜索命令
搜索網(wǎng)站:https://hub.docker.com
語法
docker search 鏡像名稱
docker search 鏡像名稱 ?-[options] ? 說明
-s 列出收藏?cái)?shù)不少于指定值的鏡像
[if !vml]
[endif]
2.3 docker pull 鏡像下載命令
docker pull 鏡像名稱:[TAG]
例如:docker pull tomcat:8.5? 下載8.5的鏡像版本
????dokcer pull tomcat默認(rèn)下載最新的tomcat鏡像版本 【latest】
2.4 docker rim 鏡像刪除命令
根據(jù)鏡像ID刪除
[if !vml]
[endif]
根據(jù)鏡像倉庫刪除
[if !vml]
[endif]
批量刪除鏡像
[if !vml]
[endif]
全部刪除鏡像
[if !vml]
[endif]
08【掌握】docker命令[容器]
1谬泌、什么是容器?
?容器鏡像是一個(gè)軟件的輕量級獨(dú)立可執(zhí)行軟件包示弓,包含運(yùn)行它所需的一切:代碼,運(yùn)行時(shí)呵萨,系統(tǒng)工具奏属,系統(tǒng)庫,設(shè)置潮峦。不管環(huán)境如何囱皿,集裝箱化軟件都可以運(yùn)行相同的Linux和Windows應(yīng)用程序。容器將軟件與其周圍環(huán)境隔離開來忱嘹,例如開發(fā)環(huán)境和生產(chǎn)環(huán)境之間的差異嘱腥,并有助于減少在同一基礎(chǔ)架構(gòu)上運(yùn)行不同軟件的團(tuán)隊(duì)之間的沖突。
[if !vml]
[endif]
1.輕量級
在一臺(tái)機(jī)器上運(yùn)行的Docker容器共享該機(jī)器的操作系統(tǒng)內(nèi)核; 他們立即開始并使用更少的計(jì)算和內(nèi)存拘悦。圖像由文件系統(tǒng)層構(gòu)建并共享公用文件齿兔。這最大限度地減少了磁盤使用量,圖像下載速度更快。
2.標(biāo)準(zhǔn)
Docker容器基于開放標(biāo)準(zhǔn)分苇,可在所有主要Linux發(fā)行版添诉,Microsoft Windows以及任何基礎(chǔ)架構(gòu)(包括虛擬機(jī),裸機(jī)和云中)上運(yùn)行医寿。
3.安全
Docker容器將應(yīng)用程序彼此隔離并從底層基礎(chǔ)架構(gòu)中分離出來栏赴。Docker提供了最強(qiáng)大的默認(rèn)隔離功能,可以將應(yīng)用程序問題限制在一個(gè)容器中靖秩,而不是整個(gè)機(jī)器上须眷。
2,演示前提
? ? 有鏡像才能創(chuàng)建容器沟突,這個(gè)是根本要求(下載centos鏡像來演示)
docker pull centos
[if !vml]
[endif]
3花颗,創(chuàng)建并啟動(dòng)容器
Run
3.1語法
docker run [options] images
? [command][args] /鏡像ID
3.2options說明
有些是一個(gè)減號,有些是兩個(gè)減號
--name="容器新名字": 為容器指定一個(gè)名稱惠拭;
-d: 后臺(tái)運(yùn)行容器捎稚,并返回容器ID,也即啟動(dòng)守護(hù)式容器求橄;
-i:以交互模式運(yùn)行容器今野,通常與 -t 同時(shí)使用;
-t:為容器重新分配一個(gè)偽輸入終端罐农,通常與 -i 同時(shí)使用条霜;
-P: 隨機(jī)端口映射;
-p: 指定端口映射涵亏,有以下四種格式
ip:hostPort:containerPort
ip::containerPort
? ? ? hostPort:containerPort
containerPort
3.3交互式運(yùn)行
docker run -it centos /bin/bash
[if !vml]
[endif]
直接進(jìn)入了容器
5宰睡,退出容器
exit? 退出容器并關(guān)閉容器
ctrl+p+q 退出不關(guān)閉容器
6,列表所容器
語法
docker ps [options ]
默認(rèn)只列出正在運(yùn)行的容器
options 的參數(shù)說明
-a? 顯示所有運(yùn)行和沒有運(yùn)行的容器
-l :顯示最近創(chuàng)建的容器气筋。
-n:顯示最近n個(gè)創(chuàng)建的容器拆内。
-q :靜默模式,只顯示容器編號宠默。
--no-trunc :不截?cái)噍敵觥?/p>
7麸恍,啟動(dòng)重啟關(guān)閉容器
Docker restart 容器ID或容器名稱
[if !vml]
[endif]
Docker start 容器ID或容器名稱
Docker stop 容器ID或容器名稱
8,強(qiáng)制停止容器
docker kill 容器ID或容器名稱
9搀矫,刪除已停止的容器
#單個(gè)刪除
docker rm 容器ID
#多個(gè)刪除
docker rm -f $(docker ps -aq)
10抹沪,其它重點(diǎn)內(nèi)容
[if !supportLists]1, [endif]啟用守護(hù)式容器
docker run -d centos
問題:docker ps -a 進(jìn)行查看, 會(huì)發(fā)現(xiàn)容器已經(jīng)退出
很重要的要說明的一點(diǎn): Docker容器后臺(tái)運(yùn)行,就必須有一個(gè)前臺(tái)進(jìn)程.
2瓤球,查看容器日志
如果是后臺(tái)運(yùn)行的程序融欧,那么如何查看運(yùn)行的日志呢?
啟動(dòng)一個(gè)tomcat
docker?
? run -d -p 8080:8080 tomcat:8.5
使用日志命令查看tomcat的輸出日志
docker?
? logs? 容器ID
*??
? -t是加入時(shí)間戳
*??
? -f跟隨最新的日志打印
*??
? --tail數(shù)字 顯示最后多少條
[if !supportLists]2卦羡,[endif]查看容器運(yùn)行進(jìn)程
docker top 容器ID
4噪馏,查詢?nèi)萜鲀?nèi)部細(xì)節(jié)
docker inspect 容器ID
[if !vml]
[endif]
5麦到,進(jìn)入正在進(jìn)行的容器并以命令行交互
#方式1
docker exec -it 容器ID/bin/bash?? 重新打開一個(gè)新的終端 如果以這種方式進(jìn)入容器,可以使用exit退出欠肾。而不會(huì)關(guān)閉容器
#方式2
docker attach 容器ID
#兩種方式的區(qū)別
exec 在容器中打開新的終端 并且可以啟動(dòng)新的進(jìn)程
attach 直接進(jìn)行容器終端瓶颠,不會(huì)啟動(dòng)新的進(jìn)程
這種方式里面使用exit退出會(huì)關(guān)閉容器?如果不想關(guān)閉容器必須使用ctrl+p+q
6,進(jìn)入容器內(nèi)拷貝文件到主機(jī)
docker cp 容器ID:容器內(nèi)的路徑? 主機(jī)目錄
[if !vml]
[endif]
09【掌握】docker鏡像詳解
1董济,什么是鏡像
1.1 ? ?UnionFS(聯(lián)合文件系統(tǒng))
UnionFS(聯(lián)合文件系統(tǒng)):Union文件系統(tǒng)(UnionFS)是一種分層、輕量級并且高性能的文件系統(tǒng)要门,它支持對文件系統(tǒng)的修改作為一次提交來一層層的疊加虏肾,同時(shí)可以將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下(unite several directories into a single virtual filesystem)。Union 文件系統(tǒng)是 Docker 鏡像的基礎(chǔ)欢搜。鏡像可以通過分層來進(jìn)行繼承封豪,基于基礎(chǔ)鏡像(沒有父鏡像),可以制作各種具體的應(yīng)用鏡像炒瘟。
[if !vml]
[endif]
特性:一次同時(shí)加載多個(gè)文件系統(tǒng)吹埠,但從外面看起來,只能看到一個(gè)文件系統(tǒng)疮装,聯(lián)合加載會(huì)把各層文件系統(tǒng)疊加起來缘琅,這樣最終的文件系統(tǒng)會(huì)包含所有底層的文件和目錄
1.2 ? Docker鏡像加載原理
? ?docker的鏡像實(shí)際上由一層一層的文件系統(tǒng)組成,這種層級的文件系統(tǒng)UnionFS廓推。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引導(dǎo)加載kernel, Linux剛啟動(dòng)時(shí)會(huì)加載bootfs文件系統(tǒng)刷袍,在Docker鏡像的最底層是bootfs。這一層與我們典型的Linux/Unix系統(tǒng)是一樣的樊展,包含boot加載器和內(nèi)核呻纹。當(dāng)boot加載完成之后整個(gè)內(nèi)核就都在內(nèi)存中了,此時(shí)內(nèi)存的使用權(quán)已由bootfs轉(zhuǎn)交給內(nèi)核专缠,此時(shí)系統(tǒng)也會(huì)卸載bootfs雷酪。
?rootfs (root file system) ,在bootfs之上涝婉。包含的就是典型 Linux 系統(tǒng)中的 /dev, /proc, /bin, /etc 等標(biāo)準(zhǔn)目錄和文件哥力。rootfs就是各種不同的操作系統(tǒng)發(fā)行版,比如Ubuntu墩弯,Centos等等省骂。?
[if !vml]
[endif]
?平時(shí)我們安裝進(jìn)虛擬機(jī)的CentOS都是好幾個(gè)G,為什么docker這里才200M最住?钞澳?
[if !vml]
[endif]
對于一個(gè)精簡的OS,rootfs可以很小涨缚,只需要包括最基本的命令轧粟、工具和程序庫就可以了策治,因?yàn)榈讓又苯佑肏ost的kernel,自己只需要提供rootfs 就行了兰吟。由此可見對于不同的linux發(fā)行版,
bootfs基本是一致的, rootfs會(huì)有差別, 因此不同的發(fā)行版可以公用bootfs通惫。
1.3 ? 分層的鏡像
以我們的pull為例,在下載的過程中我們可以看到docker的鏡像好像是在一層一層的在下載
[if !vml]
[endif]
1.4 為什么docker要使用上面的這種分層結(jié)構(gòu)
最大的一個(gè)好處就是 - 共享資源
比如:有多個(gè)鏡像都從相同的 base 鏡像構(gòu)建而來混蔼,那么宿主機(jī)只需在磁盤上保存一份base鏡像履腋,
同時(shí)內(nèi)存中也只需加載一份 base 鏡像,就可以為所有容器服務(wù)了惭嚣。而且鏡像的每一層都可以被共享遵湖。
2,鏡像的特點(diǎn)
Docker鏡像都是只讀的
當(dāng)容器啟動(dòng)時(shí)晚吞,一個(gè)新的可寫的鏡像被加載到鏡像層的頂部延旧。
這一層通常被叫做容器層,容器層之下的都叫鏡像層
3槽地,鏡像的commit操作
3.1 作用
當(dāng)鏡像運(yùn)行之后可以修改容器里面的內(nèi)容迁沫,再提交成一個(gè)新的鏡像
3.2 命令語法
docker commit-m='新的鏡像的描述信息'-a='作者' 容器ID 要?jiǎng)?chuàng)建的目標(biāo)鏡像名:[標(biāo)簽名]
3.3 案例演示
1,從hub上拉一下tomcat鏡像運(yùn)行
docker run-it-p8080:8080 tomcat
p 主機(jī)端口:容器端口
P 隨機(jī)分配端口
i 交互
t 終端
[if !vml]
[endif]
[if !vml]
[endif]
[if !vml]
[endif]
從上面可以看出docs是可以訪問的哦
2捌蚊,刪除tomcat里面webapps 里面的docs項(xiàng)目
[if !vml]
[endif]
刷新頁面docs不存在了哦
[if !vml]
[endif]
3集畅,把當(dāng)前運(yùn)行的這個(gè)沒有docs的容器生成一個(gè)新的鏡像
語法
docker commit-a='作者'-m='鏡像描述'? 容器ID? 新的鏡像名/名稱:版本
案列
docker commit-a='laolei'-m='del tomcat docs'dbebc1893880?? laolei/tomcatnodocs:1.0
[if !vml]
[endif]
4,啟動(dòng)自己創(chuàng)建的鏡像和之前的對比
1 缅糟,刪除所有容器
dockerrm-f$(docker ps -aq)
2牡整,啟動(dòng)之前的鏡像
docker run-d-p8888:8080鏡像ID或倉庫ID+版本
3,啟動(dòng)自己的鏡像
docker run-d-p9999:8080鏡像ID
10【掌握】docker命令總結(jié)
[if !vml]
[endif]
11【掌握】docker容器數(shù)據(jù)卷
1溺拱,什么是容器數(shù)據(jù)卷
先來看看Docker的理念:
* 將應(yīng)用與運(yùn)行的環(huán)境打包形成容器運(yùn)行 逃贝,運(yùn)行可以伴隨著容器,但是我們對數(shù)據(jù)的要求希望是持久化的
* 容器之間希望有可能共享數(shù)據(jù)
Docker容器產(chǎn)生的數(shù)據(jù)迫摔,如果不通過docker commit生成新的鏡像沐扳,使得數(shù)據(jù)做為鏡像的一部分保存下來,
那么當(dāng)容器刪除后句占,數(shù)據(jù)自然也就沒有了沪摄。
為了能保存數(shù)據(jù)在docker中我們使用卷。
2纱烘,容器數(shù)據(jù)卷能做什么
1杨拐,容器數(shù)據(jù)的持久化
2,容器之間繼承和共享數(shù)據(jù)
3擂啥,添加數(shù)據(jù)卷的方式
3.1直接使用命令添加
①語法
docker run -it -v /宿主機(jī)目錄:/容器內(nèi)目錄 centos /bin/bash
[if !vml]
[endif]
②查看容器卷是否掛載成功
[if !vml]
[endif]
異常處理
[if !vml]
[endif]
--privileged=true
3.2使用DockerFile添加
在root下創(chuàng)建一個(gè)docker文件夾
[if !vml]
[endif]
進(jìn)入docker文件夾創(chuàng)建文件名為Dockerfile的文件
[if !vml]
[endif]
編寫Dockerfile的文件
#基于tomcat:8.5構(gòu)造一個(gè)鏡像
FROM tomcat:8.5
#加入容器卷
VOLUME
? ["/usr/local/tomcat/webapps"]
CMD echo "finished,--------success1"
CMD /bin/bash
使用Dockerfile生成自定義鏡像
[if !vml]
[endif]
生成一個(gè)鏡像 再運(yùn)行
可以使用docker inspect 容器ID查看容器卷
[if !vml]
[endif]
4哄陶,數(shù)據(jù)卷容器
4.1,作用:實(shí)現(xiàn)容器之間的數(shù)據(jù)共享
4.2哺壶,操作思路
生成一個(gè)自定義的centos
創(chuàng)建Dockerfile
[if !vml]
[endif]
使用dockerfile構(gòu)造鏡像
[if !vml]
[endif]
使用自己創(chuàng)建的鏡像啟動(dòng)一個(gè)容器
docker run -it –name=os1 mycentos01:1.0 /bin/bash
使用自己創(chuàng)建的鏡像啟動(dòng)第二個(gè)容器繼承第一個(gè)
docker run -it –name=os2 --volumes-from os1
mycentos01:1.0 /bin/bash
使用自己創(chuàng)建的鏡像啟動(dòng)第三個(gè)容器繼承第二個(gè)
docker run -it –name=os3 --volumes-from os2
mycentos01:1.0 /bin/bash
測試方法
進(jìn)入os1在mydata里面創(chuàng)建個(gè)os1.txt
進(jìn)入os2查看mydata里面也有os1.txt
在os2的mydata里面創(chuàng)建os2.txt
進(jìn)入os3查看mydata里面的數(shù)據(jù)
可以找到os1.txt和os2.txt
刪除os1之后情況
Os2 os3的mydata里面的數(shù)據(jù)不會(huì)發(fā)生變化
原因
[if !vml]
[endif]
12【掌握】Dockerfile詳解【1】
1屋吨,什么是Dockerfile
1蜒谤,Dockerfile是用來構(gòu)建Docker鏡像的構(gòu)建文件,是由一系列的命令和參數(shù)構(gòu)成的腳本
2至扰,Dokcerfile的構(gòu)建步驟
? ? ? ? 編寫Dokcerfile文件
? ? ? ? docker build 生成新的鏡像
? ? ? ? docker run 運(yùn)行鏡像
3鳍徽,以centos的鏡像為例來說明?https://hub.docker.com/_/centos
[if !vml]
[endif]
[if !vml]
[endif]
2,DockerFile構(gòu)建過程解析
2.1基礎(chǔ)知識
1敢课,每條保留字指令都必須為大寫字母后面要跟隨至少一個(gè)參數(shù)
2阶祭,指令從上到下順序執(zhí)行
3,#表示注釋
4直秆,每條指令都會(huì)創(chuàng)建一個(gè)新的鏡像層濒募,并對鏡像進(jìn)行提交
2.2大致流程
1,docker從基礎(chǔ)鏡像運(yùn)行一個(gè)容器
2切厘,執(zhí)行一條指令并對容器進(jìn)行修改
3萨咳,執(zhí)行類似于dockercommit的操作提交一個(gè)新的鏡像
4懊缺,docker再基于剛提交的新的鏡像運(yùn)行一個(gè)新的容器
5疫稿,執(zhí)行dockerfile的下一個(gè)指令再從執(zhí)行第2點(diǎn)直到?jīng)]有指令
2.3總結(jié)
從應(yīng)用軟件的角度來看,Dockerfile鹃两、Docker鏡像與Docker容器分別代表軟件的三個(gè)不同階段遗座,
*? Dockerfile是軟件的原材料
*? Docker鏡像是軟件的交付品
*? Docker容器則可以認(rèn)為是軟件的運(yùn)行態(tài)。
Dockerfile面向開發(fā)俊扳,Docker鏡像成為交付標(biāo)準(zhǔn)途蒋,Docker容器則涉及部署與運(yùn)維,三者缺一不可馋记,合力充當(dāng)Docker體系的基石号坡。
?
1Dockerfile,需要定義一個(gè)Dockerfile梯醒,Dockerfile定義了進(jìn)程需要的一切東西宽堆。
??? Dockerfile涉及的內(nèi)容包括執(zhí)行代碼或者是文件、環(huán)境變量茸习、依賴包畜隶、運(yùn)行時(shí)環(huán)境、動(dòng)態(tài)鏈接庫号胚、操作系統(tǒng)的發(fā)行版籽慢、
??? 服務(wù)進(jìn)程和內(nèi)核進(jìn)程(當(dāng)應(yīng)用進(jìn)程需要和系統(tǒng)服務(wù)和內(nèi)核進(jìn)程打交道,這時(shí)需要考慮如何設(shè)計(jì)namespace的權(quán)限控制)等等;
2Docker鏡像猫胁,在用Dockerfile定義一個(gè)文件之后箱亿,dockerbuild時(shí)會(huì)產(chǎn)生一個(gè)Docker鏡像,
??? 當(dāng)運(yùn)行Docker鏡像時(shí)弃秆,會(huì)真正開始提供服務(wù);
3Docker容器极景,容器是直接提供服務(wù)的察净。
[if !vml]
[endif]
3,DockerFile體系結(jié)構(gòu)(關(guān)鍵字---重點(diǎn)芭握痢)
FROM?基礎(chǔ)鏡像氢卡,當(dāng)前新鏡像是基于哪個(gè)鏡像的
MAINTAINER??鏡像維護(hù)者的姓名和郵箱地址
RUN??容器構(gòu)建時(shí)需要運(yùn)行的命令
EXPOSE?當(dāng)前容器對外暴露的端口
WORKDIR?指定在創(chuàng)建容器后,終端默認(rèn)登陸進(jìn)來的工作目錄
ENV?用來在構(gòu)建鏡像過程中設(shè)置環(huán)境變量
ADD?將宿主機(jī)目錄下的文件拷貝進(jìn)鏡像并且ADD命令會(huì)自動(dòng)處理URL和解壓tar包
COPY?類似ADD晨缴,拷貝文件和目錄到鏡像中 译秦,語法COPY src dest ?COPY[''src","dest"]
VOLUME?容器數(shù)據(jù)卷,用于數(shù)據(jù)保存和持久化工作
CMD?指定一個(gè)容器啟動(dòng)時(shí)要運(yùn)行的命令格式
? ? ? ? shell: ?CMD ?<命令>
? ? ? ? exec ?CMD ['可執(zhí)行文件',"參數(shù)1","參數(shù)2"]
? ? ? ? DockerFile中可以有多個(gè)CMD指令击碗,但只有最后一個(gè)生效筑悴,CMD會(huì)被docker run之后的參數(shù)替換
ENTEYPONT??指定一個(gè)容器啟動(dòng)時(shí)要運(yùn)行的命令
? ? ? ? ? ? ENTRYPOINT的目地和CMD一樣,都是在指定容器啟動(dòng)程序及參數(shù)
OBBUILD?當(dāng)構(gòu)建一個(gè)被繼承的Dockerfile時(shí)運(yùn)行命令稍途,父鏡像在被子鏡像繼承后觸發(fā)父鏡像的onbuild
4阁吝,總結(jié)
[if !vml]
[endif]
13【掌握】Dockerfile詳解【2】
1,Base鏡像的說明
docker Hub上99%的鏡像都是通過base鏡像中安裝和配置需要的軟件構(gòu)建出來的
[if !vml]
[endif]
2械拍,自定義mycentos鏡像
2.1目地
?登陸后的默認(rèn)路徑
?vim編輯器
?查看網(wǎng)絡(luò)配置ifconfig支持
[if !vml]
[endif]
2.2進(jìn)入mydocker目錄創(chuàng)建DockerFile文件編寫
cd? /mydocker
touchDockerfile
viDockerfile
向Dockerfile里面寫入內(nèi)容
#繼承父鏡像
FROMcentos
#作者和郵箱
MAINTAINERlaolei<78414842@qq.com>
#設(shè)置環(huán)境變量
ENVMYPATH/usr/local
WORKDIR$MYPATH
#安裝vim 和網(wǎng)絡(luò)工具
RUNyum-yinstallvim
RUNyum-yinstallnet-tools
#對外暴露的端口[提示作用]
EXPOSE80
#輸出
CMDecho$MYPATH
CMDecho"success--------------ok"
CMD/bin/bash
2.3使用docker build命令構(gòu)建鏡像
docker build
-t mycentos:1.2 .
[if !vml]
[endif]
[if !vml]
[endif]
[if !vml]
[endif]
2.4使用docker run命令運(yùn)行
dockerrun-itmycentos:1.2
[if !vml]
[endif]
可以看到里面可以使用ipconfig命令了哦
2.5列出鏡像的變更歷史
dockerhistory鏡像名:TAG
[if !vml]
[endif]
14【掌握】Dockerfile詳解【3】
1突勇,CMD說明
Dockerfile 中可以有多個(gè)CMD的命令,但只有最后一個(gè)生效坷虑,CMD會(huì)被docker run之后的參數(shù)替換掉
可以使用tomcat的案例演示
2.1查看tomcat的Dockerfile
[if !vml]
[endif]
從上面的可以看出最后執(zhí)行了一個(gè)catalina.sh的命令 ?相當(dāng)于./bin/catalina.sh
運(yùn)行如下命令甲馋,可以看出下圖的效果
dockerrun-it-p9999:8080tomcatls-lh
[if !vml]
[endif]
發(fā)現(xiàn)這個(gè)tomcat的容器啟動(dòng)之后就退出了
那是因?yàn)樵趩?dòng)容器的時(shí)候后面加了ls -lh那么會(huì)覆蓋Dockerfile里面的CMD ["catalina.sh", "run"]
2,ENTRYPOINT說明
使用ENTRYPOINT來運(yùn)行命令迄损,在run運(yùn)行的參數(shù)會(huì)追加到新的命令后面
3定躏,自定義ls鏡像來說明CMD和ENTRYPOINT的區(qū)別
目地:講解CMD和ENTRYOINT的區(qū)別
編寫Dockerfile
FROMcentos
CMD["ls","-a"]
構(gòu)建鏡像
dockerbuild-tmyls:1.2.
啟動(dòng)鏡像
dockerrun-itmyls:1.2-lh
[if !vml]
[endif]
出現(xiàn)錯(cuò)誤,這是因?yàn)镈ockerfile里面使用的是CMD ["ls", "-a"]運(yùn)行是傳一個(gè)-lh過去會(huì)覆蓋
修改Dockerfile
FROMcentos
ENTRYPOINT["ls","-a"]
構(gòu)建鏡像
dockerbuild-tmyls:1.3.
運(yùn)行鏡像
dockerrun-itmyls:1.3-l
[if !vml]
[endif]
發(fā)現(xiàn) 【 -l 】被追加到 ls 后面了哦
[if !vml]
[endif]
15【掌握】Dockerfile詳解【4】做一個(gè)tomcat
方案選擇
基于一個(gè)openjdk?不用配置java環(huán)境變量
基于一個(gè)centos? 要配置java的環(huán)境變量
基于一個(gè)centos創(chuàng)建一個(gè)tomcat鏡像
準(zhǔn)備工作
創(chuàng)建目錄
[if !vml]
[endif]
下載jdk
下載tomcat
[if !vml]
[endif]
創(chuàng)建并編寫Dockerfile文件
[if !vml]
[endif]
[if !vml]
[endif]
#基于centos鏡像
FROM centos
#設(shè)置作者和郵箱
MAINTAINER laolei<78414842@qq.com>
#聲明變量
ENV MYPATH /usr/local/tomcat
#創(chuàng)建tomcat的目錄
RUN mkdir -p /usr/local/java
#把tomcat和JDKcopy到/root/
ADD jdk-8u181-linux-x64.tar.gz /root/
ADD apache-tomcat-8.5.43.tar.gz /root/
#列出root目錄下的所有內(nèi)容
RUN ls -lh /root/
#把a(bǔ)pache-tomcat-8.5.43修改成tomcat
RUN mv /root/apache-tomcat-8.5.43? /root/tomcat
#把tomcat 放到/usr/local/
RUN mv /root/tomcat /usr/local/
#把jdk1.8.0_181移動(dòng)到/usr/local/java
RUN mv /root/jdk1.8.0_181?? /usr/local/java
#設(shè)置工作目錄
WORKDIR $MYPATH
#配置JAVA和tomcat環(huán)境變量
ENV JAVA_HOME
? /usr/local/java/jdk1.8.0_181
ENV CLASSPATH
? $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/tomcat
ENV CATALINA_BASE /usr/local/tomcat
ENV PATH
? $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#安裝VIM?? -y代表所有的確認(rèn)的地方全部yes
#RUN yum -y install vim
#設(shè)置對名暴露的端口? 純提示作用
EXPOSE 8080?
#打開一個(gè)終端
CMD bin/startup.sh && tail -F
? logs/catalina.out
構(gòu)造鏡像
[if !vml]
[endif]
運(yùn)行鏡像測試
[if !vml]
[endif]
[if !vml]
[endif]
16【掌握】Dockerfile詳解【5】
使用jar包做項(xiàng)目鏡像
準(zhǔn)備jar包
在linux里面創(chuàng)建一個(gè)目錄
mkdir /root/dockerfile/myjarproject
[if !vml]
[endif]
上傳jar包到linux的目錄
[if !vml]
[endif]
創(chuàng)建并編寫Dockerfile文件
[if !vml]
[endif]
構(gòu)造鏡像
[if !vml]
[endif]
[if !vml]
[endif]
使用鏡像運(yùn)行容器測試
[if !vml]
[endif]
[if !vml]
[endif]
使用war包做項(xiàng)目鏡像
準(zhǔn)備war包
[if !vml]
[endif]
在linux里面創(chuàng)建一個(gè)目錄
[if !vml]
[endif]
mkdir /root/dockerfile/mywarproject
上傳war包到linux的目錄
[if !vml]
[endif]
創(chuàng)建并編寫Dockerfile文件
[if !vml]
[endif]
構(gòu)造鏡像
[if !vml]
[endif]
使用鏡像運(yùn)行容器測試
[if !vml]
[endif]
[if !vml]
[endif]
17【熟悉】本地鏡像發(fā)布到阿里云
1芹敌,鏡像的生成方法
1痊远,docker commit
2,Dockerfile
2氏捞,本地鏡像推送到阿里云
2.1以修改的mywar的image為例來說明
[if !vml]
[endif]
2.2登陸阿里開發(fā)平臺(tái)
https://dev.aliyun.com/search.html完成登陸
打開https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
[if !vml]
[endif]
2.3創(chuàng)建鏡像倉庫
[if !vml]
[endif]
[if !vml]
[endif]
[if !vml]
[endif]
2.4設(shè)置鏡像倉庫的訪問密碼
[if !vml]
[endif]
2.5 打開阿像頁面
[if !vml]
[endif]
按里面的操作來就行了
$ sudodocker login--username=78414842@qq.com registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/laolei/mywar:[鏡像版本號]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/laolei/mywar:[鏡像版本號]
[if !vml]
[endif]
2.6 ?的阿里的公有倉庫里面查詢試試
[if !vml]
[endif]
[if !vml]
[endif]
4碧聪,把阿里云的鏡像下載到本地
4.1語法
docker pull registry.cn-hangzhou.aliyuncs.com/laolei/mywar:[鏡像版本號]
4.2案例
[if !vml]
[endif]
4.3運(yùn)行測試
[if !vml]
[endif]
[if !vml]
[endif]
18【掌握】docker常用安裝
1,安裝步驟梳理
搜索鏡像? ? docker search mysql
拉取鏡像? ? ?docker pull?
查看鏡像? ? ?docker images?
啟動(dòng)鏡像? ? ? docker run?
停止容器? ? ? docker stop 容器ID
移除容器? ? ?docker rm -f 容器ID
2幌衣,安裝tomcat
docker hub好查找tomcat鏡像 ?docker search tomcat
從docker hub上拉取tomcat鏡像到本地 ?docker pull tomcat
使用docker images查看是否有拉取到tomcat
使用tomcat鏡像運(yùn)行鏡像成為容器?
? ? docker run -it -p 8080:8080
tomcat?
? ? -p 主機(jī)端口:容器端口
? ? -P 隨機(jī)分配端口
? ? -i ?交互
? ? -t 終端 ?
3矾削,安裝mysql
docker hub上查找mysql鏡像 ?docker search mysql
[if !vml]
[endif]
docker hub上拉取mysql鏡像到本地 ?docker pull mysql:5.7
[if !vml]
[endif]
使用mysql5.7鏡像創(chuàng)建容器運(yùn)行存在問題
[if !vml]
[endif]
這是因?yàn)閙ysql鏡像一啟動(dòng)中在加設(shè)置用戶名和密碼
修改成下面的命令
docker run--namemysql-p3306:3306-eMYSQL_ROOT_PASSWORD=123456-dmysql:5.7
[if !vml]
[endif]
發(fā)現(xiàn)啟動(dòng)起來了
4,使用navcat連接一下
[if !vml]
[endif]
如果是5.7的數(shù)據(jù)庫不會(huì)報(bào)錯(cuò)
發(fā)現(xiàn)報(bào)錯(cuò)豁护,這是因?yàn)閐ocker 的mysql里面的localhost ?-root 的密碼是啟動(dòng)時(shí)設(shè)置的是123456現(xiàn)%-root的沒有設(shè)置
下面是解決方法
1, 進(jìn)入mysql的docker 容器
docker exec-itmysql /bin/bash
2哼凯,登陸mysql
mysql-uroot-p
輸入密碼
3,使用mysql數(shù)據(jù)庫
use mysql
4,執(zhí)行修改密碼的命令
update usersetpassword=password(123456) wherehost='%'
5,重啟mysql的docker 容器
exit退出
exit退出mysql容器
dockerrestartmysql
再就可以進(jìn)行遠(yuǎn)程連接了哦
[if !vml]
[endif]
如果出現(xiàn)使用宿主機(jī)IP無法訪問的情況 在宿主機(jī)里面執(zhí)行如下命令
請順序運(yùn)行以下命令:
nmcli connection modify docker0
connection.zone trusted
systemctl stop NetworkManager.service
firewall-cmd --permanent --zone=trusted
--change-interface=docker0
systemctl start NetworkManager.service
nmcli connection modify docker0
connection.zone trusted
systemctl restart docker.service
再重啟mysql和tomcat的容器
5,相關(guān)文件地址配置?
可以在運(yùn)行容器時(shí)設(shè)置 :
docker run -p 3306:3306 --name mysql -v
$PWD/conf/my.cnf:/etc/mysql/my.cnf -v $PWD/logs:/logs -v $PWD/data:/mysql_data
-e MYSQL_ROOT_PASSWORD=123456 -d mysql
但要求對應(yīng)路徑對應(yīng)文件已存在楚里,才能成功掛載相內(nèi)容到對應(yīng)位置断部。
命令說明:
-p 3306:3306:將容器的3306端口映射到主機(jī)的3306端口
-v $PWD/conf/my.cnf:/etc/mysql/my.cnf:將主機(jī)當(dāng)前目錄下的conf/my.cnf掛載到容器的/etc/mysql/my.cnf
-v $PWD/logs:/logs:將主機(jī)當(dāng)前目錄下的logs目錄掛載到容器的/logs
-v $PWD/data:/mysql_data:將主機(jī)當(dāng)前目錄下的data目錄掛載到容器的/mysql_data
-e MYSQL_ROOT_PASSWORD=123456:初始化root用戶的密碼
19【掌握】Docker的四種網(wǎng)絡(luò)模式
1,概述
docker run創(chuàng)建Docker容器時(shí)班缎,可以用–net選項(xiàng)指定容器的網(wǎng)絡(luò)模式蝴光,Docker有以下4種網(wǎng)絡(luò)模式:
bridge模式:使--net =bridge指定她渴,默認(rèn)設(shè)置;
host模式:使--net =host指定蔑祟;
none模式:使--net =none指定趁耗;
container模式:使--net =container:NAMEorID指定。
可以使用docker network ls來查看
[if !vml]
[endif]
下面我們分別來講解docker的四種網(wǎng)絡(luò)模式:
2疆虚,bridge模式
bridge模式是Docker默認(rèn)的網(wǎng)絡(luò)設(shè)置苛败,此模式會(huì)為每一個(gè)容器分配Network Namespace、設(shè)置IP等径簿,并將并將一個(gè)主機(jī)上的Docker容器連接到一個(gè)虛擬網(wǎng)橋上罢屈。當(dāng)Docker server啟動(dòng)時(shí),會(huì)在主機(jī)上創(chuàng)建一個(gè)名為docker0的虛擬網(wǎng)橋篇亭,此主機(jī)上啟動(dòng)的Docker容器會(huì)連接到這個(gè)虛擬網(wǎng)橋上缠捌。虛擬網(wǎng)橋的工作方式和物理交換機(jī)類似,這樣主機(jī)上的所有容器就通過交換機(jī)連在了一個(gè)二層網(wǎng)絡(luò)中译蒂。接下來就要為容器分配IP了曼月,Docker會(huì)從RFC1918所定義的私有IP網(wǎng)段中,選擇一個(gè)和宿主機(jī)不同的IP地址和子網(wǎng)分配給docker0蹂随,連接到docker0的容器就從這個(gè)子網(wǎng)中選擇一個(gè)未占用的IP使用十嘿。如一般Docker會(huì)使用172.17.0.0/16這個(gè)網(wǎng)段因惭,并將172.17.42.1/16分配給docker0網(wǎng)橋(在主機(jī)上使用ip addr命令是可以看到docker0的岳锁,可以認(rèn)為它是網(wǎng)橋的管理端口,在宿主機(jī)上作為一塊虛擬網(wǎng)卡使用)蹦魔。
具體操作:
啟動(dòng)容器:(由于是默認(rèn)設(shè)置激率,這里沒指定網(wǎng)絡(luò)–net
=bridge,可以看到容器內(nèi)創(chuàng)建了eth0)
[if !vml]
[endif]
使用ping命令連接Host網(wǎng)絡(luò)發(fā)現(xiàn)勿决,容器與Host網(wǎng)絡(luò)是連通的:
[if !vml]
[endif]
eth0實(shí)際上是veth pair的一端,另一端(veth945c)連接在docker0網(wǎng)橋上:
[if !vml]
[endif]
3,host模式
如果啟動(dòng)容器的時(shí)候使用host模式均牢,那么這個(gè)容器將不會(huì)獲得一個(gè)獨(dú)立的Network
Namespace涩禀,而是和宿主機(jī)共用一個(gè)Network Namespace。容器將不會(huì)虛擬出自己的網(wǎng)卡咆繁,配置自己的IP等讳推,而是使用宿主機(jī)的IP和端口。
使用host模式啟動(dòng)容器:
[if !vml]
[endif]
使用host模式啟動(dòng)容器后可以發(fā)現(xiàn)玩般,使用ip addr查看網(wǎng)絡(luò)環(huán)境時(shí)银觅,看到的都是宿主機(jī)上的信息。這種方式創(chuàng)建出來的容器坏为,可以看到host上的所有網(wǎng)絡(luò)設(shè)備究驴。
容器中镊绪,對這些設(shè)備有全部的訪問權(quán)限。因此docker提示我們洒忧,這種方式是不安全的蝴韭。如果在隔離良好的環(huán)境中(比如租戶的虛擬機(jī)中)使用這種方式,問題不大熙侍。
4万皿,none模式
在none模式下,Docker容器擁有自己的Network Namespace核行,但是牢硅,并不為Docker容器進(jìn)行任何網(wǎng)絡(luò)配置。也就是說芝雪,這個(gè)Docker容器沒有網(wǎng)卡减余、IP、路由等信息惩系。需要我們自己為Docker容器添加網(wǎng)卡位岔、配置IP等。
使用--net =none模式啟動(dòng)容器:
[if !vml]
[endif]
5堡牡,container模式
這個(gè)模式指定新創(chuàng)建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè)Network Namespace抒抬,而不是和宿主機(jī)共享。新創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡晤柄,配置自己的IP擦剑,而是和一個(gè)指定的容器共享IP、端口范圍等芥颈。同樣惠勒,兩個(gè)容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)爬坑、進(jìn)程列表等還是隔離的纠屋。兩個(gè)容器的進(jìn)程可以通過lo網(wǎng)卡設(shè)備通信。
使用--net =container模式啟動(dòng)容器:
[if !vml]
[endif]
通過該例子可以看出來盾计,兩者的網(wǎng)絡(luò)完全相同售担。
20【了解】docker搭建GitLab
1,安裝Centos
注意點(diǎn):
? ? ? 1署辉,如果是VM里面安裝要選擇橋接模式族铆,要不然局域網(wǎng)無法訪問的哦
[if !vml]
[endif]
? ? ? 2,處理器和內(nèi)存選擇兩核4G的
[if !vml]
[endif]
2涨薪,修改Linux的22端口
以后只能使用修改之后的端口登陸了
[if !vml]
[endif]
vim /etc/ssh/sshd_config
[if !vml]
[endif]
讓配置生效 ?并重啟Linux
semanage port -a -t ssh_port_t -p tcp 10086
如果不能執(zhí)行先安裝一下
yum? install policycoreutils-python
// 把新的Port口告訴SELinux
# semanage port -a -t ssh_port_t -p tcp 10086
// 重啟ssh
# systemctl restart sshd.service
// 查看ssh狀態(tài)
# service sshd status
// 關(guān)閉防火墻
# systemctl stop firewalld.service
3骑素,安裝docker
https://docs.docker.com/install/linux/docker-ce/centos/
如果之前有docker的版本,請先刪除原來的版本
按官網(wǎng)的步驟來
4,運(yùn)行鏡像
https://hub.docker.com/r/twang2218/gitlab-ce-zh
時(shí)間可能比較長
docker run-d\
??? --hostnamewww.code.com \
??? -p80:80 \
??? -p443:443 \
??? -p22:22 \
??? --namegitlab \
??? --restartunless-stopped \
??? -vgitlab-config:/etc/gitlab \
??? -vgitlab-logs:/var/log/gitlab \
??? -vgitlab-data:/var/opt/gitlab \
??? twang2218/gitlab-ce-zh
注意上面的hostnamewww.code.com?需要在使用者的電腦的host文件里面配置
5献丑,異常處理
重啟docker?
重啟容器
6末捣,基本使用
注冊。登陸
[if !vml]
[endif]
感謝雷哥的視頻(第一次寫請大佬們不要噴我這個(gè)菜逼)https://ke.qq.com/webcourse/index.html#cid=469242&term_id=100561719&taid=3997484976646394&vid=5285890796224454021