一览闰、簡(jiǎn)介
1.1 什么是虛擬化
??在計(jì)算機(jī)中,虛擬化(英語(yǔ):Virtualization)是一種資源管理技術(shù)巷折,是將計(jì)算機(jī)的各種實(shí)體資源压鉴,如服務(wù)器、網(wǎng)絡(luò)锻拘、內(nèi)存及存儲(chǔ)等油吭,予以抽象击蹲、轉(zhuǎn)換后呈現(xiàn)出來(lái),打破實(shí)體結(jié)構(gòu)間的不可切割的障礙婉宰,使用戶可以比原本的組態(tài)更好的方式來(lái)應(yīng)用這些資源歌豺。這些資源的新虛擬部份是不受現(xiàn)有資源的架設(shè)方式,地域或物理組態(tài)所限制心包。一般所指的虛擬化資源包括計(jì)算能力和資料存儲(chǔ)世曾。
??在實(shí)際的生產(chǎn)環(huán)境中,虛擬化技術(shù)主要用來(lái)解決高性能的物理硬件產(chǎn)能過(guò)剩和老的舊的硬件產(chǎn)能過(guò)低的重組重用谴咸,透明化底層物理硬件,從而最大化的利用物理硬件對(duì)資源充分利用骗露。虛擬化技術(shù)種類很多岭佳,例如:軟件虛擬化、硬件虛擬化萧锉、內(nèi)存虛擬化珊随、網(wǎng)絡(luò)虛擬化(vip)、桌面虛擬化柿隙、服務(wù)虛擬化叶洞、虛擬機(jī)等等。
1.2 什么是Docker
??Docker是一個(gè)開源項(xiàng)目禀崖,誕生于2013 年初衩辟,最初是 dotCloud 公司內(nèi)部的一個(gè)業(yè)余項(xiàng)目。它基于 Google 公司推出的Go語(yǔ)言實(shí)現(xiàn)波附。項(xiàng)目后來(lái)加入了Linux 基金會(huì)艺晴,遵從了Apache 2.0 協(xié)議,項(xiàng)目代碼在GitHub (https://github.com/docker/docker) 上進(jìn)行維護(hù)掸屡。
??Securely build, share and run any application, anywhere
??Docker 自開源后受到廣泛的關(guān)注和討論封寞,以至于 dotCloud 公司后來(lái)都改名為 Docker Inc。Redhat 已經(jīng)在其RHEL6.5 中集中支持 Docker仅财;Google 也在其 PaaS 產(chǎn)品中廣泛應(yīng)用狈究。
??Docker 項(xiàng)目的目標(biāo)是實(shí)現(xiàn)輕量級(jí)的操作系統(tǒng)虛擬化解決方案。 Docker 的基礎(chǔ)是 Linux 容器(LXC)等技術(shù)盏求。
??在 LXC 的基礎(chǔ)上 Docker 進(jìn)行了進(jìn)一步的封裝抖锥,讓用戶不需要去關(guān)心容器的管理,使得操作更為簡(jiǎn)便风喇。用戶操作Docker 的容器就像操作一個(gè)快速輕量級(jí)的虛擬機(jī)一樣簡(jiǎn)單宁改。
為什么選擇Docker?
- 更高效的利用系統(tǒng)資源
??由于容器不需要進(jìn)行硬件虛擬以及運(yùn)行完整操作系統(tǒng)等額外開銷,Docker 對(duì)系統(tǒng)資源的利用率更高魂莫。無(wú)論是應(yīng)用執(zhí)行速度还蹲、內(nèi)存損耗或者文件存儲(chǔ)速度,都要比傳統(tǒng)虛擬機(jī)技術(shù)更高效。因此谜喊,相比虛擬機(jī)技術(shù)潭兽,一個(gè)相同配置的主機(jī),往往可以運(yùn)行更多數(shù)量的應(yīng)用斗遏。 - 更快速的啟動(dòng)時(shí)間
??傳統(tǒng)的虛擬機(jī)技術(shù)啟動(dòng)應(yīng)用服務(wù)往往需要數(shù)分鐘山卦,而 Docker 容器應(yīng)用,由于直接運(yùn)行于宿主內(nèi)核诵次,無(wú)需啟動(dòng)完整的操作系統(tǒng)账蓉,因此可以做到秒級(jí)、甚至毫秒級(jí)的啟動(dòng)時(shí)間逾一。大大的節(jié)約了開發(fā)铸本、測(cè)試、部署的時(shí)間遵堵。 - 一致的運(yùn)行環(huán)境
??開發(fā)過(guò)程中一個(gè)常見的問(wèn)題是環(huán)境一致性問(wèn)題箱玷。由于開發(fā)環(huán)境、測(cè)試環(huán)境陌宿、生產(chǎn)環(huán)境不一致锡足,導(dǎo)致有些 bug 并未在開發(fā)過(guò)程中被發(fā)現(xiàn)。而 Docker 的鏡像提供了除內(nèi)核外完整的運(yùn)行時(shí)環(huán)境壳坪,確保了應(yīng)用運(yùn)行環(huán)境一致性舶得,從而不會(huì)再出現(xiàn)「這段代碼在我機(jī)器上沒(méi)問(wèn)題啊」 這類問(wèn)題。 - 持續(xù)交付和部署
??對(duì)開發(fā)和運(yùn)維(DevOps)人員來(lái)說(shuō)爽蝴,最希望的就是一次創(chuàng)建或配置扩灯,可以在任意地方正常運(yùn)行。
??使用 Docker 可以通過(guò)定制應(yīng)用鏡像來(lái)實(shí)現(xiàn)持續(xù)集成霜瘪、持續(xù)交付珠插、部署。開發(fā)人員可以通過(guò) Dockerfile 來(lái)進(jìn)行鏡像構(gòu)建颖对,并結(jié)合持續(xù)集成(Continuous Integration) 系統(tǒng)進(jìn)行集成測(cè)試捻撑,而運(yùn)維人員則可以直接在生產(chǎn)環(huán)境中快速部署該鏡像俐镐,甚至結(jié)合持續(xù)部署(Continuous Delivery/Deployment) 系統(tǒng)進(jìn)行自動(dòng)部署虎韵。
??而且使用 Dockerfile 使鏡像構(gòu)建透明化遥诉,不僅僅開發(fā)團(tuán)隊(duì)可以理解應(yīng)用運(yùn)行環(huán)境柠横,也方便運(yùn)維團(tuán)隊(duì)理解應(yīng)用運(yùn)行所需條件,幫助更好的生產(chǎn)環(huán)境中部署該鏡像钥顽。 - 更輕松的遷移
??由于 Docker 確保了執(zhí)行環(huán)境的一致性块仆,使得應(yīng)用的遷移更加容易脐彩。Docker 可以在很多平臺(tái)上運(yùn)行徙歼,無(wú)論是物理機(jī)犁河、虛擬機(jī)鳖枕、公有云、私有云桨螺,甚至是筆記本宾符,其運(yùn)行結(jié)果是一致的。因此用戶可以很輕易的將在一個(gè)平臺(tái)上運(yùn)行的應(yīng)用灭翔,遷移到另一個(gè)平臺(tái)上魏烫,而不用擔(dān)心運(yùn)行環(huán)境的變化導(dǎo)致應(yīng)用無(wú)法正常運(yùn)行的情況。 - 更輕松的維護(hù)和擴(kuò)展
??Docker 使用的分層存儲(chǔ)以及鏡像的技術(shù)肝箱,使得應(yīng)用重復(fù)部分的復(fù)用更為容易哄褒,也使得應(yīng)用的維護(hù)更新更加簡(jiǎn)單,基于基礎(chǔ)鏡像進(jìn)一步擴(kuò)展鏡像也變得非常簡(jiǎn)單煌张。此外读处,Docker 團(tuán)隊(duì)同各個(gè)開源項(xiàng)目團(tuán)隊(duì)一起維護(hù)了一大批高質(zhì)量的官方鏡像,既可以直接在生產(chǎn)環(huán)境使用唱矛,又可以作為基礎(chǔ)進(jìn)一步定制,大大的降低了應(yīng)用服務(wù)的鏡像制作成本井辜。
1.3 容器與虛擬機(jī)的比較
??下面的圖片比較了 Docker 和傳統(tǒng)虛擬化方式的不同之處绎谦,可見容器是在操作系統(tǒng)層面上實(shí)現(xiàn)虛擬化,直接復(fù)用本地主機(jī)的操作系統(tǒng)粥脚,而傳統(tǒng)方式則是在硬件層面實(shí)現(xiàn)窃肠。
與傳統(tǒng)的虛擬機(jī)相比,Docker優(yōu)勢(shì)體現(xiàn)為啟動(dòng)速度快刷允、占用體積小冤留。
1.4 Docker組件
1.4.1 Docker服務(wù)器與客戶端
??Docker是一個(gè)客戶端-服務(wù)器(C/S)架構(gòu)程序。Docker客戶端只需要向Docker服務(wù)器或者守護(hù)進(jìn)程發(fā)出請(qǐng)求树灶,服務(wù)器或者守護(hù)進(jìn)程將完成所有工作并返回結(jié)果纤怒。Docker提供了一個(gè)命令行工具Docker以及一整套R(shí)ESTful API。你可以在同一臺(tái)宿主機(jī)上運(yùn)行Docker守護(hù)進(jìn)程和客戶端天通,也可以從本地的Docker客戶端連接到運(yùn)行在另一臺(tái)宿主機(jī)上的遠(yuǎn)程Docker守護(hù)進(jìn)程泊窘。
1.4.2 Docker鏡像與容器
??鏡像是構(gòu)建Docker的基石。用戶基于鏡像來(lái)運(yùn)行自己的容器像寒。鏡像也是Docker生命周期中的“構(gòu)建”部分烘豹。鏡像是基于聯(lián)合文件系統(tǒng)的一種層式結(jié)構(gòu),由一系列指令一步一步構(gòu)建出來(lái)诺祸。例如:
- 添加一個(gè)文件携悯;
- 執(zhí)行一個(gè)命令;
- 打開一個(gè)窗口筷笨。
??也可以將鏡像當(dāng)作容器的“源代碼”憔鬼。鏡像體積很小龟劲,非常“便攜”逊彭,易于分享咸灿、存儲(chǔ)和更新。
??Docker可以幫助你構(gòu)建和部署容器侮叮,你只需要把自己的應(yīng)用程序或者服務(wù)打包放進(jìn)容器即可避矢。容器是基于鏡像啟動(dòng)起來(lái)的,容器中可以運(yùn)行一個(gè)或多個(gè)進(jìn)程囊榜。我們可以認(rèn)為审胸,鏡像是Docker生命周期中的構(gòu)建或者打包階段,而容器則是啟動(dòng)或者執(zhí)行階段卸勺。容器基于鏡像啟動(dòng)砂沛,一旦容器啟動(dòng)完成后,我們就可以登錄到容器中安裝自己需要的軟件或者服務(wù)曙求。
所以Docker容器就是:
- 一個(gè)鏡像格式碍庵;
- 一些列標(biāo)準(zhǔn)操作;
- 一個(gè)執(zhí)行環(huán)境悟狱。
??Docker借鑒了標(biāo)準(zhǔn)集裝箱的概念静浴。標(biāo)準(zhǔn)集裝箱將貨物運(yùn)往世界各地,Docker將這個(gè)模型運(yùn)用到自己的設(shè)計(jì)中挤渐,唯一不同的是:集裝箱運(yùn)輸貨物苹享,而Docker運(yùn)輸軟件。
??和集裝箱一樣浴麻,Docker在執(zhí)行上述操作時(shí)得问,并不關(guān)心容器中到底裝了什么,它不管是web服務(wù)器软免,還是數(shù)據(jù)庫(kù)宫纬,或者是應(yīng)用程序服務(wù)器什么的。所有的容器都按照相同的方式將內(nèi)容“裝載”進(jìn)去膏萧。
??Docker也不關(guān)心你要把容器運(yùn)到何方:我們可以在自己的筆記本中構(gòu)建容器哪怔,上傳到Registry,然后下載到一個(gè)物理的或者虛擬的服務(wù)器來(lái)測(cè)試向抢,在把容器部署到具體的主機(jī)中认境。像標(biāo)準(zhǔn)集裝箱一樣,Docker容器方便替換挟鸠,可以疊加叉信,易于分發(fā),并且盡量通用艘希。
1.4.2.1 Registry(注冊(cè)中心)
??Docker用Registry來(lái)保存用戶構(gòu)建的鏡像硼身。Registry分為公共和私有兩種硅急。Docker公司運(yùn)營(yíng)公共的Registry叫做Docker Hub。用戶可以在Docker Hub注冊(cè)賬號(hào)佳遂,分享并保存自己的鏡像(說(shuō)明:在Docker Hub下載鏡像巨慢营袜,可以自己構(gòu)建私有的Registry)。
https://hub.docker.com/
二丑罪、Docker安裝
2.1 安裝Docker
??Docker官方建議在Ubuntu中安裝荚板,因?yàn)镈ocker是基于Ubuntu發(fā)布的,而且一般Docker出現(xiàn)的問(wèn)題Ubuntu是最先更新或者打補(bǔ)丁的吩屹。在很多版本的CentOS中是不支持更新最新的一些補(bǔ)丁包的跪另。
??由于我的環(huán)境使用的是CentOS,因此這里我將Docker安裝到CentOS上煤搜。注意:這里建議安裝在CentOS7.x以上的版本免绿,在CentOS6.x的版本中,安裝前需要安裝其他很多的環(huán)境而且Docker很多補(bǔ)丁不支持更新擦盾。
- yum 包更新到最新
yum update
- 安裝需要的軟件包嘲驾, yum-util 提供yum-config-manager功能,另外兩個(gè)是devicemapper驅(qū)動(dòng)依賴的
yum install -y yum-utils device-mapper-persistent-data lvm2
- 設(shè)置yum源為阿里云
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安裝docker
yum -y install docker-ce
- 安裝后查看docker版本
docker -v
2.2 設(shè)置ustc的鏡像
??ustc是老牌的linux鏡像服務(wù)提供者了迹卢,還在遙遠(yuǎn)的ubuntu 5.04版本的時(shí)候就在用辽故。ustc的docker鏡像加速器速度很快。ustc docker mirror的優(yōu)勢(shì)之一就是不需要注冊(cè)婶希,是真正的公共服務(wù)。
https://lug.ustc.edu.cn/wiki/mirrors/help/docker
編輯該文件
mkdir -p /etc/docker
vim /etc/docker/daemon.json
在該文件中輸入如下內(nèi)容
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
2.3 Docker的啟動(dòng)與停止
啟動(dòng)docker:
systemctl start docker
停止docker
systemctl stop docker
重啟docker
systemctl restart docker
查看docker狀態(tài)
systemctl status docker
開機(jī)啟動(dòng)
systemctl enable docker
查看docker概要信息
docker info
查看docker幫助文檔
docker --help
三蓬衡、常用命令
3.1 鏡像相關(guān)命令
3.1.1 查看鏡像
docker images
- REPOSITORY :鏡像名稱
- TAG :鏡像標(biāo)簽
- IMAGE ID :鏡像ID
- CREATED :鏡像的創(chuàng)建日期(不是獲取該鏡像的日期)
- SIZE :鏡像大小
這些鏡像都是存儲(chǔ)在Docker宿主機(jī)的 /var/lib/docker 目錄下
3.1.2 搜索鏡像
如果你需要從網(wǎng)絡(luò)中查找需要的鏡像喻杈,可以通過(guò)以下命令搜索
docker search 鏡像名稱
- NAME :倉(cāng)庫(kù)名稱
- DESCRIPTION :鏡像描述
- STARS :用戶評(píng)價(jià),反應(yīng)一個(gè)鏡像的受歡迎程度
- OFFICIAL :是否官方
- AUTOMATED :自動(dòng)構(gòu)建狰晚,表示該鏡像由Docker Hub自動(dòng)構(gòu)建流程創(chuàng)建的
3.1.3 拉取鏡像
拉取鏡像就是從中央倉(cāng)庫(kù)中下載鏡像到本地
docker pull 鏡像名稱
例如筒饰,我要下載centos7鏡像
docker pull centos:7
3.1.4 刪除鏡像
按鏡像ID刪除鏡像
docker rmi 鏡像ID
刪除所有鏡像
docker rmi `docker images -q`
3.2 容器相關(guān)命令
3.2.1 查看容器
查看正在運(yùn)行的容器
docker ps
查看所有容器
docker ps –a
查看最后一次運(yùn)行的容器
docker ps –l
查看停止的容器
docker ps -f status=exited
3.2.2 創(chuàng)建與啟動(dòng)容器
創(chuàng)建容器常用的參數(shù)說(shuō)明:
創(chuàng)建容器命令:
docker run
-i :表示運(yùn)行容器
-t :表示容器啟動(dòng)后會(huì)進(jìn)入其命令行。加入這兩個(gè)參數(shù)后壁晒,容器創(chuàng)建就能登錄進(jìn)去瓷们。即分配一個(gè)偽終端。
--name :為創(chuàng)建的容器命名秒咐。
-v :表示目錄映射關(guān)系(前者是宿主機(jī)目錄谬晕,后者是映射到宿主機(jī)上的目錄),可以使用多個(gè)-v 做多個(gè)目錄或文件映射携取。注意:最好做目錄映射攒钳,在宿主機(jī)上做修改,然后共享到容器上雷滋。
-d :在run后面加上-d參數(shù),則會(huì)創(chuàng)建一個(gè)守護(hù)式容器在后臺(tái)運(yùn)行(這樣創(chuàng)建容器后不會(huì)自動(dòng)登錄容器不撑,如果只加-i -t 兩個(gè)參數(shù)文兢,創(chuàng)建后就會(huì)自動(dòng)進(jìn)入容器)。
-p :表示端口映射焕檬,前者是宿主機(jī)端口姆坚,后者是容器內(nèi)的映射端口∈涤蓿可以使用多個(gè)-p做多個(gè)端口映射
- 交互式方式創(chuàng)建容器:
docker run -it --name=容器名稱 鏡像名稱:標(biāo)簽/bin/bash
這時(shí)我們通過(guò)ps命令查看兼呵,發(fā)現(xiàn)可以看到啟動(dòng)的容器,狀態(tài)為啟動(dòng)狀態(tài)
?退出當(dāng)前容器
?exit
- 守護(hù)式方式創(chuàng)建容器:
docker run -di --name=容器名稱 鏡像名稱:標(biāo)簽
登錄守護(hù)式容器方式:
docker exec -it 容器名稱 (或者容器ID) /bin/bash
3.2.3 停止與啟動(dòng)容器
停止容器:
docker stop 容器名稱(或者容器ID)
啟動(dòng)容器:
docker start 容器名稱(或者容器ID)
3.2.4 文件拷貝
如果我們需要將文件拷貝到容器內(nèi)可以使用cp命令
docker cp 需要拷貝的文件或目錄 容器名稱:容器目錄
也可以將文件從容器內(nèi)拷貝出來(lái)
docker cp 容器名稱:容器目錄 需要拷貝的文件或目錄
3.2.5 目錄掛載
??我們可以在創(chuàng)建容器的時(shí)候爆侣,將宿主機(jī)的目錄與容器內(nèi)的目錄進(jìn)行映射萍程,這樣我們就可以通過(guò)修改宿主機(jī)某個(gè)目錄的文件從而去影響容器。
創(chuàng)建容器 添加 -v 參數(shù)后邊為宿主機(jī)目錄:容器目錄兔仰,例如:
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
??如果你共享的是多級(jí)的目錄茫负,可能會(huì)出現(xiàn)權(quán)限不足的提示。
??這是因?yàn)镃entOS7中的安全模塊selinux把權(quán)限禁掉了乎赴,我們需要添加參數(shù) --privileged=true 來(lái)解決掛載的目錄沒(méi)有權(quán)限的問(wèn)題
3.2.6 查看容器IP地址
我們可以通過(guò)以下命令查看容器運(yùn)行的各種數(shù)據(jù)
docker inspect 容器名稱(容器ID)
也可以直接執(zhí)行下面的命令直接輸出IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱(容器ID)
3.2.7 刪除容器
刪除指定的容器:
docker rm 容器名稱(容器ID)
四忍法、應(yīng)用部署
4.1 Mysql部署
拉取mysql鏡像
docker pull mysql:5.7
創(chuàng)建容器
docker run -di --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
-p 代表端口映射,格式為 宿主機(jī)映射端口:容器運(yùn)行端口
-e 代表添加環(huán)境變量 MYSQL_ROOT_PASSWORD是root用戶的登陸密碼
遠(yuǎn)程登錄mysql
連接宿主機(jī)的IP ,指定端口為3306
docker exec -it mysql /bin/bash
使用mysql命令打開客戶端
mysql -uroot -proot --default-character-set=utf8
4.2 Nginx部署
拉取鏡像
docker pull nginx
創(chuàng)建Nginx容器
docker run -di --name=nginx -p 80:80 nginx
將容器內(nèi)的配置文件拷貝到指定目錄
docker cp nginx:/etc/nginx /mydata/nginx/
修改文件名稱
mv nginx conf
終止并刪除容器
docker stop nginx
docker rm nginx
使用docker命令啟動(dòng)
docker run -di --name=nginx -p 80:80 -v /mydata/nginx/conf:/etc/nginx nginx
4.3 Redis部署
拉取鏡像
docker pull redis
創(chuàng)建容器
docker run -di --name=redis -p 6379:6379 redis
4.4 RabbitMQ部署
拉取鏡像
docker pull rabbitmq:3.7.12
創(chuàng)建容器
docker run -di --name=rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:3.7.12
進(jìn)入容器并開啟管理功能
docker exec -it rabbitmq /bin/bash
#此命令需要在容器中運(yùn)行
rabbitmq-plugins enable rabbitmq_management
訪問(wèn)地址查看是否安裝成功:http://宿主機(jī)IP:15672/
4.5 Elasticsearch部署
拉取鏡像
docker pull elasticsearch:7.5.0
修改虛擬內(nèi)存區(qū)域大小榕吼,否則會(huì)因?yàn)檫^(guò)小而無(wú)法啟動(dòng)
sysctl -w vm.max_map_count=262144
創(chuàng)建容器
docker run -di --name=elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "cluster.name=elasticsearch" -v
/mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins elasticsearch:7.5.0
安裝中文分詞器
docker exec -it elasticsearch /bin/bash
#此命令需要在容器中運(yùn)行
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.5.0/elasticsearch-analysis-ik-7.5.0.zip
docker restart elasticsearch
訪問(wèn):http://宿主機(jī)IP:9200/
4.6 Zookeeper部署
拉取鏡像
docker pull zookeeper:3.4.13
創(chuàng)建容器
docker run -di --name=zookeeper -p 2181:2181 zookeeper:3.4.13
五饿序、遷移與備份
5.1 容器保存為鏡像
我們可以通過(guò)以下命令將容器保存為鏡像
docker commit redis myredis
5.2 鏡像備份
我們可以通過(guò)以下命令將鏡像保存為tar 文件
docker save -o myredis.tar myredis
5.3 鏡像恢復(fù)與遷移
首先我們先刪除掉myredis鏡像 然后執(zhí)行此命令進(jìn)行恢復(fù)
docker load -i myredis.tar
-i 輸入的文件
執(zhí)行后再次查看鏡像,可以看到鏡像已經(jīng)恢復(fù)
六羹蚣、Dockerfile
6.1 什么是Dockerfile
Dockerfile是由一系列命令和參數(shù)構(gòu)成的腳本原探,這些命令應(yīng)用于基礎(chǔ)鏡像并最終創(chuàng)建一個(gè)新的鏡像。
- 對(duì)于開發(fā)人員:可以為開發(fā)團(tuán)隊(duì)提供一個(gè)完全一致的開發(fā)環(huán)境顽素;
- 對(duì)于測(cè)試人員:可以直接拿開發(fā)時(shí)所構(gòu)建的鏡像或者通過(guò)Dockerfile文件構(gòu)建一個(gè)新的鏡像開始工作了咽弦;
- 對(duì)于運(yùn)維人員:在部署時(shí),可以實(shí)現(xiàn)應(yīng)用的無(wú)縫移植胁出。
6.2 常用命令
命令 | 作用 |
---|---|
FROM image_name:tag | 定義了使用哪個(gè)基礎(chǔ)鏡像啟動(dòng)構(gòu)建流程 |
MAINTAINER user_name | 聲明鏡像的創(chuàng)建者 |
ENV key value | 設(shè)置環(huán)境變量 (可以寫多條) |
RUN command | 是Dockerfile的核心部分(可以寫多條) |
ADD source_dir/file dest_dir/file | 將宿主機(jī)的文件復(fù)制到容器內(nèi)型型,如果是一個(gè)壓縮文件,將會(huì)在復(fù)制后自動(dòng)解壓 |
COPY source_dir/file dest_dir/file | 和ADD相似全蝶,但是如果有壓縮文件并不能解壓 |
WORKDIR path_dir | 設(shè)置工作目錄 |
6.3 使用腳本創(chuàng)建鏡像
創(chuàng)建目錄
mkdir –p /usr/local/dockerjdk8
下載 jdk-8u202-linux-x64.tar.gz 并上傳到服務(wù)器(虛擬機(jī))中的 /usr/local/dockerjdk8 目錄
創(chuàng)建文件Dockerfile
vim Dockerfile
#依賴鏡像名稱和ID
FROM centos:7
#指定鏡像創(chuàng)建者信息
MAINTAINER xxxx
#切換工作目錄
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相對(duì)路徑j(luò)ar,把java添加到容器中
ADD jdk-8u202-linux-x64.tar.gz /usr/local/java/
#配置java環(huán)境變量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_202
ENV PATH $JAVA_HOME/bin:$PATH
執(zhí)行命令構(gòu)建鏡像
docker build -t='jdk1.8' .
注意后邊的空格和點(diǎn)闹蒜,不要省略
查看鏡像是否建立完成
docker images
七、Docker私有倉(cāng)庫(kù)
7.1 私有倉(cāng)庫(kù)搭建與配置
拉取私有倉(cāng)庫(kù)鏡像
docker pull registry
啟動(dòng)私有倉(cāng)庫(kù)容器
docker run -di --name=registry -p 5000:5000 registry
打開瀏覽器輸入地址http://宿主機(jī)IP:5000/v2/_catalog看到 {"repositories":[]} 表示私有倉(cāng)庫(kù)搭建成功并且內(nèi)容為空
修改daemon.json
vim /etc/docker/daemon.json
添加以下內(nèi)容抑淫,保存退出绷落。
{"insecure-registries":["宿主機(jī)IP:5000"]}
若daemon.json中已存在內(nèi)容 直接在 {} 繼續(xù)中添加
,"insecure-registries":["宿主機(jī)IP:5000"]
此步用于讓 docker信任私有倉(cāng)庫(kù)地址
重啟docker 服務(wù)
systemctl restart docker
7.2 鏡像上傳至私有倉(cāng)庫(kù)
標(biāo)記此鏡像為私有倉(cāng)庫(kù)的鏡像
docker tag jdk1.8 宿主機(jī)IP:5000/jdk1.8
再次啟動(dòng)私服容器
docker start registry
上傳標(biāo)記的鏡像
docker push 宿主機(jī)IP:5000/jdk1.8
八、DcokerMaven插件
微服務(wù)部署有兩種方法:
- 手動(dòng)部署:首先基于源碼打包生成jar包(或war包),將jar包(或war包)上傳至虛擬機(jī)并拷貝至JDK容器始苇。
- 通過(guò)Maven插件自動(dòng)部署嘱函。
??對(duì)于數(shù)量眾多的微服務(wù),手動(dòng)部署無(wú)疑是非常麻煩的做法埂蕊,并且容易出錯(cuò)往弓。所以我們這里學(xué)習(xí)如何自動(dòng)部署疏唾,這也是企業(yè)實(shí)際開發(fā)中經(jīng)常使用的方法。
Maven插件自動(dòng)部署步驟:
8.1 修改宿主機(jī)的docker配置函似,讓其可以遠(yuǎn)程訪問(wèn)
vim /lib/systemd/system/docker.service
修改以 ExecStart 開頭的行
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
修改后如下:
8.2 刷新配置槐脏,重啟服務(wù)
systemctl daemon-reload
systemctl restart docker
docker start registry
8.3 在工程pom.xml增加配置
<!--docker的maven插件,官網(wǎng):https://github.com/spotify/docker-maven-plugin-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.0</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution></executions>
<configuration>
<imageName>ego/${project.artifactId}:${project.version}</imageName>
<dockerHost>http://192.168.10.101:2375</dockerHost>
<baseImage>java:8</baseImage>
<entryPoint>["java", "-jar", "-
Dspring.profiles.active=dev","/${project.build.finalName}.jar"]
</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
雙擊Maven-->Lifecycle-->package :