Docker從入門到干活,看這一篇足矣 [建議收藏]
容器簡介
什么是?Linux?容器
Linux容器是與系統(tǒng)其他部分隔離開的一系列進(jìn)程,從另一個(gè)鏡像運(yùn)行,并由該鏡像提供支持進(jìn)程所需的全部文件。
容器提供的鏡像包含了應(yīng)用的所有依賴項(xiàng),因而在從開發(fā)到測試再到生產(chǎn)的整個(gè)過程中,它都具有可移植性和一致性。

更加詳細(xì)地來說,請(qǐng)您假定您在開發(fā)一個(gè)應(yīng)用。您使用的是一臺(tái)筆記本電腦,而且您的開發(fā)環(huán)境具有特定的配置。其他開發(fā)人員身處的環(huán)境配置可能稍有不同。您正在開發(fā)的應(yīng)用依賴于您當(dāng)前的配置,還要依賴于某些特定文件。
與此同時(shí),您的企業(yè)還擁有標(biāo)準(zhǔn)化的測試和生產(chǎn)環(huán)境,且具有自身的配置和一系列支持文件。
您希望盡可能多在本地模擬這些環(huán)境,而不產(chǎn)生重新創(chuàng)建服務(wù)器環(huán)境的開銷。
因此,您要如何確保應(yīng)用能夠在這些環(huán)境中運(yùn)行和通過質(zhì)量檢測,并且在部署過程中不出現(xiàn)令人頭疼的問題,也無需重新編寫代碼和進(jìn)行故障修復(fù)?答案就是使用容器。
容器可以確保您的應(yīng)用擁有必需的配置和文件,使得這些應(yīng)用能夠在從開發(fā)到測試、再到生產(chǎn)的整個(gè)流程中順利運(yùn)行,而不出現(xiàn)任何不良問題。這樣可以避免危機(jī),做到皆大歡喜。
無論基礎(chǔ)架構(gòu)是在企業(yè)內(nèi)部還是在云端,或者混合使用兩者,容器都能滿足您的需求。
容器不就是虛擬化嗎
是,但也不竟然。我們用一種簡單方式來思考一下:
虛擬化使得許多操作系統(tǒng)可同時(shí)在單個(gè)系統(tǒng)上運(yùn)行。
容器則可共享同一個(gè)操作系統(tǒng)內(nèi)核,將應(yīng)用進(jìn)程與系統(tǒng)其他部分隔離開。
圖?-?普通虛擬化技術(shù)和Docker的對(duì)比這意味著什么?首先,讓多個(gè)操作系統(tǒng)在單個(gè)虛擬機(jī)監(jiān)控程序上運(yùn)行以實(shí)現(xiàn)虛擬化,并不能達(dá)成和使用容器同等的輕量級(jí)效果。
事實(shí)上,在僅擁有容量有限的有限資源時(shí),您需要能夠可以進(jìn)行密集部署的輕量級(jí)應(yīng)用。
Linux 容器可從單個(gè)操作系統(tǒng)運(yùn)行,在所有容器中共享該操作系統(tǒng),因此應(yīng)用和服務(wù)能夠保持輕量級(jí),并行快速運(yùn)行。
容器發(fā)展簡史?

