前言
Docker 代表的容器技術(shù)是近兩年的大熱技術(shù)圾亏,和人工智能、區(qū)塊鏈等熱點(diǎn)不同碗誉,容器技術(shù)的門檻并不高,每一個(gè)開(kāi)發(fā)父晶、測(cè)試哮缺、運(yùn)維人員都能在日常工作中掌握和使用,是當(dāng)今 IT 從業(yè)人員的必備技能之一甲喝。
本文主要講解 Docker 技術(shù)棧及其應(yīng)用實(shí)踐尝苇,從環(huán)境安裝到容器、鏡像操作以及生產(chǎn)環(huán)境如何部署開(kāi)發(fā)的微服務(wù)應(yīng)用埠胖,希望本文對(duì)大家學(xué)習(xí) Docker 技術(shù)有所幫助糠溜。
什么是容器
為什么需要容器?虛擬化不是已經(jīng)夠了么直撤?
對(duì)于還沒(méi)有接觸到容器技術(shù)的小伙伴們而言非竿,可能覺(jué)得我們并沒(méi)有必要花費(fèi)大量的時(shí)間和經(jīng)歷去學(xué)習(xí)容器技術(shù)。也可能有很多小伙伴會(huì)覺(jué)得容器技術(shù)就是“新瓶裝舊酒”谋竖,沒(méi)啥學(xué)習(xí)的必要红柱。
在 IT 技術(shù)中承匣,KVM、VMware 等虛擬化技術(shù)已經(jīng)做得很好了锤悄。為什么還要學(xué)習(xí)容器技術(shù)呢韧骗?這就要聊一下虛擬化技術(shù)在實(shí)際業(yè)務(wù)中存在的問(wèn)題了:
虛擬化技術(shù)的確可以讓我們更好的利用服務(wù)器資源,也可以在宿主機(jī)上安裝多個(gè)不同的操作系統(tǒng)如 CentOS零聚、Ubuntu 以及 Windows 等等袍暴,運(yùn)行多套不同的應(yīng)用。但可能我們就是為了運(yùn)行一個(gè)簡(jiǎn)單的應(yīng)用如 Nginx隶症,卻還要在虛擬機(jī)里運(yùn)行一個(gè)完整的操作系統(tǒng)政模,內(nèi)核和其它無(wú)關(guān)程序,這種做法資源利用不高沿腰。
所以我們希望更多的關(guān)注應(yīng)用程序本身览徒,而不再分精力去關(guān)注操作系統(tǒng)與無(wú)關(guān)程序,操作系統(tǒng)內(nèi)核直接與宿主機(jī)共享颂龙。
為了實(shí)現(xiàn)上面的方案习蓬,我們就需要一種更加輕量級(jí)的虛擬化技術(shù)——容器技術(shù)。
什么是容器措嵌?
在生活中躲叼,瓶子、罐子企巢、盆枫慷、試管、箱子等用來(lái)裝東西的都是容器浪规。
而在 IT 行業(yè)中或听,容器技術(shù)是一種輕量級(jí)的虛擬化技術(shù)。主要特點(diǎn)有:
- 輕量:只打包了需要的 bins/libs(也就是命令和庫(kù)文件)笋婿。與宿主機(jī)共享操作系統(tǒng)誉裆,直接使用宿主機(jī)的內(nèi)核。
- 部署快:容器的鏡像相對(duì)虛擬機(jī)的鏡像小缸濒。部署速度非匙愣快,秒級(jí)部署庇配,
- 移植性好:Build once,Run anywhere(一次構(gòu)建斩跌,隨處部署運(yùn)行)。
- 資源利用率更高:相對(duì)于虛擬機(jī)捞慌,不需要安裝操作系統(tǒng)耀鸦,所以幾乎沒(méi)有額外的 CPU、內(nèi)存消耗啸澡。
Docker 容器技術(shù)介紹
Docker 技術(shù)是目前最火熱的能實(shí)現(xiàn)容器技術(shù)的軟件揭糕,使用 Go(Golang)語(yǔ)言開(kāi)發(fā)萝快。其官方地址:
Docker 版本
2017 之前版本:
1.7、 1.8著角、1.9揪漩、1.10、1.11吏口、1.12奄容、1.13
2017 年的 3 月 1 號(hào)之后,Docker 的版本命名開(kāi)始發(fā)生變化产徊,同時(shí)將 CE 版本和 EE 版本進(jìn)行分開(kāi)昂勒。
Docker 社區(qū)版(CE):為了開(kāi)發(fā)人員或小團(tuán)隊(duì)創(chuàng)建基于容器的應(yīng)用,與團(tuán)隊(duì)成員分享和自動(dòng)化的開(kāi)發(fā)管道。docker-ce 提供了簡(jiǎn)單的安裝和快速的安裝舟铜,以便可以立即開(kāi)始開(kāi)發(fā)戈盈。docker-ce 集成和優(yōu)化,基礎(chǔ)設(shè)施谆刨。
- 17-03-ce
- 17-06-ce
- 18-03-ce
- 18-06-ce
- 18-09-ce
Docker 企業(yè)版(EE):專為企業(yè)的發(fā)展和 IT 團(tuán)隊(duì)建立塘娶。docker-ee 為企業(yè)提供最安全的容器平臺(tái),以應(yīng)用為中心的平臺(tái)痊夭。
PS:所以我們安裝的時(shí)候刁岸,要安裝 docker-ce,千萬(wàn)不要搞錯(cuò)了哦她我!
Docker 底層內(nèi)核相關(guān)技術(shù)
Docker 容器本質(zhì)上是宿主機(jī)的進(jìn)程虹曙。可以把 Docker 容器內(nèi)部跑的進(jìn)程看作是宿主機(jī)的線程番舆。
Docker 通過(guò) NameSpace 實(shí)現(xiàn)了資源隔離酝碳,通過(guò) CGroups 實(shí)現(xiàn)了資源限制。
NameSpace
Linux 內(nèi)核實(shí)現(xiàn) NameSpace 的一個(gè)主要目的就是實(shí)現(xiàn)輕量級(jí)虛擬化(容器)服務(wù)恨狈。在同一個(gè) NameSpace 下的進(jìn)程可以感知彼此的變化疏哗,而對(duì)外界的進(jìn)程一無(wú)所知。
Control Group
控制組(CGroups)是 Linux 內(nèi)核的一個(gè)特性拴事,主要用來(lái)對(duì)共享資源進(jìn)行隔離沃斤、限制圣蝎、審計(jì)等刃宵。
只有能控制分配到容器的資源,才能避免多個(gè)容器同時(shí)運(yùn)行時(shí)對(duì)宿主機(jī)系統(tǒng)的資源競(jìng)爭(zhēng)徘公。
控制組可以提供對(duì)容器的內(nèi)存牲证、CPU、磁盤 IO 等資源進(jìn)行限制和計(jì)費(fèi)管理关面。
LXC 與 Docker 區(qū)別
LXC 為 Linux Container 的簡(jiǎn)寫坦袍,可以提供輕量級(jí)的虛擬化十厢。
Docker 的底層就是使用了 LXC 來(lái)實(shí)現(xiàn)的。Docker 以 LXC 為基礎(chǔ)捂齐,實(shí)現(xiàn)了更多更強(qiáng)的功能蛮放。
Docker 內(nèi)容小結(jié)
容器屬于操作系統(tǒng)虛擬化,屬于 Paas奠宜,容器可看作是一種輕量級(jí)包颁,進(jìn)程級(jí)的虛擬機(jī)。
相比于 KVM 虛擬機(jī)的優(yōu)勢(shì):
- 不需要安裝 OS压真,和宿主機(jī)共享
- 鏡像存儲(chǔ)空間小
- 啟動(dòng)速度快(容器為秒級(jí)娩嚼,虛擬機(jī)一般需要 10 秒左右)
- 移植性更好,更輕便
- 性能更好
Docker 是一個(gè)實(shí)現(xiàn)容器的軟件滴肿,底層使用 LXC岳悟。Docker 主要使用 NameSpace 命名空間技術(shù)實(shí)現(xiàn)資源隔離,使用 CGroup 實(shí)現(xiàn)資源限制泼差。
Docker 容器化部署以及 Docker 加速器配置
環(huán)境要求
- 建議直接在 Linux 宿主機(jī)上跑 Docker(當(dāng)然也可以在虛擬機(jī)里跑 Docker)
- 不能直接在 Windows 上跑 Docker(因?yàn)?NameSpace贵少,CGroup 是 Linux 內(nèi)核特性,Windows 沒(méi)有)
- Windows 上可以先跑 Linux 虛擬機(jī),再在 Linux 虛擬機(jī)上跑 Docker
Docker 安裝
默認(rèn)情況下拴驮,我們使用 yum 安裝時(shí)春瞬,官方源比較慢,所以建議大家使用國(guó)內(nèi) yum 源套啤。
### wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
### yum install docker-ce -y
注意:要安裝 docker-ce 版宽气,不要安裝 Docker(否則可能安裝 1.13 老版本)。
修改 docker.service
### vim /usr/lib/systemd/system/docker.service
14 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
15 ExecStartPost=/sbin/iptables -P FORWARD ACCEPT 添加此行內(nèi)容
啟動(dòng)服務(wù)
### systemctl start docker
### systemctl enable docker
查看版本信息
### docker -v
Docker version 19.03.8, build afacb8b
一個(gè)故事帶你了解容器生態(tài)圈
Docker 技術(shù)的三大核心概念潜沦,分別是:
- 鏡像(image): 鏡像就是打包好的環(huán)境與應(yīng)用萄涯。
- 容器(contanier): 容器就是運(yùn)行鏡像的實(shí)例。 鏡像看作是靜態(tài)的唆鸡,容器是動(dòng)態(tài)的涝影。
- 倉(cāng)庫(kù)(repository): 存放多個(gè)鏡像的一個(gè)倉(cāng)庫(kù)。
我們通過(guò)一個(gè)小故事(案例)來(lái)引入鏡像争占、容器和倉(cāng)庫(kù)的概念燃逻,看下圖:
假設(shè)我們有一天需要快速構(gòu)建一個(gè)基于 Nginx/MySQL 等應(yīng)用的項(xiàng)目:咱們第一件事是干嘛,按照以往的構(gòu)建思路臂痕,肯定是一個(gè)軟件一個(gè)軟件安裝伯襟,安裝完成后,在進(jìn)行關(guān)聯(lián)配置握童∧饭郑可能我們需要花費(fèi)一天的時(shí)間來(lái)安裝和準(zhǔn)備我們所需的應(yīng)用環(huán)境,是不是特別麻煩。
那現(xiàn)在我教你一種法術(shù)叫做 Docker 技術(shù)稽揭,其擁有 Docker 客戶端俺附、Docker 服務(wù)器端(Docker daemon)、Docker Hub 官方倉(cāng)庫(kù)溪掀。
Docker Hub 被稱之為倉(cāng)庫(kù)事镣,你所要的所有應(yīng)用都在這里哦(要啥有啥)。你安裝完 Docker 后揪胃,我們可以通過(guò)專門的 Docker 命令去倉(cāng)庫(kù)拉取鏡像到服務(wù)器端蛮浑,然后 Docker 會(huì)將鏡像構(gòu)建成容器,讓其跑起來(lái)只嚣。以后你需要啥應(yīng)用沮稚,只需要通過(guò) Docker 這個(gè)法術(shù)就能輕松構(gòu)建你想要的任何應(yīng)用啦,這就是容器技術(shù)册舞!
鏡像管理與 Docker Hub 鏡像倉(cāng)庫(kù)
鏡像主要分為兩類:
- 操作系統(tǒng)類(如 CentOS蕴掏、Ubuntu)
- 應(yīng)用程序類
查看鏡像列表
通過(guò) docker images
命令查看本地當(dāng)前鏡像列表,默認(rèn)為空调鲸;使用 man docker-images
得到參數(shù)說(shuō)明:
### docker images
搜索鏡像
通過(guò) docker search
查找官方鏡像盛杰,使用 man docker-search
得到參數(shù)說(shuō)明。
官方倉(cāng)庫(kù)地址:https://hub.docker.com/藐石。
### docker search centos
拉取鏡像
通過(guò) docker pull
拉燃垂(下載)鏡像,使用 man docker-pull
得到參數(shù)說(shuō)明:
### docker pull centos
### docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 470671670cac 3 months ago 237MB
說(shuō)明:
- 鏡像下載默認(rèn)是去找 Docker 官方倉(cāng)庫(kù)下載于微,它在國(guó)外網(wǎng)絡(luò)逗嫡,所以網(wǎng)速慢(有時(shí)甚至?xí)L問(wèn)不到)
- 鏡像下載時(shí)顯示的大小與最終
docker images
顯示的大小不一致(因?yàn)橛袎嚎s算法,解壓后就變大了)
問(wèn)題:如果鏡像 pull 非常慢株依,怎么解決驱证?
- Docker 鏡像加速器(國(guó)內(nèi)有公司將官方倉(cāng)庫(kù)下載放到國(guó)內(nèi)網(wǎng)絡(luò),我們指定從國(guó)內(nèi)網(wǎng)絡(luò)下載)
- 可以從網(wǎng)速好的宿主機(jī)上 pull 下來(lái),然后導(dǎo)出給網(wǎng)速慢的宿主機(jī)導(dǎo)入
鏡像加速器
### vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
### systemctl daemon-reload
### systemctl restart docker
刪除鏡像
通過(guò) docker rmi
刪除鏡像恋腕,man docker-rmi
查看參數(shù)幫助:
### docker rmi centos
補(bǔ)充:還可以通過(guò) docker rmi 鏡像 ID
刪除抹锄。
Docker Hub 鏡像倉(cāng)庫(kù)
思考一個(gè)問(wèn)題:剛才我們拉取的鏡像都來(lái)自哪里?
答:Docker Hub荠藤。
Docker Hub 為最大的公開(kāi)倉(cāng)庫(kù)伙单,也就是官方倉(cāng)庫(kù):
搜索你想要的鏡像,然后進(jìn)去看看都有點(diǎn)啥:
這個(gè)還涉及到一個(gè)問(wèn)題哈肖,CentOS 有多個(gè)版本吻育,能不能指定我們下載的版本呢?當(dāng)前可以啦牡彻,看下圖:
看到這里你會(huì)發(fā)現(xiàn)扫沼,Docker 從 Hub 上拉取鏡像是非常容易的,學(xué)會(huì)了吧庄吼。那接下來(lái)我們來(lái)聊聊鏡像下載本地后缎除,如何讓它跑起來(lái)。
容器常見(jiàn)操作
查看容器列表
列表所有狀態(tài)的容器总寻,現(xiàn)在為空列表器罐。使用 man docker-ps
得到參數(shù)說(shuō)明:
### docker ps -a
運(yùn)行容器
### docker run -it --name=c1 centos /bin/bash
[root@5a17b9560f33 /]### cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
[root@5a17b9560f33 /]### exit
exit
### docker start c1
c1
### docker attach c1
[root@5a17b9560f33 /]#
說(shuō)明:
-
-i
等同于--interactive
,表示交互;-t
等同于--tty
渐行,表示給一個(gè)終端用于交互轰坊。 -
--name=c1
用于指定容器名。 -
/bin/bash
指定 CentOS 鏡像啟動(dòng)為容器時(shí)的啟動(dòng)命令祟印,不指也可以肴沫,因?yàn)?CentOS 鏡像的默認(rèn)啟動(dòng)命令就是它。 -
cat /etc/redhat-release
看到 CentOS 8.1蕴忆,而uname -r
查看的內(nèi)核是 CentOS 7.6 的, 證明了容器使用的是 Docker host 的內(nèi)核颤芬。 - exit 退出容器后,容器會(huì)變?yōu)?exit 狀態(tài)套鹅。如果同時(shí)按下
ctrl+p+q
三個(gè)按鍵退出后站蝠,容器仍為 UP 狀態(tài)。 -
docker attach
可連接進(jìn)入容器內(nèi)部交互, 但需要容器為啟動(dòng)狀態(tài)卓鹿。
或者用下面的命令連接上去交互式操作(連上去后菱魔,直接用 exit 退出,容器仍然為 UP 狀態(tài)):
### docker exec -it c1 /bin/bash
如果需要獲取容器的輸出信息(如日志)吟孙,我們可以通過(guò) docker logs 容器名稱或容器 ID
澜倦。
與容器交互拷貝文件
將本地 /etc/fstab 拷貝到 c1 容器的 /root/ 目錄下: