教程揭秘 | 動力節(jié)點內部Java零基礎教學文檔第十五篇:docker
接上期后續(xù)
本期分享第十五章節(jié)
docker
已經(jīng)分享一大半了,你們都跟上了嗎?
每天都在學習嘛?
有什么不會的嘛?
今日教學文檔分享來了?

今日新篇章
【docker】
?【熟悉】docker簡介
1.1?什么是docker
Docker是一個開源項目,誕生于2013年初,最初是dotCloud公司內部的一個業(yè)余項目。它基于Google公司推出的Go語言實現(xiàn)。項目后來加入了Linux基金會,遵從了Apache2.0協(xié)議,項目代碼在GitHub上進行維護。Docker自開源后受到廣范的關注和討論,以至于dotCloud公司后來都改名為Docker Inc。RedHat已經(jīng)在其RHEL6.5中集中支持Docker;Google也在其PaaS產品中廣泛應用。Docker的目標是實現(xiàn)經(jīng)量級的操作系統(tǒng)虛擬化解決方案。Docker的基礎是Linux容器(LXC)等技術。在LXC的基礎上Docker進行了進一步的封裝,讓用戶不需要關心容器的管理,使得操作更加簡單。用戶操作Docker的容器就像操作一個快速輕量級的虛擬機一樣簡單。
下圖比較了Docker和傳統(tǒng)虛擬化方式的不同之處,可見容器是在操作系統(tǒng)層面上實現(xiàn)的虛擬化,直接復用本地主機的操作系統(tǒng),而傳統(tǒng)方式則是在硬件層現(xiàn)實現(xiàn)
?

1.2?docker的設計思想
Docker的思想來自于集裝箱,集裝箱解決了什么問題?在一艘大船上,可以把貨物規(guī)整的擺放起來。并且各種各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。那么我就不需要專門運送水果的船和專門運送化學品的船了。只要這些貨物在集裝箱里封裝的好好的,那我就可以用一艘大船把他們都運走。docker就是類似的理念?,F(xiàn)在都流行云計算了,云計算就好比大貨輪。docker就是集裝箱。
1.不同的應用程序可能會有不同的應用環(huán)境,比如.net開發(fā)的網(wǎng)站和php開發(fā)的網(wǎng)站依賴的軟件就不一樣,如果把他們依賴的軟件都安裝在一個服務器上就要調試很久,而且很麻煩,還會造成一些沖突。比如IIS和Apache訪問端口沖突。這個時候你就要隔離.net開發(fā)的網(wǎng)站和php開發(fā)的網(wǎng)站。常規(guī)來講,我們可以在服務器上創(chuàng)建不同的虛擬機在不同的虛擬機上放置不同的應用,但是虛擬機開銷比較高。docker可以實現(xiàn)虛擬機隔離應用環(huán)境的功能,并且開銷比虛擬機小,小就意味著省錢了。
2.你開發(fā)軟件的時候用的是Ubuntu,但是運維管理的都是centos,運維在把你的軟件從開發(fā)環(huán)境轉移到生產環(huán)境的時候就會遇到一些Ubuntu轉centos的問題,比如:有個特殊版本的數(shù)據(jù)庫,只有Ubuntu支持,centos不支持,在轉移的過程當中運維就得想辦法解決這樣的問題。這時候要是有docker你就可以把開發(fā)環(huán)境直接封裝轉移給運維,運維直接部署你給他的docker就可以了。而且部署速度快。
3.在服務器負載方面,如果你單獨開一個虛擬機,那么虛擬機會占用空閑內存的,docker部署的話,這些內存就會利用起來。
總之docker就是集裝箱原理。
1.3?為什么要使用docker
作為一種新興的虛擬化方式,Docker 跟傳統(tǒng)的虛擬化方式相比具有眾多的優(yōu)勢。首先,Docker 容器的啟動可以在秒級實現(xiàn),這相比傳統(tǒng)的虛擬機方式要快得多。其次,Docker 對系統(tǒng)資源的利用率很高,一臺主機上可以同時運行數(shù)千個Docker 容器。
容器除了運行其中應用外,基本不消耗額外的系統(tǒng)資源,使得應用的性能很高,同時系統(tǒng)的開銷盡量小。
傳統(tǒng)虛擬機方式運行10 個不同的應用就要起10 個虛擬機,而Docker 只需要啟動10 個隔離的應用即可。具體說來,Docker 在如下幾個方面具有較大的優(yōu)勢。
1.3.1?更快速的交付和部署
對開發(fā)和運維(devop)人員來說,最希望的就是一次創(chuàng)建或配置,可以在任意地方正常運行。開發(fā)者可以使用一個標準的鏡像來構建一套開發(fā)容器,開發(fā)完成之后,運維人員可以直接使用這個容器來部署代碼。Docker 可以快速創(chuàng)建容器,快速迭代應用程序,并讓整個過程全程可見,使團隊中的其他成員更容易理解應用程序是如何創(chuàng)建和工作的。Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節(jié)約開發(fā)、測試、部署的時間.
1.3.2?更輕松的遷移和擴展
Docker 容器幾乎可以在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、個人電腦、服務器等。這種兼容性可以讓用戶把一個應用程序從一個平臺直接遷移到另外一個。
1.3.3?更簡單的管理
使用Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發(fā)和更新,從而實現(xiàn)自動化并且高效的管理。對比虛擬機
?