我們現(xiàn)在稱為容器技術(shù)的概念最初出現(xiàn)在 2000?年,當(dāng)時(shí)稱為 FreeBSD jail,這種技術(shù)可將 FreeBSD 系統(tǒng)分區(qū)為多個(gè)子系統(tǒng)(也稱為 Jail)。
Jail 是作為安全環(huán)境而開發(fā)的,系統(tǒng)管理員可與企業(yè)內(nèi)部或外部的多個(gè)用戶共享這些 Jail。
Jail 的目的是讓進(jìn)程在經(jīng)過修改的 chroot 環(huán)境中創(chuàng)建,而不會(huì)脫離和影響整個(gè)系統(tǒng)?—?在 chroot 環(huán)境中,對(duì)文件系統(tǒng)、網(wǎng)絡(luò)和用戶的訪問都實(shí)現(xiàn)了虛擬化。
盡管 Jail 在實(shí)施方面存在局限性,但最終人們找到了脫離這種隔離環(huán)境的方法。
但這個(gè)概念非常有吸引力。
2001 年,通過 Jacques Gélinas 的 VServer 項(xiàng)目,隔離環(huán)境的實(shí)施進(jìn)入了 Linux 領(lǐng)域。
正如 Gélinas 所說,這項(xiàng)工作的目的是“在高度獨(dú)立且安全的單一環(huán)境中運(yùn)行多個(gè)通用 Linux 服務(wù)器?[sic]?!?
在完成了這項(xiàng)針對(duì) Linux 中多個(gè)受控制用戶空間的基礎(chǔ)性工作后,Linux 容器開始逐漸成形并最終發(fā)展成了現(xiàn)在的模樣。
什么是 Docker?
“Docker”?一詞指代多種事物,包括開源社區(qū)項(xiàng)目、開源項(xiàng)目使用的工具、主導(dǎo)支持此類項(xiàng)目的公司 Docker Inc. 以及該公司官方支持的工具。技術(shù)產(chǎn)品和公司使用同一名稱,的確讓人有點(diǎn)困惑。
? IT 軟件中所說的?“Docker”?,是指容器化技術(shù),用于支持創(chuàng)建和使用 Linux 容器。
??開源 Docker 社區(qū)致力于改進(jìn)這類技術(shù),并免費(fèi)提供給所有用戶,使之獲益。
? Docker Inc. 公司憑借 Docker 社區(qū)產(chǎn)品起家,它主要負(fù)責(zé)提升社區(qū)版本的安全性,并將改進(jìn)后的版本與更廣泛的技術(shù)社區(qū)分享。此外,它還專門對(duì)這些技術(shù)產(chǎn)品進(jìn)行完善和安全固化,以服務(wù)于企業(yè)客戶。
借助 Docker ,您可將容器當(dāng)做重量輕、模塊化的虛擬機(jī)使用。同時(shí),您還將獲得高度的靈活性,從而實(shí)現(xiàn)對(duì)容器的高效創(chuàng)建、部署及復(fù)制,并能將其從一個(gè)環(huán)境順利遷移至另一個(gè)環(huán)境。
Docker 如何工作?
Docker 技術(shù)使用 Linux 內(nèi)核和內(nèi)核功能(例如 Cgroups 和 namespaces)來分隔進(jìn)程,以便各進(jìn)程相互獨(dú)立運(yùn)行。
這種獨(dú)立性正是采用容器的目的所在;它可以獨(dú)立運(yùn)行多種進(jìn)程、多個(gè)應(yīng)用程序,更加充分地發(fā)揮基礎(chǔ)設(shè)施的作用,同時(shí)保持各個(gè)獨(dú)立系統(tǒng)的安全性。
容器工具(包括 Docker)可提供基于鏡像的部署模式。這使得它能夠輕松跨多種環(huán)境,與其依賴程序共享應(yīng)用或服務(wù)組。Docker 還可在這一容器環(huán)境中自動(dòng)部署應(yīng)用程序(或者合并多種流程,以構(gòu)建單個(gè)應(yīng)用程序)。
此外,由于這些工具基于 Linux 容器構(gòu)建,使得 Docker 既易于使用,又別具一格?——?它可為用戶提供前所未有的高度應(yīng)用程訪問權(quán)限、快速部署以及版本控制和分發(fā)能力。
Docker 技術(shù)是否與傳統(tǒng)的 Linux 容器相同?
否。Docker 技術(shù)最初是基于 LXC 技術(shù)構(gòu)建(大多數(shù)人都會(huì)將這一技術(shù)與“傳統(tǒng)的” Linux 容器聯(lián)系在一起),但后來它逐漸擺脫了對(duì)這種技術(shù)的依賴。
就輕量級(jí)?虛擬化?這一功能來看,LXC?非常有用,但它無法提供出色的開發(fā)人員或用戶體驗(yàn)。除了運(yùn)行容器之外,Docker 技術(shù)還具備其他多項(xiàng)功能,包括簡化用于構(gòu)建容器、傳輸鏡像以及控制鏡像版本的流程。

