docker入門

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

3,倉庫https://hub.docker.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端口,不可以不寫但指。

測試

http://192.168.15.134:8080/

是不是很爽呀

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末创橄,一起剝皮案震驚了整個(gè)濱河市箩做,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妥畏,老刑警劉巖邦邦,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異醉蚁,居然都是意外死亡燃辖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門网棍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黔龟,“玉大人,你說我怎么就攤上這事滥玷∈仙恚” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵惑畴,是天一觀的道長蛋欣。 經(jīng)常有香客問我,道長如贷,這世上最難降的妖魔是什么陷虎? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮倒得,結(jié)果婚禮上泻红,老公的妹妹穿的比我還像新娘夭禽。我一直安慰自己霞掺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布讹躯。 她就那樣靜靜地躺著菩彬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪潮梯。 梳的紋絲不亂的頭發(fā)上骗灶,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音秉馏,去河邊找鬼耙旦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛萝究,可吹牛的內(nèi)容都是我干的免都。 我是一名探鬼主播锉罐,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绕娘!你這毒婦竟也來了脓规?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤险领,失蹤者是張志新(化名)和其女友劉穎侨舆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绢陌,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挨下,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脐湾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片复颈。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖沥割,靈堂內(nèi)的尸體忽然破棺而出耗啦,到底是詐尸還是另有隱情,我是刑警寧澤机杜,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布帜讲,位于F島的核電站,受9級特大地震影響椒拗,放射性物質(zhì)發(fā)生泄漏似将。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一蚀苛、第九天 我趴在偏房一處隱蔽的房頂上張望在验。 院中可真熱鬧,春花似錦堵未、人聲如沸腋舌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽块饺。三九已至,卻和暖如春雌芽,著一層夾襖步出監(jiān)牢的瞬間授艰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工世落, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淮腾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像谷朝,于是被迫代替她去往敵國和親篮灼。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354