1.3.4?docker的局限性
1.?Docker是基于Linux 64bit的,無法在32bit的linux/Windows/unix環(huán)境下使用
2.?LXC是基于cgroup等linux kernel功能的,因此容器的虛擬機只能是linux base的
3.?隔離性相比KVM之類的虛擬化方案還是有些欠缺,所有容器公用一部分的運行庫
4.?網(wǎng)絡管理相對簡單,主要是基于namespace隔離
5.?cgroup的cpu和cpuset提供的cpu功能相比KVM的等虛擬化方案相比難以度量(所以dotcloud主要是按內存收費)
6.?Docker對disk的管理比較有限
7.?容器隨著用戶進程的停止而銷毀,容器中的日志等用戶數(shù)據(jù)不便收集
1.4?docker在開發(fā)、測試、部署中的定位
1.4.1?嘗試新軟件(快速安裝軟件)
對開發(fā)者而言,每天會催生出的各式各樣的新技術都需要嘗試,然而開發(fā)者卻不太可能為他們一一搭建好環(huán)境并進行測試。時間非常寶貴,正是得益于 Docker,讓我們有
可能在一條或者幾條命令內就搭建完環(huán)境。Docker 有一個傻瓜化的獲取軟件的方法,Docker 后臺會自動獲得環(huán)境鏡像并且運行環(huán)境。
并不僅僅是新技術環(huán)境搭建用得到 Docker。如果你想快速在你的筆記本上運行一個 MySQL 數(shù)據(jù)庫,或者一個 Redis 消息隊列,那么使用 Docker 便可以非常容易地做到。例如 Docker 只需要一條命令便可以運行 MySQL 數(shù)據(jù)庫:docker run -d -p 3306:3306 tutum/mysql。
1.4.2?進行演示(打包鏡像)
工作中自己開發(fā)的成果對客戶或者別人做一兩個演示。搭建演示環(huán)境的過程非常麻煩。Docker是演示這些工具的最合理的方式。同時,對于客戶來說,可以直接將 Docker?鏡像提供給他們,而不必去做任何環(huán)境配置的工作,工作的效果也會和在他們演示中所看到的一模一樣,同時不必擔心他們的環(huán)境配置會導致我們的產品無法運行。
1.4.3?避免“我機器上可以運行”(統(tǒng)一環(huán)境)
無論是上一篇介紹的企業(yè)部署 Docker 還是本文的個人 Docker 用例,都提到了這個情況。因為環(huán)境配置不同,很多人在開發(fā)中也會遇到這個情況,甚至開發(fā)的軟件到了測試人員的機器上便不能運行。但這都不是重點。重點是,如果我們有一個可靠的、可分發(fā)的標準開發(fā)環(huán)境,那么我們的開發(fā)將不會像現(xiàn)在這么痛苦。Docker 便可以解決這個問題。Docker 鏡像并不會因為環(huán)境的變化而不能運行,也不會在不同的電腦上有不同的運行結果??梢越o測試人員提交含有應用的 Docker 鏡像,這樣便不再會發(fā)生“在我機器上是可以運行的”這種事情,很大程度上減輕了開發(fā)人員測試人員互相檢查機器環(huán)境設置帶來的時間成本。
1.4.4?更好地利用資源(應用級別)
虛擬機的粒度是“虛擬出的機器”,而 Docker 的粒度則是“被限制的應用”,相比較而言 Docker 的內存占用更少,更加輕量級。對我來說這是 Docker 的一個優(yōu)勢:因為在如果在電腦中運行多個 Docker 應用,使用 Docker 比使用虛擬機更加簡單,方便,粒度更細,也能持續(xù)地跟蹤容器狀態(tài)。
1.4.5?為微服務定制??
我們一直在講“微服務(Microservices)”的概念。Docker 可以很好地和微服務結合起來。從概念上來說,一個微服務便是一個提供一整套應用程序的部分功能,Docker 便可以在開發(fā)、測試和部署過程中一直充當微服務的容器。甚至生產環(huán)境也可以在 Docker 中部署微服務。
1.4.6?在云服務提供商之間移植
大多數(shù)的云主機提供商已經(jīng)全面支持 Docker。對于開發(fā)人員來說,這表示你可以很方便地切換云服務提供商,當然也可以很方便地將你本地的開發(fā)環(huán)境移動到云主機上,不需要本地上配置一次運行環(huán)境、在云主機上還配置一次運行環(huán)境。全面部署 Docker (Docker here and Docker there) 作為標準運行環(huán)境可以極大地減輕應用上線時的工作量和產生 BUG。
1.4.7?技術的創(chuàng)新?
Docker 正在快速發(fā)展,工具也在不斷更新,沒有人能預見到未來 Docker 會是什么樣子的。你在復雜的系統(tǒng)中 Docker 使用的越多,越是可能會發(fā)現(xiàn)技術上的空白和未來技術發(fā)展的方向?,F(xiàn)在還處在 Docker 的發(fā)展期,任何你使用 Docker 創(chuàng)建的工具都有可能成為社區(qū)關注的熱點。這是 Docker 的機會,也是成就你自己的機會。
1.5?docker和虛擬技術比較
1.5.1?之前的虛擬技術
虛擬機(virtual machine)就是帶環(huán)境安裝的一種解決方案。
它可以在一種操作系統(tǒng)里面運行另一種操作系統(tǒng),比如在Windows 系統(tǒng)里面運行Linux 系統(tǒng)。應用程序對此毫無感知,因為虛擬機看上去跟真實系統(tǒng)一模一樣,而對于底層系統(tǒng)來說,虛擬機就是一個普通文件,不需要了就刪掉,對其他部分毫無影響。這類虛擬機完美的運行了另一套系統(tǒng),能夠使應用程序,操作系統(tǒng)和硬件三者之間的邏輯不變。 ?
?
虛擬機的缺點:
1 資源占用多 2 冗余步驟多 3 啟動慢
1.5.2?docker容器化技術
由于前面虛擬機存在這些缺點,Linux 發(fā)展出了另一種虛擬化技術:Linux 容器(Linux Containers,縮寫為 LXC)。
Linux 容器不是模擬一個完整的操作系統(tǒng),而是對進程進行隔離。有了容器,就可以將軟件運行所需的所有資源打包到一個隔離的容器中。容器與虛擬機不同,不需要捆綁一整套操作系統(tǒng),只需要軟件工作所需的庫資源和設置。系統(tǒng)因此而變得高效輕量并保證部署在任何環(huán)境中的軟件都能始終如一地運行。
?

