01【熟悉】docker簡介
1,什么是docker
? ??? ??Docker是一個開源項目,誕生于2013年初,最初是dotCloud公司內(nèi)部的一個業(yè)余項目。它基于Google公司推出的Go語言實現(xiàn)。項目后來加入了Linux基金會,遵從了Apache2.0協(xié)議,項目代碼在GitHub上進行維護。Docker自開源后受到廣范的關(guān)注和討論,以至于dotCloud公司后來都改名為Docker Inc。RedHat已經(jīng)在其RHEL6.5中集中支持Docker;Google也在其PaaS產(chǎn)品中廣泛應(yīng)用。Docker的目標是實現(xiàn)經(jīng)量級的操作系統(tǒng)虛擬化解決方案。Docker的基礎(chǔ)是Linux容器(LXC)等技術(shù)。在LXC的基礎(chǔ)上Docker進行了進一步的封裝,讓用戶不需要關(guān)心容器的管理,使得操作更加簡單。用戶操作Docker的容器就像操作一個快速輕量級的虛擬機一樣簡單。
? ??? ??下圖比較了Docker和傳統(tǒng)虛擬化方式的不同之處,可見容器是在操作系統(tǒng)層面上實現(xiàn)的虛擬化,直接復(fù)用本地主機的操作系統(tǒng),而傳統(tǒng)方式則是在硬件層現(xiàn)實現(xiàn)
[if !vml]
[endif]
2,docker的設(shè)計思想
? ??? ??Docker的思想來自于集裝箱,集裝箱解決了什么問題?在一艘大船上,可以把貨物規(guī)整的擺放起來。并且各種各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。那么我就不需要專門運送水果的船和專門運送化學(xué)品的船了。只要這些貨物在集裝箱里封裝的好好的,那我就可以用一艘大船把他們都運走。docker就是類似的理念。現(xiàn)在都流行云計算了,云計算就好比大貨輪。docker就是集裝箱。
1.不同的應(yīng)用程序可能會有不同的應(yīng)用環(huán)境,比如.net開發(fā)的網(wǎng)站和php開發(fā)的網(wǎng)站依賴的軟件就不一樣,如果把他們依賴的軟件都安裝在一個服務(wù)器上就要調(diào)試很久,而且很麻煩,還會造成一些沖突。比如IIS和Apache訪問端口沖突。這個時候你就要隔離.net開發(fā)的網(wǎng)站和php開發(fā)的網(wǎng)站。常規(guī)來講,我們可以在服務(wù)器上創(chuàng)建不同的虛擬機在不同的虛擬機上放置不同的應(yīng)用,但是虛擬機開銷比較高。docker可以實現(xiàn)虛擬機隔離應(yīng)用環(huán)境的功能,并且開銷比虛擬機小,小就意味著省錢了。
2.你開發(fā)軟件的時候用的是Ubuntu,但是運維管理的都是centos,運維在把你的軟件從開發(fā)環(huán)境轉(zhuǎn)移到生產(chǎn)環(huán)境的時候就會遇到一些Ubuntu轉(zhuǎn)centos的問題,比如:有個特殊版本的數(shù)據(jù)庫,只有Ubuntu支持,centos不支持,在轉(zhuǎn)移的過程當中運維就得想辦法解決這樣的問題。這時候要是有docker你就可以把開發(fā)環(huán)境直接封裝轉(zhuǎn)移給運維,運維直接部署你給他的docker就可以了。而且部署速度快。
3.在服務(wù)器負載方面,如果你單獨開一個虛擬機,那么虛擬機會占用空閑內(nèi)存的,docker部署的話,這些內(nèi)存就會利用起來。
總之docker就是集裝箱原理。
3,為什么要使用docker
? ??? ??作為一種新興的虛擬化方式,Docker 跟傳統(tǒng)的虛擬化方式相比具有眾多的優(yōu)勢。首先,Docker 容器的啟動可以在秒級實現(xiàn),這相比傳統(tǒng)的虛擬機方式要快得多。其次,Docker 對系統(tǒng)資源的利用率很高,一臺主機上可以同時運行數(shù)千個Docker 容器。
容器除了運行其中應(yīng)用外,基本不消耗額外的系統(tǒng)資源,使得應(yīng)用的性能很高,同時系統(tǒng)的開銷盡量小。
傳統(tǒng)虛擬機方式運行10 個不同的應(yīng)用就要起10 個虛擬機,而Docker 只需要啟動10 個隔離的應(yīng)用即可。具體說來,Docker 在如下幾個方面具有較大的優(yōu)勢。
1,更快速的交付和部署
對開發(fā)和運維(devop)人員來說,最希望的就是一次創(chuàng)建或配置,可以在任意地方正常運行。開發(fā)者可以使用一個標準的鏡像來構(gòu)建一套開發(fā)容器,開發(fā)完成之后,運維人員可以直接使用這個容器來部署代碼。Docker 可以快速創(chuàng)建容器,快速迭代應(yīng)用程序,并讓整個過程全程可見,使團隊中的其他成員更容易理解應(yīng)用程序是如何創(chuàng)建和工作的。Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節(jié)約開發(fā)、測試、部署的時間.
2,更輕松的遷移和擴展
Docker 容器幾乎可以在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、個人電腦、服務(wù)器
等。這種兼容性可以讓用戶把一個應(yīng)用程序從一個平臺直接遷移到另外一個。
3,更簡單的管理
使用Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發(fā)和更新,從而實現(xiàn)自動化并且高效的管理。對比虛擬機
[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公用一部分的運行庫
[if !supportLists]4.???[endif]網(wǎng)絡(luò)管理相對簡單,主要是基于namespace隔離
[if !supportLists]5.???[endif]cgroup的cpu和cpuset提供的cpu功能相比KVM的等虛擬化方案相比難以度量(所以dotcloud主要是按內(nèi)存收費)
[if !supportLists]6.???[endif]Docker對disk的管理比較有限
[if !supportLists]7.???[endif]container隨著用戶進程的停止而銷毀,container中的log等用戶數(shù)據(jù)不便收集
4,docker在開發(fā)、測試、部署中的定位
1,嘗試新軟件
對開發(fā)者而言,每天會催生出的各式各樣的新技術(shù)都需要嘗試,然而開發(fā)者卻不太可能為他們一一搭建好環(huán)境并進行測試。時間非常寶貴,正是得益于 Docker,讓我們有
可能在一條或者幾條命令內(nèi)就搭建完環(huán)境。Docker 有一個傻瓜化的獲取軟件的方法,Docker 后臺會自動獲得環(huán)境鏡像并且運行環(huán)境。
并不僅僅是新技術(shù)環(huán)境搭建用得到 Docker。如果你想快速在你的筆記本上運行一個 MySQL 數(shù)據(jù)庫,或者一個 Redis 消息隊列,那么使用 Docker 便可以非常容易地做到。例如 Docker 只需要一條命令便可以運行 MySQL 數(shù)據(jù)庫:docker run -d -p 3306:3306 tutum/mysql。
2,進行演示
工作中自己開發(fā)的成果對客戶或者別人做一兩個演示。搭建演示環(huán)境的過程非常麻煩。Docker是演示這些工具的最合理的方式。同時,對于客戶來說,可以直接將 Docker?鏡像提供給他們,而不必去做任何環(huán)境配置的工作,工作的效果也會和在他們演示中所看到的一模一樣,同時不必擔心他們的環(huán)境配置會導(dǎo)致我們的產(chǎn)品無法運行。
3,避免“我機器上可以運行”
無論是上一篇介紹的企業(yè)部署 Docker 還是本文的個人 Docker 用例,都提到了這個情況。因為環(huán)境配置不同,很多人在開發(fā)中也會遇到這個情況,甚至開發(fā)的軟件到了測試人員的機器上便不能運行。但這都不是重點。重點是,如果我們有一個可靠的、可分發(fā)的標準開發(fā)環(huán)境,那么我們的開發(fā)將不會像現(xiàn)在這么痛苦。Docker 便可以解決這個問題。Docker 鏡像并不會因為環(huán)境的變化而不能運行,也不會在不同的電腦上有不同的運行結(jié)果??梢越o測試人員提交含有應(yīng)用的 Docker 鏡像,這樣便不再會發(fā)生“在我機器上是可以運行的”這種事情,很大程度上減輕了開發(fā)人員測試人員互相檢查機器環(huán)境設(shè)置帶來的時間成本。
4,更好地利用資源
虛擬機的粒度是“虛擬出的機器”,而 Docker 的粒度則是“被限制的應(yīng)用”,相比較而言 Docker 的內(nèi)存占用更少,更加輕量級。對我來說這是 Docker 的一個優(yōu)勢:因為在如果在電腦中運行多個 Docker 應(yīng)用,使用 Docker 比使用虛擬機更加簡單,方便,粒度更細,也能持續(xù)地跟蹤容器狀態(tài)。
5,為微服務(wù)定制
我們一直在講“微服務(wù)(Microservices)”的概念。Docker 可以很好地和微服務(wù)結(jié)合起來。從概念上來說,一個微服務(wù)便是一個提供一整套應(yīng)用程序的部分功能,Docker 便可以在開發(fā)、測試和部署過程中一直充當微服務(wù)的容器。甚至生產(chǎn)環(huán)境也可以在 Docker 中部署微服務(wù)。
6,在云服務(wù)提供商之間移植
大多數(shù)的云主機提供商已經(jīng)全面支持 Docker。對于開發(fā)人員來說,這表示你可以很方便地切換云服務(wù)提供商,當然也可以很方便地將你本地的開發(fā)環(huán)境移動到云主機上,不需要本地上配置一次運行環(huán)境、在云主機上還配置一次運行環(huán)境。全面部署 Docker (Docker here and Docker there) 作為標準運行環(huán)境可以極大地減輕應(yīng)用上線時的工作量和產(chǎn)生 BUG。
7,技術(shù)的創(chuàng)新
Docker 正在快速發(fā)展,工具也在不斷更新,沒有人能預(yù)見到未來 Docker 會是什么樣子的。你在復(fù)雜的系統(tǒng)中 Docker 使用的越多,越是可能會發(fā)現(xiàn)技術(shù)上的空白和未來技術(shù)發(fā)展的方向?,F(xiàn)在還處在 Docker 的發(fā)展期,任何你使用 Docker 創(chuàng)建的工具都有可能成為社區(qū)關(guān)注的熱點。這是 Docker 的機會,也是成就你自己的機會。
02【掌握】docker和虛擬技術(shù)比較
1,之前的虛擬技術(shù)
虛擬機(virtual machine)就是帶環(huán)境安裝的一種解決方案。
它可以在一種操作系統(tǒng)里面運行另一種操作系統(tǒng),比如在Windows 系統(tǒng)里面運行Linux 系統(tǒng)。應(yīng)用程序?qū)Υ撕翢o感知,因為虛擬機看上去跟真實系統(tǒng)一模一樣,而對于底層系統(tǒng)來說,虛擬機就是一個普通文件,不需要了就刪掉,對其他部分毫無影響。這類虛擬機完美的運行了另一套系統(tǒng),能夠使應(yīng)用程序,操作系統(tǒng)和硬件三者之間的邏輯不變。
[if !vml]
[endif]
虛擬機的缺點:
1 資源占用多 2 冗余步驟多 3 啟動慢
2,docker容器化技術(shù)
? ??由于前面虛擬機存在這些缺點,Linux 發(fā)展出了另一種虛擬化技術(shù):Linux 容器(Linux Containers,縮寫為 LXC)。
Linux 容器不是模擬一個完整的操作系統(tǒng),而是對進程進行隔離。有了容器,就可以將軟件運行所需的所有資源打包到一個隔離的容器中。容器與虛擬機不同,不需要捆綁一整套操作系統(tǒng),只需要軟件工作所需的庫資源和設(shè)置。系統(tǒng)因此而變得高效輕量并保證部署在任何環(huán)境中的軟件都能始終如一地運行。
[if !vml]
[endif]
比較了 Docker 和傳統(tǒng)虛擬化方式的不同之處:
*傳統(tǒng)虛擬機技術(shù)是虛擬出一套硬件后,在其上運行一個完整操作系統(tǒng),在該系統(tǒng)上再運行所需應(yīng)用進程;
*而容器內(nèi)的應(yīng)用進程直接運行于宿主的內(nèi)核,容器內(nèi)沒有自己的內(nèi)核,而且也沒有進行硬件虛擬。因此容器要比傳統(tǒng)虛擬機更為輕便。
* 每個容器之間互相隔離,每個容器有自己的文件系統(tǒng) ,容器之間進程不會相互影響,能區(qū)分計算資源。
3,開發(fā)和運維的春天
容器技術(shù)特點:一次構(gòu)建,到處運行[雷哥教你再也不用糾結(jié)環(huán)境問題啦]
1,更快的應(yīng)用交付和部署。傳統(tǒng)的應(yīng)用開發(fā)完成后,需要提供一堆安裝程序和配置說明文檔,安裝部署后需根據(jù)配置文檔進行繁雜的配置才能正常運行。Docker化之后只需要交付少量容器鏡像文件,在正式生產(chǎn)環(huán)境加載鏡像并運行即可,應(yīng)用安裝配置在鏡像里已經(jīng)內(nèi)置好,大大節(jié)省部署配置和測試驗證時間。
2,更快的和擴縮容。隨著微服務(wù)架構(gòu)和Docker的發(fā)展,大量的應(yīng)用會通過微服務(wù)方式架構(gòu),應(yīng)用的開發(fā)構(gòu)建將變成搭樂高積木一樣,每個Docker容器將變成一塊“積木”,應(yīng)用的升級將變得非常容易。當現(xiàn)有的容器不足以支撐業(yè)務(wù)處理時,可通過鏡像運行新的容器進行快速擴容,使應(yīng)用系統(tǒng)的擴容從原先的天級變成分鐘級甚至秒級。
3,更簡單的系統(tǒng)運維。應(yīng)用容器化運行后,生產(chǎn)環(huán)境運行的應(yīng)用可與開發(fā)、測試環(huán)境的應(yīng)用高度一致,容器會將應(yīng)用程序相關(guān)的環(huán)境和狀態(tài)完全封裝起來,不會因為底層基礎(chǔ)架構(gòu)和操作系統(tǒng)的不一致性給應(yīng)用帶來影響,產(chǎn)生新的BUG。當出現(xiàn)程序異常時,也可以通過測試環(huán)境的相同容器進行快速定位和修復(fù)。
4,更高效的計算資源利用。 Docker是內(nèi)核級虛擬化,其不像傳統(tǒng)的虛擬化技術(shù)一樣需要額外的Hypervisor支持,所以在一臺物理機上可以運行很多個容器實例,可大大提升物理服務(wù)器的CPU和內(nèi)存的利用率。
4,企業(yè)級應(yīng)用
新浪
[if !vml]
[endif][if !vml]
[endif][if !vml]
[endif][if !vml]
[endif]
美團
[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 運行在 CentOS 7上,要求系統(tǒng)為64位、系統(tǒng)內(nèi)核版本為 3.10 以上。[我們基于7以上的版本來講的哦]
Docker 運行在CentOS-6.5 或更高的版本的 CentOS 上,要求系統(tǒng)為64位、系統(tǒng)內(nèi)核版本為 2.6.32-431 或者更高版本[。
2.3 查看自己的內(nèi)核
uname命令用于打印當前系統(tǒng)相關(guān)信息(內(nèi)核版本號、硬件架構(gòu)、主機名稱和操作系統(tǒng)類型等)。
uname-r

版本OK木有問題
注意在centos6.5下面也可以安裝。但是有點麻煩。想裝的可以自己去查資源
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,啟動docker
systemctlstartdocker
systemctlenabledocker開機自啟
2.6,查看版本
dockerversion
2.7,測試運行 hello-world
dockerrunhello-world
由于本地沒有hello-world這個鏡像,所以會下載一個hello-world的鏡像,并在容器內(nèi)運行。

2.8,測試運行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加速配置
為什么要加速
因為docker的運行需要在本地有相關(guān)的鏡像,如果本地沒有,就會去鏡像倉庫里面下載到本地,再運行,有時候下載比較慢,所以要配置鏡像加速
阿里云的加速
找到加速地址
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是一個Client-Server結(jié)構(gòu)的系統(tǒng),Docker守護進程運行在主機上, 然后通過Socket連接從客戶端訪問,守護進程從客戶端接受命令并管理運行在主機上的容器。 容器,是一個運行時環(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 ?列表本機上的鏡像
[if !vml]
[endif]
REPOSITORY:表示鏡像的倉庫源
TAG:鏡像的標簽
IMAGE ID:鏡像ID
CREATED:鏡像創(chuàng)建時間
SIZE:鏡像大小
可選項
-a 列表本地的所有鏡像及子鏡像
-q 只顯示鏡像ID
--digests 顯示鏡像的摘要信息
--no-trunc 顯示完整的鏡像信息
2.2 docker search 鏡像搜索命令
搜索網(wǎng)站:https://hub.docker.com
語法
docker search 鏡像名稱
docker search 鏡像名稱 ?-[options] ? 說明
-s 列出收藏數(shù)不少于指定值的鏡像
[if !vml]
[endif]
2.3 docker pull 鏡像下載命令
docker pull 鏡像名稱:[TAG]
例如:docker pull tomcat:8.5? 下載8.5的鏡像版本
????dokcer pull tomcat默認下載最新的tomcat鏡像版本 【latest】
2.4 docker rim 鏡像刪除命令
根據(jù)鏡像ID刪除
[if !vml]
[endif]
根據(jù)鏡像倉庫刪除
[if !vml]
[endif]
批量刪除鏡像
[if !vml]
[endif]
全部刪除鏡像
[if !vml]
[endif]
08【掌握】docker命令[容器]
1、什么是容器?
?容器鏡像是一個軟件的輕量級獨立可執(zhí)行軟件包,包含運行它所需的一切:代碼,運行時,系統(tǒng)工具,系統(tǒng)庫,設(shè)置。不管環(huán)境如何,集裝箱化軟件都可以運行相同的Linux和Windows應(yīng)用程序。容器將軟件與其周圍環(huán)境隔離開來,例如開發(fā)環(huán)境和生產(chǎn)環(huán)境之間的差異,并有助于減少在同一基礎(chǔ)架構(gòu)上運行不同軟件的團隊之間的沖突。
[if !vml]
[endif]
1.輕量級
在一臺機器上運行的Docker容器共享該機器的操作系統(tǒng)內(nèi)核; 他們立即開始并使用更少的計算和內(nèi)存。圖像由文件系統(tǒng)層構(gòu)建并共享公用文件。這最大限度地減少了磁盤使用量,圖像下載速度更快。
2.標準
Docker容器基于開放標準,可在所有主要Linux發(fā)行版,Microsoft Windows以及任何基礎(chǔ)架構(gòu)(包括虛擬機,裸機和云中)上運行。
3.安全
Docker容器將應(yīng)用程序彼此隔離并從底層基礎(chǔ)架構(gòu)中分離出來。Docker提供了最強大的默認隔離功能,可以將應(yīng)用程序問題限制在一個容器中,而不是整個機器上。
2,演示前提
? ? 有鏡像才能創(chuàng)建容器,這個是根本要求(下載centos鏡像來演示)
docker pull centos
[if !vml]
[endif]
3,創(chuàng)建并啟動容器
Run
3.1語法
docker run [options] images
? [command][args] /鏡像ID
3.2options說明
有些是一個減號,有些是兩個減號
--name="容器新名字": 為容器指定一個名稱;
-d: 后臺運行容器,并返回容器ID,也即啟動守護式容器;
-i:以交互模式運行容器,通常與 -t 同時使用;
-t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
-P: 隨機端口映射;
-p: 指定端口映射,有以下四種格式
ip:hostPort:containerPort
ip::containerPort
? ? ? hostPort:containerPort
containerPort
3.3交互式運行
docker run -it centos /bin/bash
[if !vml]
[endif]
直接進入了容器
5,退出容器
exit? 退出容器并關(guān)閉容器
ctrl+p+q 退出不關(guān)閉容器
6,列表所容器
語法
docker ps [options ]
默認只列出正在運行的容器
options 的參數(shù)說明
-a? 顯示所有運行和沒有運行的容器
-l :顯示最近創(chuàng)建的容器。
-n:顯示最近n個創(chuàng)建的容器。
-q :靜默模式,只顯示容器編號。
--no-trunc :不截斷輸出。
7,啟動重啟關(guān)閉容器
Docker restart 容器ID或容器名稱
[if !vml]
[endif]
Docker start 容器ID或容器名稱
Docker stop 容器ID或容器名稱
8,強制停止容器
docker kill 容器ID或容器名稱
9,刪除已停止的容器
#單個刪除
docker rm 容器ID
#多個刪除
docker rm -f $(docker ps -aq)
10,其它重點內(nèi)容
[if !supportLists]1, [endif]啟用守護式容器
docker run -d centos
問題:docker ps -a 進行查看, 會發(fā)現(xiàn)容器已經(jīng)退出
很重要的要說明的一點: Docker容器后臺運行,就必須有一個前臺進程.
2,查看容器日志
如果是后臺運行的程序,那么如何查看運行的日志呢?
啟動一個tomcat
docker?
? run -d -p 8080:8080 tomcat:8.5
使用日志命令查看tomcat的輸出日志
docker?
? logs? 容器ID
*??
? -t是加入時間戳
*??
? -f跟隨最新的日志打印
*??
? --tail數(shù)字 顯示最后多少條
[if !supportLists]2,[endif]查看容器運行進程
docker top 容器ID
4,查詢?nèi)萜鲀?nèi)部細節(jié)
docker inspect 容器ID
[if !vml]
[endif]
5,進入正在進行的容器并以命令行交互
#方式1
docker exec -it 容器ID/bin/bash?? 重新打開一個新的終端 如果以這種方式進入容器,可以使用exit退出。而不會關(guān)閉容器
#方式2
docker attach 容器ID
#兩種方式的區(qū)別
exec 在容器中打開新的終端 并且可以啟動新的進程
attach 直接進行容器終端,不會啟動新的進程
這種方式里面使用exit退出會關(guān)閉容器?如果不想關(guān)閉容器必須使用ctrl+p+q
6,進入容器內(nèi)拷貝文件到主機
docker cp 容器ID:容器內(nèi)的路徑? 主機目錄
[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)的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統(tǒng)下(unite several directories into a single virtual filesystem)。Union 文件系統(tǒng)是 Docker 鏡像的基礎(chǔ)。鏡像可以通過分層來進行繼承,基于基礎(chǔ)鏡像(沒有父鏡像),可以制作各種具體的應(yīng)用鏡像。
[if !vml]
[endif]
特性:一次同時加載多個文件系統(tǒng),但從外面看起來,只能看到一個文件系統(tǒng),聯(lián)合加載會把各層文件系統(tǒng)疊加起來,這樣最終的文件系統(tǒng)會包含所有底層的文件和目錄
1.2 ? Docker鏡像加載原理
? ?docker的鏡像實際上由一層一層的文件系統(tǒng)組成,這種層級的文件系統(tǒng)UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引導(dǎo)加載kernel, Linux剛啟動時會加載bootfs文件系統(tǒng),在Docker鏡像的最底層是bootfs。這一層與我們典型的Linux/Unix系統(tǒng)是一樣的,包含boot加載器和內(nèi)核。當boot加載完成之后整個內(nèi)核就都在內(nèi)存中了,此時內(nèi)存的使用權(quán)已由bootfs轉(zhuǎn)交給內(nèi)核,此時系統(tǒng)也會卸載bootfs。
?rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系統(tǒng)中的 /dev, /proc, /bin, /etc 等標準目錄和文件。rootfs就是各種不同的操作系統(tǒng)發(fā)行版,比如Ubuntu,Centos等等。?
[if !vml]
[endif]
?平時我們安裝進虛擬機的CentOS都是好幾個G,為什么docker這里才200M??
[if !vml]
[endif]
對于一個精簡的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序庫就可以了,因為底層直接用Host的kernel,自己只需要提供rootfs 就行了。由此可見對于不同的linux發(fā)行版,
bootfs基本是一致的, rootfs會有差別, 因此不同的發(fā)行版可以公用bootfs。
1.3 ? 分層的鏡像
以我們的pull為例,在下載的過程中我們可以看到docker的鏡像好像是在一層一層的在下載
[if !vml]
[endif]
1.4 為什么docker要使用上面的這種分層結(jié)構(gòu)
最大的一個好處就是 - 共享資源
比如:有多個鏡像都從相同的 base 鏡像構(gòu)建而來,那么宿主機只需在磁盤上保存一份base鏡像,
同時內(nèi)存中也只需加載一份 base 鏡像,就可以為所有容器服務(wù)了。而且鏡像的每一層都可以被共享。
2,鏡像的特點
Docker鏡像都是只讀的
當容器啟動時,一個新的可寫的鏡像被加載到鏡像層的頂部。
這一層通常被叫做容器層,容器層之下的都叫鏡像層
3,鏡像的commit操作
3.1 作用
當鏡像運行之后可以修改容器里面的內(nèi)容,再提交成一個新的鏡像
3.2 命令語法
docker commit-m='新的鏡像的描述信息'-a='作者' 容器ID 要創(chuàng)建的目標鏡像名:[標簽名]
3.3 案例演示
1,從hub上拉一下tomcat鏡像運行
docker run-it-p8080:8080 tomcat
p 主機端口:容器端口
P 隨機分配端口
i 交互
t 終端
[if !vml]
[endif]
[if !vml]
[endif]
[if !vml]
[endif]
從上面可以看出docs是可以訪問的哦
2,刪除tomcat里面webapps 里面的docs項目
[if !vml]
[endif]
刷新頁面docs不存在了哦
[if !vml]
[endif]
3,把當前運行的這個沒有docs的容器生成一個新的鏡像
語法
docker commit-a='作者'-m='鏡像描述'? 容器ID? 新的鏡像名/名稱:版本
案列
docker commit-a='laolei'-m='del tomcat docs'dbebc1893880?? laolei/tomcatnodocs:1.0
[if !vml]
[endif]
4,啟動自己創(chuàng)建的鏡像和之前的對比
1 ,刪除所有容器
dockerrm-f$(docker ps -aq)
2,啟動之前的鏡像
docker run-d-p8888:8080鏡像ID或倉庫ID+版本
3,啟動自己的鏡像
docker run-d-p9999:8080鏡像ID
10【掌握】docker命令總結(jié)
[if !vml]
[endif]
11【掌握】docker容器數(shù)據(jù)卷
1,什么是容器數(shù)據(jù)卷
先來看看Docker的理念:
* 將應(yīng)用與運行的環(huán)境打包形成容器運行 ,運行可以伴隨著容器,但是我們對數(shù)據(jù)的要求希望是持久化的
* 容器之間希望有可能共享數(shù)據(jù)
Docker容器產(chǎn)生的數(shù)據(jù),如果不通過docker commit生成新的鏡像,使得數(shù)據(jù)做為鏡像的一部分保存下來,
那么當容器刪除后,數(shù)據(jù)自然也就沒有了。
為了能保存數(shù)據(jù)在docker中我們使用卷。
2,容器數(shù)據(jù)卷能做什么
1,容器數(shù)據(jù)的持久化
2,容器之間繼承和共享數(shù)據(jù)
3,添加數(shù)據(jù)卷的方式
3.1直接使用命令添加
①語法
docker run -it -v /宿主機目錄:/容器內(nèi)目錄 centos /bin/bash
[if !vml]
[endif]
②查看容器卷是否掛載成功
[if !vml]
[endif]
異常處理
[if !vml]
[endif]
--privileged=true
3.2使用DockerFile添加
在root下創(chuàng)建一個docker文件夾
[if !vml]
[endif]
進入docker文件夾創(chuàng)建文件名為Dockerfile的文件
[if !vml]
[endif]
編寫Dockerfile的文件
#基于tomcat:8.5構(gòu)造一個鏡像
FROM tomcat:8.5
#加入容器卷
VOLUME
? ["/usr/local/tomcat/webapps"]
CMD echo "finished,--------success1"
CMD /bin/bash
使用Dockerfile生成自定義鏡像
[if !vml]
[endif]
生成一個鏡像 再運行
可以使用docker inspect 容器ID查看容器卷
[if !vml]
[endif]
4,數(shù)據(jù)卷容器
4.1,作用:實現(xiàn)容器之間的數(shù)據(jù)共享
4.2,操作思路
生成一個自定義的centos
創(chuàng)建Dockerfile
[if !vml]
[endif]
使用dockerfile構(gòu)造鏡像
[if !vml]
[endif]
使用自己創(chuàng)建的鏡像啟動一個容器
docker run -it –name=os1 mycentos01:1.0 /bin/bash
使用自己創(chuàng)建的鏡像啟動第二個容器繼承第一個
docker run -it –name=os2 --volumes-from os1
mycentos01:1.0 /bin/bash
使用自己創(chuàng)建的鏡像啟動第三個容器繼承第二個
docker run -it –name=os3 --volumes-from os2
mycentos01:1.0 /bin/bash
測試方法
進入os1在mydata里面創(chuàng)建個os1.txt
進入os2查看mydata里面也有os1.txt
在os2的mydata里面創(chuàng)建os2.txt
進入os3查看mydata里面的數(shù)據(jù)
可以找到os1.txt和os2.txt
刪除os1之后情況
Os2 os3的mydata里面的數(shù)據(jù)不會發(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 運行鏡像
3,以centos的鏡像為例來說明?https://hub.docker.com/_/centos
[if !vml]
[endif]
[if !vml]
[endif]
2,DockerFile構(gòu)建過程解析
2.1基礎(chǔ)知識
1,每條保留字指令都必須為大寫字母后面要跟隨至少一個參數(shù)
2,指令從上到下順序執(zhí)行
3,#表示注釋
4,每條指令都會創(chuàng)建一個新的鏡像層,并對鏡像進行提交
2.2大致流程
1,docker從基礎(chǔ)鏡像運行一個容器
2,執(zhí)行一條指令并對容器進行修改
3,執(zhí)行類似于dockercommit的操作提交一個新的鏡像
4,docker再基于剛提交的新的鏡像運行一個新的容器
5,執(zhí)行dockerfile的下一個指令再從執(zhí)行第2點直到?jīng)]有指令
2.3總結(jié)
從應(yīng)用軟件的角度來看,Dockerfile、Docker鏡像與Docker容器分別代表軟件的三個不同階段,
*? Dockerfile是軟件的原材料
*? Docker鏡像是軟件的交付品
*? Docker容器則可以認為是軟件的運行態(tài)。
Dockerfile面向開發(fā),Docker鏡像成為交付標準,Docker容器則涉及部署與運維,三者缺一不可,合力充當Docker體系的基石。
?
1Dockerfile,需要定義一個Dockerfile,Dockerfile定義了進程需要的一切東西。
??? Dockerfile涉及的內(nèi)容包括執(zhí)行代碼或者是文件、環(huán)境變量、依賴包、運行時環(huán)境、動態(tài)鏈接庫、操作系統(tǒng)的發(fā)行版、
??? 服務(wù)進程和內(nèi)核進程(當應(yīng)用進程需要和系統(tǒng)服務(wù)和內(nèi)核進程打交道,這時需要考慮如何設(shè)計namespace的權(quán)限控制)等等;
2Docker鏡像,在用Dockerfile定義一個文件之后,dockerbuild時會產(chǎn)生一個Docker鏡像,
??? 當運行Docker鏡像時,會真正開始提供服務(wù);
3Docker容器,容器是直接提供服務(wù)的。
[if !vml]
[endif]
3,DockerFile體系結(jié)構(gòu)(關(guān)鍵字---重點啊)
FROM?基礎(chǔ)鏡像,當前新鏡像是基于哪個鏡像的
MAINTAINER??鏡像維護者的姓名和郵箱地址
RUN??容器構(gòu)建時需要運行的命令
EXPOSE?當前容器對外暴露的端口
WORKDIR?指定在創(chuàng)建容器后,終端默認登陸進來的工作目錄
ENV?用來在構(gòu)建鏡像過程中設(shè)置環(huán)境變量
ADD?將宿主機目錄下的文件拷貝進鏡像并且ADD命令會自動處理URL和解壓tar包
COPY?類似ADD,拷貝文件和目錄到鏡像中 ,語法COPY src dest ?COPY[''src","dest"]
VOLUME?容器數(shù)據(jù)卷,用于數(shù)據(jù)保存和持久化工作
CMD?指定一個容器啟動時要運行的命令格式
? ? ? ? shell: ?CMD ?<命令>
? ? ? ? exec ?CMD ['可執(zhí)行文件',"參數(shù)1","參數(shù)2"]
? ? ? ? DockerFile中可以有多個CMD指令,但只有最后一個生效,CMD會被docker run之后的參數(shù)替換
ENTEYPONT??指定一個容器啟動時要運行的命令
? ? ? ? ? ? ENTRYPOINT的目地和CMD一樣,都是在指定容器啟動程序及參數(shù)
OBBUILD?當構(gòu)建一個被繼承的Dockerfile時運行命令,父鏡像在被子鏡像繼承后觸發(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目地
?登陸后的默認路徑
?vim編輯器
?查看網(wǎng)絡(luò)配置ifconfig支持
[if !vml]
[endif]
2.2進入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命令運行
dockerrun-itmycentos:1.2
[if !vml]
[endif]
可以看到里面可以使用ipconfig命令了哦
2.5列出鏡像的變更歷史
dockerhistory鏡像名:TAG
[if !vml]
[endif]
14【掌握】Dockerfile詳解【3】
1,CMD說明
Dockerfile 中可以有多個CMD的命令,但只有最后一個生效,CMD會被docker run之后的參數(shù)替換掉
可以使用tomcat的案例演示
2.1查看tomcat的Dockerfile
[if !vml]
[endif]
從上面的可以看出最后執(zhí)行了一個catalina.sh的命令 ?相當于./bin/catalina.sh
運行如下命令,可以看出下圖的效果
dockerrun-it-p9999:8080tomcatls-lh
[if !vml]
[endif]
發(fā)現(xiàn)這個tomcat的容器啟動之后就退出了
那是因為在啟動容器的時候后面加了ls -lh那么會覆蓋Dockerfile里面的CMD ["catalina.sh", "run"]
2,ENTRYPOINT說明
使用ENTRYPOINT來運行命令,在run運行的參數(shù)會追加到新的命令后面
3,自定義ls鏡像來說明CMD和ENTRYPOINT的區(qū)別
目地:講解CMD和ENTRYOINT的區(qū)別
編寫Dockerfile
FROMcentos
CMD["ls","-a"]
構(gòu)建鏡像
dockerbuild-tmyls:1.2.
啟動鏡像
dockerrun-itmyls:1.2-lh
[if !vml]
[endif]
出現(xiàn)錯誤,這是因為Dockerfile里面使用的是CMD ["ls", "-a"]運行是傳一個-lh過去會覆蓋
修改Dockerfile
FROMcentos
ENTRYPOINT["ls","-a"]
構(gòu)建鏡像
dockerbuild-tmyls:1.3.
運行鏡像
dockerrun-itmyls:1.3-l
[if !vml]
[endif]
發(fā)現(xiàn) 【 -l 】被追加到 ls 后面了哦
[if !vml]
[endif]
15【掌握】Dockerfile詳解【4】做一個tomcat
方案選擇
基于一個openjdk?不用配置java環(huán)境變量
基于一個centos? 要配置java的環(huán)境變量
基于一個centos創(chuàng)建一個tomcat鏡像
準備工作
創(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/
#把apache-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移動到/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代表所有的確認的地方全部yes
#RUN yum -y install vim
#設(shè)置對名暴露的端口? 純提示作用
EXPOSE 8080?
#打開一個終端
CMD bin/startup.sh && tail -F
? logs/catalina.out
構(gòu)造鏡像
[if !vml]
[endif]
運行鏡像測試
[if !vml]
[endif]
[if !vml]
[endif]
16【掌握】Dockerfile詳解【5】
使用jar包做項目鏡像
準備jar包
在linux里面創(chuàng)建一個目錄
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]
使用鏡像運行容器測試
[if !vml]
[endif]
[if !vml]
[endif]
使用war包做項目鏡像
準備war包
[if !vml]
[endif]
在linux里面創(chuàng)建一個目錄
[if !vml]
[endif]
mkdir /root/dockerfile/mywarproject
上傳war包到linux的目錄
[if !vml]
[endif]
創(chuàng)建并編寫Dockerfile文件
[if !vml]
[endif]
構(gòu)造鏡像
[if !vml]
[endif]
使用鏡像運行容器測試
[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ā)平臺
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運行測試
[if !vml]
[endif]
[if !vml]
[endif]
18【掌握】docker常用安裝
1,安裝步驟梳理
搜索鏡像? ? docker search mysql
拉取鏡像? ? ?docker pull?
查看鏡像? ? ?docker images?
啟動鏡像? ? ? 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鏡像運行鏡像成為容器?
? ? docker run -it -p 8080:8080
tomcat?
? ? -p 主機端口:容器端口
? ? -P 隨機分配端口
? ? -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)建容器運行存在問題
[if !vml]
[endif]
這是因為mysql鏡像一啟動中在加設(shè)置用戶名和密碼
修改成下面的命令
docker run--namemysql-p3306:3306-eMYSQL_ROOT_PASSWORD=123456-dmysql:5.7
[if !vml]
[endif]
發(fā)現(xiàn)啟動起來了
4,使用navcat連接一下
[if !vml]
[endif]
如果是5.7的數(shù)據(jù)庫不會報錯
發(fā)現(xiàn)報錯,這是因為docker 的mysql里面的localhost ?-root 的密碼是啟動時設(shè)置的是123456現(xiàn)%-root的沒有設(shè)置
下面是解決方法
1, 進入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
再就可以進行遠程連接了哦
[if !vml]
[endif]
如果出現(xiàn)使用宿主機IP無法訪問的情況 在宿主機里面執(zhí)行如下命令
請順序運行以下命令:
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)文件地址配置?
可以在運行容器時設(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端口映射到主機的3306端口
-v $PWD/conf/my.cnf:/etc/mysql/my.cnf:將主機當前目錄下的conf/my.cnf掛載到容器的/etc/mysql/my.cnf
-v $PWD/logs:/logs:將主機當前目錄下的logs目錄掛載到容器的/logs
-v $PWD/data:/mysql_data:將主機當前目錄下的data目錄掛載到容器的/mysql_data
-e MYSQL_ROOT_PASSWORD=123456:初始化root用戶的密碼
19【掌握】Docker的四種網(wǎng)絡(luò)模式
1,概述
docker run創(chuàng)建Docker容器時,可以用–net選項指定容器的網(wǎng)絡(luò)模式,Docker有以下4種網(wǎng)絡(luò)模式:
bridge模式:使--net =bridge指定,默認設(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默認的網(wǎng)絡(luò)設(shè)置,此模式會為每一個容器分配Network Namespace、設(shè)置IP等,并將并將一個主機上的Docker容器連接到一個虛擬網(wǎng)橋上。當Docker server啟動時,會在主機上創(chuàng)建一個名為docker0的虛擬網(wǎng)橋,此主機上啟動的Docker容器會連接到這個虛擬網(wǎng)橋上。虛擬網(wǎng)橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網(wǎng)絡(luò)中。接下來就要為容器分配IP了,Docker會從RFC1918所定義的私有IP網(wǎng)段中,選擇一個和宿主機不同的IP地址和子網(wǎng)分配給docker0,連接到docker0的容器就從這個子網(wǎng)中選擇一個未占用的IP使用。如一般Docker會使用172.17.0.0/16這個網(wǎng)段,并將172.17.42.1/16分配給docker0網(wǎng)橋(在主機上使用ip addr命令是可以看到docker0的,可以認為它是網(wǎng)橋的管理端口,在宿主機上作為一塊虛擬網(wǎng)卡使用)。
具體操作:
啟動容器:(由于是默認設(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實際上是veth pair的一端,另一端(veth945c)連接在docker0網(wǎng)橋上:
[if !vml]
[endif]
3,host模式
如果啟動容器的時候使用host模式,那么這個容器將不會獲得一個獨立的Network
Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出自己的網(wǎng)卡,配置自己的IP等,而是使用宿主機的IP和端口。
使用host模式啟動容器:
[if !vml]
[endif]
使用host模式啟動容器后可以發(fā)現(xiàn),使用ip addr查看網(wǎng)絡(luò)環(huán)境時,看到的都是宿主機上的信息。這種方式創(chuàng)建出來的容器,可以看到host上的所有網(wǎng)絡(luò)設(shè)備。
容器中,對這些設(shè)備有全部的訪問權(quán)限。因此docker提示我們,這種方式是不安全的。如果在隔離良好的環(huán)境中(比如租戶的虛擬機中)使用這種方式,問題不大。
4,none模式
在none模式下,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進行任何網(wǎng)絡(luò)配置。也就是說,這個Docker容器沒有網(wǎng)卡、IP、路由等信息。需要我們自己為Docker容器添加網(wǎng)卡、配置IP等。
使用--net =none模式啟動容器:
[if !vml]
[endif]
5,container模式
這個模式指定新創(chuàng)建的容器和已經(jīng)存在的一個容器共享一個Network Namespace,而不是和宿主機共享。新創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個指定的容器共享IP、端口范圍等。同樣,兩個容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)、進程列表等還是隔離的。兩個容器的進程可以通過lo網(wǎng)卡設(shè)備通信。
使用--net =container模式啟動容器:
[if !vml]
[endif]
通過該例子可以看出來,兩者的網(wǎng)絡(luò)完全相同。
20【了解】docker搭建GitLab
1,安裝Centos
注意點:
? ? ? 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,運行鏡像
https://hub.docker.com/r/twang2218/gitlab-ce-zh
時間可能比較長
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]
感謝雷哥的視頻(第一次寫請大佬們不要噴我這個菜逼)https://ke.qq.com/webcourse/index.html#cid=469242&term_id=100561719&taid=3997484976646394&vid=5285890796224454021