docker入門

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ù)不便收集

4docker在開發(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

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 運行在 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端口,不可以不寫。

測試

http://192.168.15.134:8080/

是不是很爽呀

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容