比較了 Docker 和傳統(tǒng)虛擬化方式的不同之處:
*傳統(tǒng)虛擬機技術是虛擬出一套硬件后,在其上運行一個完整操作系統(tǒng),在該系統(tǒng)上再運行所需應用進程;
*而容器內的應用進程直接運行于宿主的內核,容器內沒有自己的內核,而且也沒有進行硬件虛擬。因此容器要比傳統(tǒng)虛擬機更為輕便。
* 每個容器之間互相隔離,每個容器有自己的文件系統(tǒng) ,容器之間進程不會相互影響,能區(qū)分計算資源。
2.?【掌握】docker說明
2.1?相關網(wǎng)站
https://www.docker.com/??docker的官網(wǎng)
https://docs.docker.com/??文檔
https://hub.docker.com/??鏡像網(wǎng)站
2.2?Docker 下載
1,官網(wǎng) http://www.docker.com
3,倉庫 ?https://hub.docker.com
2.3?Docker 安裝前提說明
2.3.1?CentOS Docker 安裝
Docker支持以下的CentOS版本:
CentOS 7 (64-bit)
2.3.2?前提條件
目前,CentOS 僅發(fā)行版本中的內核支持 Docker。
Docker 運行在 CentOS 7 上,要求系統(tǒng)為64位、系統(tǒng)內核版本為 3.10 或以上。[我們基于7以上的版本來講的哦]
2.3.3?查看自己的內核
uname命令用于打印當前系統(tǒng)相關信息(內核版本號、硬件架構、主機名稱和操作系統(tǒng)類型等)。
uname -r
?

版本OK木有問題
2.4?Docker 的基本組成
?

3.?【掌握】docker安裝
?

3.1?centos 下安裝Docker 文檔
https://docs.docker.com/install/linux/docker-ce/centos/
3.2?Docker 安裝
3.2.1?確定是centos7的版本
cat /etc/redhat-release
?

3.2.2?卸載舊版本
yum remove docker \
??????????????????docker-client \
??????????????????docker-client-latest \
??????????????????docker-common \
??????????????????docker-latest \
??????????????????docker-latest-logrotate \
??????????????????docker-logrotate \
??????????????????docker-engine
3.2.3?安裝方法
確保linux能上外網(wǎng)
使用國內 daocloud 一鍵安裝命令 (推薦)
curl -sSL https://get.daocloud.io/docker | sh
或者使用yum安裝
yum install docker
3.2.4?啟動docker
systemctl start docker
systemctl enable docker 開機自啟
3.2.5?查看版本
docker version
3.2.6?測試運行 hello-world
docker run hello-world
由于本地沒有hello-world這個鏡像,所以會下載一個hello-world的鏡像,并在容器內運行。
?

3.2.7?測試運行nginx
docker run -p 8080:80 -d docker.io/nginx ??//將80端口映射為8080
?

測試
http://IP:8080/?
?

是不是很爽呀
?
3.2.8?卸載docker
systemctl stop docker
yum -y remove docker
rm -rf /var/lib/docker
4.?【掌握】docker加速配置
因為直接從dockerhub上下載鏡像很慢
4.1?說明
Docker 運行容器前需要本地存在對應的鏡像,如果鏡像不存在本地,Docker 會從鏡像倉庫下載(默認是Docker Hub 公共注冊服務器中的倉庫)。
4.2?阿里云鏡像加速
https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fcr.console.aliyun.com%2Fcn-hangzhou%2Finstances%2Fmirrors&lang=en?
?

vim /etc/docker/daemon.json
{ "registry-mirrors": ["https://1thbhxhq.mirror.aliyuncs.com"] }
保存
systemctl daemon-reload
systemctl restart docker
?
4.3?相關命令
4.3.1?列出所有鏡像
docker images?
4.3.2?根據(jù)鏡像id刪除鏡像
docker rmi 鏡像id?
docker rmi -f 鏡像id?
4.4?為什么下載的tomcat鏡像很大
?