傳統(tǒng)的 Linux 容器使用 init 系統(tǒng)來管理多種進(jìn)程。這意味著,所有應(yīng)用程序都作為一個(gè)整體運(yùn)行。與此相反,Docker 技術(shù)鼓勵(lì)應(yīng)用程序各自獨(dú)立運(yùn)行其進(jìn)程,并提供相應(yīng)工具以實(shí)現(xiàn)這一功能。這種精細(xì)化運(yùn)作模式自有其優(yōu)勢。
docker的目標(biāo)
docker的主要目標(biāo)是"Build,Ship and Run any App,Angwhere",構(gòu)建,運(yùn)輸,處處運(yùn)行
構(gòu)建:做一個(gè)docker鏡像 運(yùn)輸:docker pull 運(yùn)行:啟動(dòng)一個(gè)容器
每一個(gè)容器,他都有自己的文件系統(tǒng)rootfs.
安裝Docker
#?需要兩臺(tái)幾點(diǎn)進(jìn)行安裝
[root@docker01?~]#?cat?/etc/redhat-release?
CentOS?Linux?release?7.2.1511?(Core)?
[root@docker01?~]#?uname??-r?
3.10.0-327.el7.x86_64
[root@docker01?~]#?hostname?-I
10.0.0.100?172.16.1.100?
[root@docker02?~]#?hostname?-I
10.0.0.101?172.16.1.101在兩個(gè)節(jié)點(diǎn)上都進(jìn)行操作
wget?-O?/etc/yum.repos.d/docker-ce.repo?https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed?-i?'s#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g'?/etc/yum.repos.d/docker-ce.repo
yum?install?docker-ce?-y修改在docker01配置:
#?修改啟動(dòng)文件,監(jiān)聽遠(yuǎn)程端口
vim?/usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd?-H?unix:///var/run/docker.sock?-H?tcp://10.0.0.100:2375
systemctl?daemon-reload
systemctl?enable?docker.service?
systemctl?restart?docker.service
#?ps?-ef檢查進(jìn)行,是否啟動(dòng)在docker02測試
[root@docker02?~]#?docker?-H?10.0.0.100?info
Containers:?0
?Running:?0
?Paused:?0
?Stopped:?0
Images:?0
Server?Version:?17.12.0-ce
Storage?Driver:?devicemapper
···Docker基礎(chǔ)命令操作
查看docker相關(guān)信息
[root@docker01?~]#??docker?version??
Client:
?Version:????17.12.0-ce
?API?version:????1.35
?Go?version:????go1.9.2
?Git?commit:????c97c6d6
?Built:????Wed?Dec?27?20:10:14?2017
?OS/Arch:????linux/amd64
Server:
?Engine:
??Version:????17.12.0-ce
??API?version:????1.35?(minimum?version?1.12)
??Go?version:????go1.9.2
??Git?commit:????c97c6d6
??Built:????Wed?Dec?27?20:12:46?2017
??OS/Arch:????linux/amd64
??Experimental:????false配置docker鏡像加速
vi?/etc/docker/daemon.json
{
??"registry-mirrors":?["https://registry.docker-cn.com"]
}???啟動(dòng)第一個(gè)容器
[root@docker01?~]#?docker?run?-d?-p?80:80?nginx
Unable?to?find?image?'nginx:latest'?locally
latest:?Pulling?from?library/nginx
e7bb522d92ff:?Pull?complete?
6edc05228666:?Pull?complete?
cd866a17e81f:?Pull?complete?
Digest:?sha256:285b49d42c703fdf257d1e2422765c4ba9d3e37768d6ea83d7fe2043dad6e63d
Status:?Downloaded?newer?image?for?nginx:latest
8d8f81da12b5c10af6ba1a5d07f4abc041cb95b01f3d632c3d638922800b0b4d
#?容器啟動(dòng)后,在瀏覽器進(jìn)行訪問測試?參數(shù)說明