5.?【掌握】docker底層原理
5.1?Docker是如何工作的
Docker是一個Client-Server結構的系統(tǒng),Docker守護進程運行在主機上, 然后通過Socket連接從客戶端訪問,守護進程從客戶端接受命令并管理運行在主機上的容器。 容器,是一個運行時環(huán)境,就是我們前面說到的集裝箱。
?

5.2?docker run了啥
?

6.?【掌握】docker命令[幫助+鏡像]
6.1?幫助命令
docker version 查看docker版本
docker info 顯示全系統(tǒng)信息
docker --help 顯示docker相關的所有命令及功能說明
6.2?鏡像命令
6.2.1?docker images ?列表本機上的鏡像
?

?
REPOSITORY:表示鏡像的倉庫源
TAG:鏡像的標簽
IMAGE ID:鏡像ID
CREATED:鏡像創(chuàng)建時間
SIZE:鏡像大小
同一倉庫源可以有多個 TAG,代表這個倉庫源的不同個版本,我們使用 REPOSITORY:TAG 來定義不同的鏡像。
如果你不指定一個鏡像的版本標簽,例如你只使用 ubuntu,docker 將默認使用 ubuntu:latest 鏡像
docker images -[options]的說明
?
-a 列表本地的所有鏡像及子鏡像
-q 只顯示鏡像ID
--digests 顯示鏡像的摘要信息
--no-trunc 顯示完整的鏡像信息
6.2.2?docker seach 鏡像搜索命令
搜索網(wǎng)站:https://hub.docker.com?
語法
?
docker search 鏡像名稱
docker search 鏡像名稱 ?-[options] ? 說明
?
--no-trunc 顯示完整的鏡像描述
?

6.2.3?docker pull 鏡像下載命令
語法
?
docker pull 鏡像名稱:[TAG]
例如:docker pull tomcat:8.5 ?下載8.5的鏡像版本
?????dokcer pull tomcat 默認下載最新的tomcat鏡像版本 【latest】 ????
6.2.4?docker rmi?鏡像刪除命令
?
刪除單個 ??docker rmi -f 鏡像ID
刪除多個 ??docker rmi -f 鏡像ID1 鏡像ID2
???????????docker rim -f 鏡像名:[tag] ?鏡像名:[tag]
刪除全部
???????????docker rmi -f $(docker images -qa)
?
7.?【掌握】docker命令[容器]
7.1?什么是容器
容器鏡像是一個軟件的輕量級獨立可執(zhí)行軟件包,包含運行它所需的一切:代碼,運行時,系統(tǒng)工具,系統(tǒng)庫,設置。不管環(huán)境如何,集裝箱化軟件都可以運行相同的Linux和Windows應用程序。容器將軟件與其周圍環(huán)境隔離開來,例如開發(fā)環(huán)境和生產環(huán)境之間的差異,并有助于減少在同一基礎架構上運行不同軟件的團隊之間的沖突。
?
1.輕量級?
在一臺機器上運行的Docker容器共享該宿主機器的操作系統(tǒng)內核; 他們立即開始并使用更少的計算和內存。圖像由文件系統(tǒng)層構建并共享公用文件。這最大限度地減少了磁盤使用量,圖像下載速度更快。?
2.標準?
Docker容器基于開放標準,可在所有主要Linux發(fā)行版,Microsoft Windows以及任何基礎架構(包括虛擬機,裸機和云中)上運行。?
3.安全?
Docker容器將應用程序彼此隔離并從底層基礎架構中分離出來。Docker提供了最強大的默認隔離功能,可以將應用程序問題限制在一個容器中,而不是整個機器上。
7.2?演示前提
有鏡像才能創(chuàng)建容器,這個是根本要求(下載centos鏡像來演示)?
Tomcat為例來說明
docker pull centos
7.3?創(chuàng)建并啟動容器
7.3.1?語法
docker ?run [options] ?鏡像名:tag/鏡像id ?[命令or 參數(shù)]
7.3.2?options說明
有些是一個減號,有些是兩個減號
--name="容器新名字": 為容器指定一個名稱;
-d: 后臺運行容器,并返回容器ID,也即啟動守護式容器;
-i:以交互模式運行容器,通常與 -t 同時使用;
-t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
-P: 隨機端口映射;
-p: 指定端口映射,有以下四種格式
? ? ? ip:hostPort:containerPort
? ? ? ip::containerPort
? ? ? hostPort:containerPort
? ? ? containerPort
?
7.3.3?交互式運行
#使用鏡像centos:latest以交互模式啟動一個容器,在容器內執(zhí)行/bin/bash命令。
docker run -it centos /bin/bash
7.4?列出當前所有正在運行的容器
7.4.1?語法
docker ps –[options]
?
7.4.2?語法【options】
-a ?列出所有運行和未運行的容器
-q ?列出所有運行中容器的ID
-aq 列出所有運行和未運行的容器的ID
7.5?退出容器
1,exit:停止容器并退出?【不完全正確】
2,ctrl+P+Q ?容器不停止退出
7.6?進入正在進行的容器并以命令行交互
docker exec -it?容器ID bash ??重新開啟一個終端進入容器
docker attach 容器ID ?直接使用原來的終端進入容器
7.7?啟動停止重啟容器
docker start|stop|restart ?容器ID或容器名
?

7.8?強制停止容器
docker ?kill ?容器ID或容器名稱
7.9?刪除容器
docker rm [options] 容器ID|容器名稱 ?容器ID|容器名稱 ??容器ID|容器名稱
Options ?
-f ?強制刪除正在運行的容器或沒有運行的容器
docker rm -f ?$(docker ps -aq) 刪除所有運行和未運行的容器
7.10?啟用守護式容器
#使用鏡像centos:latest以后臺模式啟動一個容器
docker run -d centos
問題:docker ps -a 進行查看, 會發(fā)現(xiàn)容器已經(jīng)退出
很重要的要說明的一點:?Docker容器后臺運行,就必須有一個前臺進程.
容器運行的命令如果不是那些一直掛起的命令(比如運行top,tail),就是會自動退出的。
這個是docker的機制問題,比如你的web容器,我們以nginx為例,正常情況下,我們配置啟動服務只需要啟動是應的service即可。例如 ?service nginx start
但是,這樣做,nginx為后臺進程模式運行,就導致docker前臺沒有運行的應用,
這樣的容器后臺啟動后,會立即自殺因為他覺得他沒事可做了.
所以,最佳的解決方案是,將你要運行的程序以前臺進程的形式運行
7.11?查看容器日志
語法(docker logs 容器ID|名稱)
如果是后臺運行的程序,那么如何查看運行的日志呢?
7.12?查看容器運行進程?
?docker top 容器ID
7.13?查詢容器內部細節(jié)
docker inspect 容器ID|名稱
顯示了容器里面所有內部細節(jié)
?

7.14?進入容器拷貝文件到主機
docker cp 容器ID(容器名稱):容器內文件或文件夾路徑 ??宿主機的路徑
?

7.15?在主機拷貝文件到容器
docker cp ??宿主機的路徑??容器ID(容器名稱):容器內文件或文件夾路徑
?

8.?【掌握】docker鏡像詳解
8.1?什么是鏡像
8.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 鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像。
?
特性:一次同時加載多個文件系統(tǒng),但從外面看起來,只能看到一個文件系統(tǒng),聯(lián)合加載會把各層文件系統(tǒng)疊加起來,這樣最終的文件系統(tǒng)會包含所有底層的文件和目錄
?
8.1.2?分層的鏡像
以我們的pull為例,在下載的過程中我們可以看到docker的鏡像好像是在一層一層的在下載
?

8.1.3?為什么docker要使用上面的這種分層結構
最大的一個好處就是 - 共享資源
比如:有多個鏡像都從相同的 base 鏡像構建而來,那么宿主機只需在磁盤上保存一份base鏡像,
同時內存中也只需加載一份 base 鏡像,就可以為所有容器服務了。而且鏡像的每一層都可以被共享。
8.2?鏡像的特點
Docker鏡像都是只讀的
當容器啟動時,一個新的可寫的鏡像被加載到鏡像層的頂部。
這一層通常被叫做容器層,容器層之下的都叫鏡像層
8.3?鏡像的commit操作
8.3.1?作用
當鏡像運行之后可以修改容器里面的內容,再提交成一個新的鏡像
8.3.2?命令語法
?docker commit -m='新的鏡像的描述信息'?-a='作者'?容器ID 要創(chuàng)建的目標鏡像名:[標簽名]
8.3.3?案例演示
8.3.3.1?從hub上拉一下tomcat鏡像運行
docker run --name tomcat -p 8080:8080 -d tomcat
但是這個鏡像運行成的容器的webapps里面是沒有默認的5個個的項目
測試方法:自己解壓一個tomcat 把這個tomcat webapps里面的5個項目復制到容器的usr/local/tomcat/webapps里面,再把這個運行中的容器進行提交成一個新的帶5個項目的鏡像,再刪除容器,再以生成的新的容器去運行,那么新的容器就有5個項目了
8.3.3.2?上傳并解壓tomcat
?

8.3.3.3?把解壓的tomcat里面的5個項目復制到容器里面
?

8.3.3.4?把當前運行的有5個默認項目的容器生成一個新的鏡像
語法
docker commit -a='作者' -m='鏡像描述' ?容器ID ?新的鏡像名/名稱:版本
案列
docker commit -a='leige' -m='has 5 project image' dbebc1893880 ??leige/newTomcat:1.0
?
8.3.3.5?啟動自己創(chuàng)建的鏡像和之前的對比
1 ,刪除所有容器
?docker rm -f $(docker ps -aq)
?
2,啟動之前的鏡像
?docker run -d -p 8888:8080 鏡像ID或倉庫ID+版本
?
3,啟動自己的鏡像
?docker run -d -p 9999:8080 鏡像ID
9.?【掌握】docker命令總結
?

10.?【掌握】docker容器數(shù)據(jù)卷
10.1?什么是容器數(shù)據(jù)卷
先來看看Docker的理念:
* 將應用與運行的環(huán)境打包形成容器運行 ,運行可以伴隨著容器,但是我們對數(shù)據(jù)的要求希望是持久化的
* 容器之間希望有可能共享數(shù)據(jù)
Docker容器產生的數(shù)據(jù),如果不通過docker commit生成新的鏡像,使得數(shù)據(jù)做為鏡像的一部分保存下來,
那么當容器刪除后,數(shù)據(jù)自然也就沒有了。
為了能保存數(shù)據(jù)在docker中我們使用卷。
10.2?容器數(shù)據(jù)卷能做什么
1,容器數(shù)據(jù)的持久化
2,容器之間繼承和共享數(shù)據(jù)
10.3?添加數(shù)據(jù)卷的方式
10.3.1?直接使用命令添加
①語法
?docker run -it -v /宿主機目錄:/容器內目錄 centos /bin/bash
②查看容器卷是否掛載成功
?docker inspect 容器ID
?