Docker鏡像生命周期

?
Docker鏡像相關(guān)操作
搜索官方倉庫鏡像
[root@docker01?~]#??docker?search?centos
NAME??????????????????????DESCRIPTION????????????????????STARS????OFFICIAL???????????????AUTOMATED
centos????????????????????The?official?build?of?CentOS.??3992?????[OK]??????
ansible/centos7-ansible???Ansible?on?Centos7?????????????105??????????????????????????????[OK]列表說明

獲取鏡像
[root@docker01?~]#?docker?pull?centos
Using?default?tag:?latest
latest:?Pulling?from?library/centos
af4b0a2388c6:?Downloading??34.65MB/73.67MB查看當(dāng)前主機(jī)鏡像列表
[root@docker01?~]#?docker?image?list?
REPOSITORY??????????TAG?????????????????IMAGE?ID????????????CREATED?????????????SIZE
centos??????????????latest??????????????ff426288ea90????????3?weeks?ago?????????207MB
nginx???????????????latest??????????????3f8a4339aadd????????5?weeks?ago?????????108MB拉第三方鏡像方法
docker?pull?index.tenxcloud.com/tenxcloud/httpd導(dǎo)出鏡像
[root@docker01?~]#?docker?image?list?
REPOSITORY??????????TAG?????????????????IMAGE?ID????????????CREATED?????????????SIZE
centos??????????????latest??????????????ff426288ea90????????3?weeks?ago?????????207MB
nginx???????????????latest??????????????3f8a4339aadd????????5?weeks?ago?????????108MB
#?導(dǎo)出
[root@docker01?~]#?docker?image?save?centos?>?docker-centos.tar.gz
刪除鏡像
[root@docker01?~]#?docker?image?rm?centos:latest
[root@docker01?~]#?docker?image?list?
REPOSITORY??????????TAG?????????????????IMAGE?ID????????????CREATED?????????????SIZE
nginx???????????????latest??????????????3f8a4339aadd????????5?weeks?ago?????????108MB
導(dǎo)入鏡像
[root@docker01?~]#?docker?image?load?-i?docker-centos.tar.gz??
e15afa4858b6:?Loading?layer??215.8MB/215.8MB
Loaded?image:?centos:latest
[root@docker01?~]#?docker?image?list?
REPOSITORY??????????TAG?????????????????IMAGE?ID????????????CREATED?????????????SIZE
centos??????????????latest??????????????ff426288ea90????????3?weeks?ago?????????207MB
nginx???????????????latest??????????????3f8a4339aadd????????5?weeks?ago?????????108MB
查看鏡像的詳細(xì)信息
[root@docker01?~]#?docker?image?inspect?centos
容器的日常管理
容器的起/停
[root@docker01?~]#?docker?run?nginx
創(chuàng)建容器,兩步走(不常用)
[root@docker01?~]#?docker?create?centos:latest??/bin/bash
bb7f32368ecf0492adb59e20032ab2e6cf6a563a0e6751e58930ee5f7aaef204
[root@docker01?~]#?docker?start?stupefied_nobel
stupefied_nobel
快速啟動(dòng)容器方法
[root@docker01?~]#?docker?run??centos:latest??/usr/bin/sleep?20;
[root@docker01?~]#?docker?container?ls
????或
[root@docker01?~]#?docker?ps?
CONTAINER?ID????????IMAGE???????????????COMMAND??????????????????CREATED?????????????STATUS??????????????PORTS???????????????NAMES
8708e93fd767????????nginx???????????????"nginx?-g?'daemon?of…"???6?seconds?ago???????Up?4?seconds????????80/tcp??????????????keen_lewin
查看你容器詳細(xì)信息/ip
[root@docker01?~]#?docker?container??inspect??容器名稱/id
查看你所有容器(包括未運(yùn)行的)
[root@docker01?~]#?docker?ps?-a
CONTAINER?ID????????IMAGE???????????????COMMAND??????????????????CREATED?????????????STATUS??????????????????????PORTS???????????????NAMES
8708e93fd767????????nginx???????????????"nginx?-g?'daemon?of…"???4?minutes?ago???????Exited?(0)?59?seconds?ago???????????????????????keen_lewin
f9f3e6af7508????????nginx???????????????"nginx?-g?'daemon?of…"???5?minutes?ago???????Exited?(0)?5?minutes?ago????????????????????????optimistic_haibt
8d8f81da12b5????????nginx???????????????"nginx?-g?'daemon?of…"???3?hours?ago?????????Exited?(0)?3?hours?ago??????????????????????????lucid_bohr
停止容器
[root@docker01?~]#?docker?stop?容器名稱/id?
或
[root@docker01?~]#?docker?container??kill??容器名稱/id進(jìn)入容器方法
[root@docker01?~]# docker run -it #參數(shù):-it 可交互終端
[root@docker01?~]#?docker?run?-it?nginx:latest??/bin/bash
root@79241093859e:/#
ctrl+p?&?ctrl+q啟動(dòng)后進(jìn)入容器的方法
[root@docker01?~]#?docker?run?-it?centos:latest?
[root@1bf0f43c4d2f?/]#?ps?-ef?
UID?????????PID???PPID??C?STIME?TTY??????????TIME?CMD
root??????????1??????0??0?15:47?pts/0????00:00:00?/bin/bash
root?????????13??????1??0?15:47?pts/0????00:00:00?ps?-ef
attach進(jìn)入容器,使用pts/0?,會(huì)讓所用通過此方法進(jìn)如放入用戶看到同樣的操作。
[root@docker01?~]#?docker?attach?1bf0f43c4d2f
[root@1bf0f43c4d2f?/]#?ps?-ef?
UID?????????PID???PPID??C?STIME?TTY??????????TIME?CMD
root??????????1??????0??0?15:47?pts/0????00:00:00?/bin/bash
root?????????14??????1??0?15:49?pts/0????00:00:00?ps?-ef自命名啟動(dòng)一個(gè)容器?--name
[root@docker01?~]#?docker?attach?1bf0f43c4d2f
[root@1bf0f43c4d2f?/]#?ps?-ef?
UID?????????PID???PPID??C?STIME?TTY??????????TIME?CMD
root??????????1??????0??0?15:47?pts/0????00:00:00?/bin/bash
root?????????14??????1??0?15:49?pts/0????00:00:00?ps?-ef
exec?進(jìn)入容器方法(推薦使用)
[root@docker01?~]#?docker?exec?-it?clsn1??/bin/bash?
[root@b20fa75b4b40?/]#?重新分配一個(gè)終端
[root@b20fa75b4b40?/]#?ps?-ef?
UID?????????PID???PPID??C?STIME?TTY??????????TIME?CMD
root??????????1??????0??0?16:11?pts/0????00:00:00?/bin/bash
root?????????13??????0??0?16:14?pts/1????00:00:00?/bin/bash
root?????????26?????13??0?16:14?pts/1????00:00:00?ps?-ef刪除所有容器
[root@docker01?~]#?docker?rm?-f??`docker?ps?-a?-q`
#?-f?強(qiáng)制刪除
啟動(dòng)時(shí)進(jìn)行端口映射
[root@docker01?~]#?docker?run?-d?-p?8888:80??nginx:latest?
287bec5c60263166c03e1fc5b0b8262fe76507be3dfae4ce5cd2ee2d1e8a89a9

docker?run?-P?(大P)#?需要鏡像支持