③查看容器卷和宿主機的數(shù)據(jù)共享
在宿主機的mycentos001中創(chuàng)建hello.txt文件并寫入數(shù)據(jù)mycentos001
進入容器查看container001里面有hello.txt文件數(shù)據(jù)和mycentos001里面的一樣
注意:在以上的例子中,默認的只能在宿主機里面寫數(shù)據(jù)。
如果出以下的問題
?

解決辦法:在掛載目錄后多加一個--privileged=true參數(shù)即可
?
④查看容器停止后,主機修改數(shù)據(jù)是否同步
?

⑤帶權限的處理方式
?

??docker run -it -v /宿主機目錄:/容器內目錄??centos /bin/bash
10.3.2?使用DockerFile添加
①在宿主機的根目錄下創(chuàng)建mydocker文件夾并進入
?

②在當前目錄創(chuàng)建一個DockerFile的文件
?

③編寫DockerFile
?

?
FROM centos
VOLUME ["/dataContainer1","/dataContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash
?
④build生成一個新的鏡像
?
docker build -f /mydocker/Dockerfile -t laolei/centos . ??
#注意后面有一個點哦
?

⑤啟動容器
?
docker run -it --name='mycentos' laolei/centos
⑥查看容器里面有兩個容器卷
?


10.4?數(shù)據(jù)卷容器
docker run -d -v /root/webapps:/usr/local/tomcat/webapps -p 8001:8080 tomcat
?
4.1,作用:實現(xiàn)容器之間的數(shù)據(jù)共享
4.2,操作思路
以上面的laolei/centos為鏡像,里面有dataContainer1和dataContailer2
啟動一個容器dc1 ?在dataContailer1里面添加dc1.txt
????docker run -it --name='dc1' laolei/centos
????cd /dataContailer1
????touch dc1.txt
啟動一個容器dc2 繼承dc1 ?在dataContailer1里面添加dc2.txt
啟動一個容器dc3 繼承dc2 ?在dataContailer1里面添加dc3.txt
發(fā)現(xiàn)在dc3可以看到dc1.txt dc2.txt dc3.txt
??????dc1里面可以看到dc1.txt dc2.txt dc3.txt
刪除dc1容器之后在dc2和dc3里面還是可以看到dc1.txt dc2.txt dc3.txt
說明數(shù)據(jù)卷容器的生命周期一直持續(xù)到?jīng)]有容器使用它為止
?


11.?【掌握】Dockerfile詳解【1】
11.1?什么是Dockerfile
1,Dockerfile是用來構建Docker鏡像的構建文件,是由一系列的命令和參數(shù)構成的腳本
2,Dokcerfile的構建步驟
? ? ? ? 編寫Dokcerfile文件
? ? ? ? docker build 生成新的鏡像
? ? ? ? docker run 運行鏡像
3,以centos的鏡像為例來說明 https://hub.docker.com/_/centos
?


11.2?DockerFile構建過程解析
11.2.1?基礎知識
1,每條保留字指令都必須為大寫字母后面要跟隨至少一個參數(shù)
2,指令從上到下順序執(zhí)行
3,#表示注釋
4,每條指令都會創(chuàng)建一個新的鏡像層,并對鏡像進行提交
11.2.2?大致流程
?1,docker從基礎鏡像運行一個容器
2,執(zhí)行一條指令并對容器進行修改
3,執(zhí)行類似于docker commit的操作提交一個新的鏡像
4,docker再基于剛提交的新的鏡像運行一個新的容器
5,執(zhí)行Dockerfile的下一個指令再從執(zhí)行第2點直到?jīng)]有指令
11.2.3?總結
從應用軟件的角度來看,Dockerfile、Docker鏡像與Docker容器分別代表軟件的三個不同階段,
* ?Dockerfile是軟件的原材料
* ?Docker鏡像是軟件的交付品
* ?Docker容器則可以認為是軟件的運行態(tài)。
Dockerfile面向開發(fā),Docker鏡像成為交付標準,Docker容器則涉及部署與運維,三者缺一不可,合力充當Docker體系的基石。
1 Dockerfile,需要定義一個Dockerfile,Dockerfile定義了進程需要的一切東西。
Dockerfile涉及的內容包括執(zhí)行代碼或者是文件、環(huán)境變量、依賴包、運行時環(huán)境、動態(tài)鏈接庫、操作系統(tǒng)的發(fā)行版、
服務進程和內核進程(當應用進程需要和系統(tǒng)服務和內核進程打交道,這時需要考慮如何設計namespace的權限控制)等等;
2 Docker鏡像,在用Dockerfile定義一個文件之后,docker build時會產生一個Docker鏡像,
當運行 Docker鏡像時,會真正開始提供服務;
3 Docker容器,容器是直接提供服務的。
?
11.3?Dockerfile體系結構(關鍵字---重點?。?/strong>
FROM 基礎鏡像,當前新鏡像是基于哪個鏡像的
MAINTAINER??鏡像維護者的姓名和郵箱地址
RUN ?容器構建時需要運行的命令
EXPOSE 當前容器對外暴露的端口[只是提示作用,]
WORKDIR 指定在創(chuàng)建容器后,終端默認登陸進來的工作目錄
ENV 用來在構建鏡像過程中設置環(huán)境變量?
ADD 將宿主機目錄下的文件拷貝進鏡像并且ADD命令會自動處理URL和解壓tar包
COPY?類似ADD,拷貝文件和目錄到鏡像中 ,語法COPY src dest ?COPY [''src","dest"]
VOLUME 容器數(shù)據(jù)卷,用于數(shù)據(jù)保存和持久化工作
CMD?指定一個容器啟動時要運行的命令格式CMD['ls'] ? run -it cenos -lh
? ? ? ? shell: ?CMD ?<命令>
? ? ? ? exec ?CMD ['可執(zhí)行文件',"參數(shù)1","參數(shù)2"]
? ? ? ? DockerFile中可以有多個CMD指令,但只有最后一個生效,CMD會被docker run之后的參數(shù)替換
ENTEYPONT ?指定一個容器啟動時要運行的命令 ENTEYPORT ['ls'] ? run -it cenos -lh
? ? ? ? ? ? ENTRYPOINT的目地和CMD一樣,都是在指定容器啟動程序及參數(shù)
OBBUILD?當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子鏡像繼承后觸發(fā)父鏡像的onbuild
11.3.1?總結
?
12.?【掌握】Dockerfile詳解【2】
12.1?制作一個帶vim centos鏡像
Vim
指定工作目錄
12.2?編寫Dockerfile
?

?
12.3?使用build+Dockerfile構建鏡像
?

12.4?運行
?


?
?
13.?【掌握】Dockerfile詳解【3】
13.1?CMD說明
Dockerfile 中可以有多個CMD的命令,但只有最后一個生效,CMD會被docker run之后的參數(shù)替換掉
可以使用tomcat的案例演示
2.1查看tomcat的Dockerfile
?

從上面的可以看出最后執(zhí)行了一個catalina.sh的命令 ?相當于./bin/catalina.sh ?
運行如下命令,可以看出下圖的效果
?
docker?run?-it?-p?9999:8080?tomcat?ls?-lh
?
發(fā)現(xiàn)這個tomcat的容器啟動之后就退出了
那是因為在啟動容器的時候后面加了ls -lh那么會覆蓋Dockerfile里面的 ?CMD?["catalina.sh", "run"]
13.2?ENTRYPOINT說明
使用ENTRYPOINT來運行命令,在run 運行的參數(shù)會追加到新的命令后面
?
13.3?自定義ls鏡像來說明CMD和ENTRYPOINT的區(qū)別
目地:講解CMD和ENTRYOINT的區(qū)別
編寫Dockerfile
FROM centos
CMD [ "ls", "-a" ]
構建鏡像
docker build -t myls:1.2 .
啟動鏡像
?

docker run -it myls:1.2 -lh
?

出現(xiàn)錯誤,這是因為Dockerfile里面使用的是CMD ["ls", "-a"]運行是傳一個-lh過去會覆蓋
?
修改Dockerfile
?
FROM centos
ENTRYPOINT [ "ls", "-a" ]??
構建鏡像
?
docker build -t myls:1.3 .
運行鏡像
?
docker run -it myls:1.3 -l
?
發(fā)現(xiàn) 【 -l 】被追加到 ls 后面了哦
14.?【掌握】Dockerfile詳解【4】
14.1?自定義tomcat鏡像
14.1.1?準備工作
下載tomcat8
下載jdk8linux
?
?
#創(chuàng)建目錄
mkdir -p /mydocker/mytomcat
#進入目錄
cd /mydocker/ mytomcat
#創(chuàng)建文件
#把下載好的tomcat和jdk放到/mydocker/mytomcat里面
?

14.1.2?編寫Dockerfile
?

14.1.3?構建鏡像
??docker build -t mytomcat9:1.0 .
14.1.4?運行鏡像測試
?docker run -it --name 'mytomcat-1' -p 9999:8080 mytomcat:1.0
?
?

15.?【掌握】Dockerfile詳解【5】
15.1?準備jar和war
?

15.1.1?上傳jar包
?

15.1.2?編寫Dockerfile
思路:
java-jar hello.jar
docker run -itd -p 8080:8080 myjar:1.0
?

15.1.3?使用Dockerfile構造鏡像
?

15.1.4?運行鏡像
?

?
15.2?war包的打包方式
15.2.1?上傳war包
?

15.2.2?編寫Dockerfile
?

15.2.3?使用Dockerfile構造鏡像
?
15.2.4?運行鏡像
?
?


?
16.?【掌握】docker常用安裝
16.1?安裝步驟梳理
1.?搜索鏡像 docker search mysql
2.?拉取鏡像 ?docker pull?
3.?查看鏡像 ?docker images?
4.?啟動鏡像 ? docker run?
5.?停止容器 ? docker stop 容器ID
6.?移除容器 ?docker rm -f 容器ID
16.2?安裝tomcat
Docker run -it -d -v /root/webapps:/usr/local/tomcat/webapps tomcat:8.5
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 終端 ?
16.3?安裝mysql
docker hub上查找mysql鏡像 ?docker search mysql
?

docker hub上拉取mysql鏡像到本地 ?docker pull mysql:5.7
?

?
使用mysql5.7鏡像創(chuàng)建容器運行存在問題
?

這是因為mysql鏡像一啟動中在加設置用戶名和密碼
修改成下面的命令
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7?--lower_case_table_names=1
??

--lower_case_table_names=1的作用
因為這個docker的mysql版本默認的是表名區(qū)分大小寫,所以要加上上面這個
?
發(fā)現(xiàn)啟動起來了
16.4?使用navcat連接一下
?

如果是5.7的數(shù)據(jù)庫不會報錯
發(fā)現(xiàn)報錯,這是因為docker 的mysql里面的localhost ?-root 的密碼是啟動時設置的是123456現(xiàn)%-root的沒有設置
下面是解決方法
?
1, 進入mysql的docker 容器
docker exec -it mysql /bin/bash
2,登陸mysql
mysql -u root -p
輸入密碼
3,使用mysql數(shù)據(jù)庫
use mysql
4,執(zhí)行修改密碼的命令
update user set password=password(123456) where host='%'
5,重啟mysql的docker 容器
exit退出
exit退出mysql容器
docker restart mysql
再就可以進行遠程連接了哦
?

如果出現(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的容器
16.5?相關文件地址配置?
可以在運行容器時設置 :
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
但要求對應路徑對應文件已存在,才能成功掛載相內容到對應位置。
命令說明:
-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用戶的密碼
17.?【掌握】Docker的四種網(wǎng)絡模式
17.1?概述
docker run創(chuàng)建Docker容器時,可以用–net選項指定容器的網(wǎng)絡模式,Docker有以下4種網(wǎng)絡模式:?
bridge模式:使--net =bridge指定,默認設置;?
host模式:使--net =host指定;?
none模式:使--net =none指定;?
container模式:使--net =container:NAMEorID指定。?
可以使用docker network ls來查看
?

下面我們分別來講解docker的四種網(wǎng)絡模式:?
17.2?bridge模式
bridge模式是Docker默認的網(wǎng)絡設置,此模式會為每一個容器分配Network Namespace、設置IP等,并將并將一個主機上的Docker容器連接到一個虛擬網(wǎng)橋上。當Docker server啟動時,會在主機上創(chuàng)建一個名為docker0的虛擬網(wǎng)橋,此主機上啟動的Docker容器會連接到這個虛擬網(wǎng)橋上。虛擬網(wǎng)橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網(wǎng)絡中。接下來就要為容器分配IP了,Docker會從RFC1918所定義的私有IP網(wǎng)段中,選擇一個和宿主機不同的IP地址和子網(wǎng)分配給docker0,連接到docker0的容器就從這個子網(wǎng)中選擇一個未占用的IP使用。如一般Docker會使用172.17.0.0/16這個網(wǎng)段,并將172.17.0.1/16分配給docker0網(wǎng)橋(在主機上使用ip addr命令是可以看到docker0的,可以認為它是網(wǎng)橋的管理端口,在宿主機上作為一塊虛擬網(wǎng)卡使用)。?
具體操作:?
啟動容器:(由于是默認設置,這里沒指定網(wǎng)絡–net =bridge,可以看到容器內創(chuàng)建了eth0)?
?

使用ping命令連接Host網(wǎng)絡發(fā)現(xiàn),容器與Host網(wǎng)絡是連通的:?
?


eth0實際上是veth pair的一端,另一端(veth945c)連接在docker0網(wǎng)橋上:?
?

17.3?host模式
如果啟動容器的時候使用host模式,那么這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出自己的網(wǎng)卡,配置自己的IP等,而是使用宿主機的IP和端口。?
使用host模式啟動容器:?
?

使用host模式啟動容器后可以發(fā)現(xiàn),使用ip addr查看網(wǎng)絡環(huán)境時,看到的都是宿主機上的信息。這種方式創(chuàng)建出來的容器,可以看到host上的所有網(wǎng)絡設備。?
容器中,對這些設備有全部的訪問權限。因此docker提示我們,這種方式是不安全的。如果在隔離良好的環(huán)境中(比如租戶的虛擬機中)使用這種方式,問題不大。?
17.4?none模式
在none模式下,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進行任何網(wǎng)絡配置。也就是說,這個Docker容器沒有網(wǎng)卡、IP、路由等信息。需要我們自己為Docker容器添加網(wǎng)卡、配置IP等。?
使用--net =none模式啟動容器:?
?

17.5?container模式
這個模式指定新創(chuàng)建的容器和已經(jīng)存在的一個容器共享一個Network Namespace,而不是和宿主機共享。新創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個指定的容器共享IP、端口范圍等。同樣,兩個容器除了網(wǎng)絡方面,其他的如文件系統(tǒng)、進程列表等還是隔離的。兩個容器的進程可以通過lo網(wǎng)卡設備通信。?
使用--net =container模式啟動容器:?
?

通過該例子可以看出來,兩者的網(wǎng)絡完全相同。?
?
18.?【掌握】關于防火墻的問題
1,?開啟,重啟docker 運行mysql 外面能不能訪問? ?能!
2,?關閉防火墻 ??運行mysql 報錯?。?!
3,?關閉防火墻 ?重啟docker ??運行mysql 正常
Dockerfile?
容器1----跑項目 jar
向容器的jar目錄里面cp一個application.yml進去
容器2----跑數(shù)據(jù)庫
?

更多干貨我們下期再說!
下期會分享
第十六章節(jié)
Redis
相關知識~
下期見!
