3W字,Docker 從入門到精通
docker不是一個(gè)值得投入的領(lǐng)域,它解決的問題是Unix系統(tǒng)最初設(shè)計(jì)的一個(gè)疏忽。從一個(gè)不會(huì)用docker的小白,自己一步一步的摸索,中間也踩過許多坑。但仍然,堅(jiān)持從哪里跌倒就從哪里爬起來。不求感動(dòng)自己,但求人生無悔。
1 容器簡(jiǎn)介
1.1 什么是 Linux 容器
1.2 容器不就是虛擬化嗎
1.3 容器發(fā)展簡(jiǎn)2 什么是 Docker?
2.1 Docker 如何工作?
2.2 Docker 技術(shù)是否與傳統(tǒng)的 Linux 容器相同?
2.3 docker的目標(biāo)
3 安裝Docker3.1 Docker基礎(chǔ)命令操作
3.2 啟動(dòng)第一個(gè)容器
3.3 Docker鏡像生命周期4 docker鏡像相關(guān)操作
4.1 搜索官方倉(cāng)庫(kù)鏡像
4.2 獲取鏡像
4.3 導(dǎo)出鏡像
4.4 刪除鏡像
4.5 導(dǎo)入鏡像
4.6 查看鏡像的詳細(xì)信息5 容器的日常管理5.1 容器的起/停
5.2 進(jìn)入容器方法
5.3 刪除所有容器
5.4 啟動(dòng)時(shí)進(jìn)行端口映射6 Docker 數(shù)據(jù)卷的管理
6.1 掛載時(shí)創(chuàng)建卷
6.2 創(chuàng)建卷后掛載
6.3 手動(dòng)將容器保存為鏡像7 Dockerfile自動(dòng)構(gòu)建docker鏡像
7.1 Dockerfile指令集
7.2 創(chuàng)建一個(gè)Dockerfile
7.3 使用Dcokerfile安裝kodexplorer8 Docker中的鏡像分層
8.1 Docker 鏡像為什么分層
8.2 可寫的容器層
8.3 容器層的細(xì)節(jié)說明9 使用docker運(yùn)行zabbix-server
9.1 容器間的互聯(lián)
9.2 啟動(dòng)zabbix容器
9.3 關(guān)于zabbix API10 docker 倉(cāng)庫(kù)(registry)
10.1 創(chuàng)建一個(gè)普通倉(cāng)庫(kù)
10.2 帶basic認(rèn)證的倉(cāng)庫(kù)11 docker-compose編排工具
11.1 安裝docker-compose
11.2 編排啟動(dòng)鏡像
11.3 haproxy代理后端docker容器
11.4 安裝socat 直接操作socket控制haproxy12 重啟docker服務(wù),容器全部退出的解決辦法
12.1 在啟動(dòng)是指定自動(dòng)重啟
12.2 修改docker默認(rèn)配置文件13 Docker網(wǎng)絡(luò)類型
13.1 docker的網(wǎng)絡(luò)類型
13.2 不為容器配置網(wǎng)絡(luò)功能
13.3 與其他容器共享網(wǎng)絡(luò)配置(Container)
13.4 使用宿主機(jī)網(wǎng)絡(luò)
13.5 查看網(wǎng)絡(luò)列表
13.6 用PIPEWORK為docker容器配置獨(dú)立IP
13.7 Docker跨主機(jī)通信之macvlan14 docker企業(yè)級(jí)鏡像倉(cāng)庫(kù)harbor
14.1 使用容器的建議
14.2 關(guān)于Docker容器的監(jiān)控15 參考文獻(xiàn)
1 容器簡(jiǎn)介
1.1 什么是 Linux 容器
Linux容器是與系統(tǒng)其他部分隔離開的一系列進(jìn)程,從另一個(gè)鏡像運(yùn)行,并由該鏡像提供支持進(jìn)程所需的全部文件。容器提供的鏡像包含了應(yīng)用的所有依賴項(xiàng),因而在從開發(fā)到測(cè)試再到生產(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)化的測(cè)試和生產(chǎn)環(huán)境,且具有自身的配置和一系列支持文件。您希望盡可能多在本地模擬這些環(huán)境,而不產(chǎn)生重新創(chuàng)建服務(wù)器環(huán)境的開銷。 因此,您要如何確保應(yīng)用能夠在這些環(huán)境中運(yùn)行和通過質(zhì)量檢測(cè),并且在部署過程中不出現(xiàn)令人頭疼的問題,也無需重新編寫代碼和進(jìn)行故障修復(fù)?答案就是使用容器。容器可以確保您的應(yīng)用擁有必需的配置和文件,使得這些應(yīng)用能夠在從開發(fā)到測(cè)試、再到生產(chǎn)的整個(gè)流程中順利運(yùn)行,而不出現(xiàn)任何不良問題。這樣可以避免危機(jī),做到皆大歡喜。
雖然這只是簡(jiǎn)化的示例,但在需要很高的可移植性、可配置性和隔離的情況下,我們可以利用 Linux 容器通過很多方式解決難題。無論基礎(chǔ)架構(gòu)是在企業(yè)內(nèi)部還是在云端,或者混合使用兩者,容器都能滿足您的需求。
1.2 容器不就是虛擬化嗎
是,但也不竟然。我們用一種簡(jiǎn)單方式來思考一下:
虛擬化使得許多操作系統(tǒng)可同時(shí)在單個(gè)系統(tǒng)上運(yùn)行。
容器則可共享同一個(gè)操作系統(tǒng)內(nèi)核,將應(yīng)用進(jìn)程與系統(tǒng)其他部分隔離開。

這意味著什么?首先,讓多個(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)行。
1.3 容器發(fā)展簡(jiǎn)史

我們現(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)在的模樣。
2 什么是 Docker?
“Docker” 一詞指代多種事物,包括開源社區(qū)項(xiàng)目、開源項(xiàng)目使用的工具、主導(dǎo)支持此類項(xiàng)目的公司 Docker Inc. 以及該公司官方支持的工具。技術(shù)產(chǎn)品和公司使用同一名稱,的確讓人有點(diǎn)困惑。
我們來簡(jiǎ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)境。
2.1 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ā)能力。另外,歡迎關(guān)注公眾號(hào)開源Linux,后臺(tái)回復(fù)“學(xué)習(xí)”,有我為您特別篩選的學(xué)習(xí)資料!
2.2 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)功能,包括簡(jiǎn)化用于構(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)勢(shì)。
2.3 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)行:?jiǎn)?dòng)一個(gè)容器
每一個(gè)容器,他都有自己的文件系統(tǒng)rootfs.
3 安裝Docker
環(huán)境說明
#?需要兩臺(tái)節(jié)點(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?-I10.0.0.100172.16.1.100
[root@docker02?~]#?hostname?-I10.0.0.101172.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測(cè)試
[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
···
3.1 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?2720:10:142017
?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?2720:12:462017
??OS/Arch:????linux/amd64
??Experimental:????false
配置docker鏡像加速
vi?/etc/docker/daemon.json
{?"registry-mirrors":?["https://registry.docker-cn.com"]
}
3.2 啟動(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)行訪問測(cè)試
參數(shù)說明
| 參數(shù) | 說明 |
|---|---|
| run | 創(chuàng)建并運(yùn)行一個(gè)容器 |
| -d | 放入后臺(tái) |
| -p | 端口映射 |
| nginx | 鏡像名稱 |
3.3 Docker鏡像生命周期

4 docker鏡像相關(guān)操作
4.1 搜索官方倉(cāng)庫(kù)鏡像
[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
列表說明
| 參數(shù) | 說明 |
|---|---|
| NAME | 鏡像名稱 |
| DESCRIPTION | 鏡像說明 |
| STARS | 點(diǎn)贊數(shù)量 |
| OFFICIAL | 是否是官方的 |
| AUTOMATED | 是否是自動(dòng)構(gòu)建的 |
4.2 獲取鏡像
根據(jù)鏡像名稱拉取鏡像
[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
4.3 導(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
4.4 刪除鏡像
[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
4.5 導(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
4.6 查看鏡像的詳細(xì)信息
[root@docker01?~]#?docker?image?inspect?centos
5 容器的日常管理
5.1 容器的起/停
最簡(jiǎn)單的運(yùn)行一個(gè)容器
[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;
容器內(nèi)的第一個(gè)進(jìn)程必須一直處于運(yùn)行的狀態(tài),否則這個(gè)容器,就會(huì)處于退出狀態(tài)!
查看正在運(yùn)行的容器
[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…"4minutes?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
5.2 進(jìn)入容器方法
啟動(dòng)時(shí)進(jìn)去方法
[root@docker01 ~]# docker run -it #參數(shù):-it 可交互終端
[root@docker01?~]#?docker?run?-it?nginx:latest??/bin/bash
root@79241093859e:/#
退出/離開容器
1?|?ctrl+p?&?ctrl+q
啟動(dòng)后進(jìn)入容器的方法
啟動(dòng)一個(gè)docker
[root@docker01?~]#?docker?run?-it?centos:latest?
[root@1bf0f43c4d2f?/]#?ps?-ef?
UID?????????PID???PPID??C?STIME?TTY??????????TIME?CMD
root??????????10015:47?pts/000:00:00?/bin/bash
root?????????131015:47?pts/000: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??????????10015:47?pts/000:00:00?/bin/bash
root?????????141015:49?pts/000: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??????????10015:47?pts/000:00:00?/bin/bash
root?????????141015:49?pts/000:00:00?ps?-ef
exrc 進(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??????????10016:11?pts/000:00:00?/bin/bash
root?????????130016:14?pts/100:00:00?/bin/bash
root?????????2613016:14?pts/100:00:00?ps?-ef
5.3 刪除所有容器
[root@docker01?~]#?docker?rm?-f??`docker?ps?-a?-q`
#?-f?強(qiáng)制刪除
5.4 啟動(dòng)時(shí)進(jìn)行端口映射
-p參數(shù)端口映射
[root@docker01?~]#?docker?run?-d?-p?8888:80??nginx:latest?
287bec5c60263166c03e1fc5b0b8262fe76507be3dfae4ce5cd2ee2d1e8a89a9
不同指定映射方法
| 參數(shù) | 說明 |
|---|---|
| -p hostPort:containerPort | 端口映射 -p 8080:80 |
| -p ip:hostPort:containerPort | 配置監(jiān)聽地址 -p 10.0.0.100:8080:80 |
| -p ip::containerPort | 隨機(jī)分配端口 -p 10.0.0.100::80 |
| -p hostPort:containerPort:udp | 指定協(xié)議 -p 8080:80:tcp |
| -p 81:80 –p 443:443 | 指定多個(gè) |
隨機(jī)映射
docker?run?-P?(大P)#?需要鏡像支持
6 Docker 數(shù)據(jù)卷的管理
6.1 掛載時(shí)創(chuàng)建卷
掛載卷
[root@docker01?~]#?docker?run?-d?-p?80:80?-v?/data:/usr/share/nginx/html?nginx:latest
079786c1e297b5c5031e7a841160c74e91d4ad06516505043c60dbb78a259d09
容器內(nèi)站點(diǎn)目錄: /usr/share/nginx/html
在宿主機(jī)寫入數(shù)據(jù),查看
[root@docker01?~]#?echo?"http://www.nmtui.com"?>/data/index.html
[root@docker01?~]#?curl?10.0.0.100
http://www.nmtui.com
設(shè)置共享卷,使用同一個(gè)卷啟動(dòng)一個(gè)新的容器
[root@docker01?~]#?docker?run?-d?-p?8080:80?-v?/data:/usr/share/nginx/html?nginx:latest?
351f0bd78d273604bd0971b186979aa0f3cbf45247274493d2490527babb4e42
[root@docker01?~]#?curl?10.0.0.100:8080
http://www.nmtui.com
查看卷列表
[root@docker01?~]#?docker?volume?ls
DRIVER??????????????VOLUME?NAME
6.2 創(chuàng)建卷后掛載
創(chuàng)建一個(gè)卷
[root@docker01?~]#?docker?volume?create?
f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
[root@docker01?~]#?docker?volume?ls?
DRIVER??????????????VOLUME?NAME
local???????????????f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
指定卷名
[root@docker01?~]#?docker?volume?ls?
DRIVER??????????????VOLUME?NAME
local???????????????clsn
local???????????????f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
查看卷路徑
[root@docker01?~]#?docker?volume?inspect?clsn?
[
????{
????????"CreatedAt":?"2018-02-01T00:39:25+08:00",
????????"Driver":?"local",
????????"Labels":?{},
????????"Mountpoint":?"/var/lib/docker/volumes/clsn/_data",
????????"Name":?"clsn",
????????"Options":?{},
????????"Scope":?"local"
????}
]
使用卷創(chuàng)建
[root@docker01?~]#?docker?run?-d?-p?9000:80?-v?clsn:/usr/share/nginx/html?nginx:latest?
1434559cff996162da7ce71820ed8f5937fb7c02113bbc84e965845c219d3503
#?宿主機(jī)測(cè)試
[root@docker01?~]#?echo?'blog.nmtui.com'?>/var/lib/docker/volumes/clsn/_data/index.html?
[root@docker01?~]#?curl?10.0.0.100:9000
blog.nmtui.com
設(shè)置卷
[root@docker01?~]#?docker?run??-d??-P??--volumes-from?079786c1e297?nginx:latest?
b54b9c9930b417ab3257c6e4a8280b54fae57043c0b76b9dc60b4788e92369fb
查看使用的端口
[root@docker01?~]#?netstat?-lntup?
Active?Internet?connections?(only?servers)
Proto?Recv-Q?Send-Q?Local?Address???????????Foreign?Address?????????State???????PID/Program?name????
tcp????????0??????0?0.0.0.0:22??????????????0.0.0.0:*???????????????LISTEN??????1400/sshd???????????
tcp????????0??????0?10.0.0.100:2375?????????0.0.0.0:*???????????????LISTEN??????26218/dockerd???????
tcp6???????0??????0?:::9000?????????????????:::*????????????????????LISTEN??????32015/docker-proxy??
tcp6???????0??????0?:::8080?????????????????:::*????????????????????LISTEN??????31853/docker-proxy??
tcp6???????0??????0?:::80???????????????????:::*????????????????????LISTEN??????31752/docker-proxy??
tcp6???????0??????0?:::22???????????????????:::*????????????????????LISTEN??????1400/sshd???????????
tcp6???????0??????0?:::32769????????????????:::*????????????????????LISTEN??????32300/docker-proxy??
[root@docker01?~]#?curl?10.0.0.100:32769
http://www.nmtui.com
6.3 手動(dòng)將容器保存為鏡像
本次是基于docker官方centos 6.8 鏡像創(chuàng)建
官方鏡像列表:https://hub.docker.com/explore/
啟動(dòng)一個(gè)centos6.8的鏡像
[root@docker01?~]#?docker?pull??centos:6.8
[root@docker01?~]#?docker?run?-it?-p?1022:22?centos:6.8??/bin/bash
#?在容器中安裝sshd服務(wù),并修改系統(tǒng)密碼
[root@582051b2b92b?~]#?yum?install??openssh-server?-y?
[root@582051b2b92b?~]#?echo?"root:123456"?|chpasswd
[root@582051b2b92b?~]#??/etc/init.d/sshd?start
啟動(dòng)完成后鏡像ssh連接測(cè)試
將容器提交為鏡像
[root@docker01?~]#?docker?commit?brave_mcclintock??centos6-ssh
使用新的鏡像啟動(dòng)容器
[root@docker01?~]#?docker?run?-d??-p?1122:22??centos6-ssh:latest??/usr/sbin/sshd?-D?
5b8161fda2a9f2c39c196c67e2eb9274977e7723fe51c4f08a0190217ae93094
在容器安裝httpd服務(wù)
[root@5b8161fda2a9?/]#??yum?install?httpd?-y
編寫啟動(dòng)腳本腳本
[root@5b8161fda2a9?/]#?cat??init.sh?
#!/bin/bash?
/etc/init.d/httpd?start?
/usr/sbin/sshd?-D
[root@5b8161fda2a9?/]#?chmod?+x?init.sh?
#?注意執(zhí)行權(quán)限
注意執(zhí)行權(quán)限
再次提交為新的鏡像
[root@docker01?~]#?docker?commit??5b8161fda2a9?centos6-httpd?
sha256:705d67a786cac040800b8485cf046fd57b1828b805c515377fc3e9cea3a481c1
啟動(dòng)鏡像,做好端口映射。并在瀏覽器中測(cè)試訪問
[root@docker01?~]#?docker?run?-d?-p?1222:22?-p?80:80??centos6-httpd?/init.sh?
46fa6a06644e31701dc019fb3a8c3b6ef008d4c2c10d46662a97664f838d8c2c
7 Dockerfile自動(dòng)構(gòu)建docker鏡像
官方構(gòu)建dockerffile文件參考:
https://github.com/CentOS/CentOS-Dockerfiles
7.1 Dockerfile指令集
dockerfile主要組成部分:
?基礎(chǔ)鏡像信息?FROM?centos:6.8
?制作鏡像操作指令RUN?yum?insatll?openssh-server?\-y
?容器啟動(dòng)時(shí)執(zhí)行指令?CMD?\["/bin/bash"\]
dockerfile常用指令:
?FROM 這個(gè)鏡像的媽媽是誰?(指定基礎(chǔ)鏡像)
?MAINTAINER 告訴別人,誰負(fù)責(zé)養(yǎng)它?(指定維護(hù)者信息,可以沒有)
?RUN?你想讓它干啥(在命令前面加上RUN即可)
?ADD?給它點(diǎn)創(chuàng)業(yè)資金(COPY文件,會(huì)自動(dòng)解壓)
?WORKDIR?我是cd,今天剛化了妝(設(shè)置當(dāng)前工作目錄)
?VOLUME?給它一個(gè)存放行李的地方(設(shè)置卷,掛載主機(jī)目錄)
?EXPOSE?它要打開的門是啥(指定對(duì)外的端口)
?CMD 奔跑吧,兄弟!(指定容器啟動(dòng)后的要干的事情)
dockerfile其他指令:
COPY?復(fù)制文件
ENV??環(huán)境變量
ENTRYPOINT??容器啟動(dòng)后執(zhí)行的命令
7.2 創(chuàng)建一個(gè)Dockerfile
創(chuàng)建第一個(gè)Dockerfile文件
#?創(chuàng)建目錄
[root@docker01?base]#?cd?/opt/base
#?創(chuàng)建Dcokerfile文件,注意大小寫
[root@docker01?base]#?vim?Dockerfile
FROM?centos:6.8
RUN?yum?install?openssh-server?-y?
RUN?echo?"root:123456"?|chpasswd
RUN?/etc/init.d/sshd?start?
CMD?["/usr/sbin/sshd","-D"]
構(gòu)建docker鏡像
[root@docker01?base]#?docker?image?build??-t?centos6.8-ssh?.?
-t?為鏡像標(biāo)簽打標(biāo)簽??.?表示當(dāng)前路徑
使用自構(gòu)建的鏡像啟動(dòng)
[root@docker01?base]#?docker?run??-d?-p?2022:22?centos6.8-ssh-b?
dc3027d3c15dac881e8e2aeff80724216f3ac725f142daa66484f7cb5d074e7a
7.3 使用Dcokerfile安裝kodexplorer
Dockerfile文件內(nèi)容
FROM?centos:6.8
RUN?yum?install?wget?unzip?php?php-gd?php-mbstring?-y?&&?yum?clean?all
#?設(shè)置工作目錄,之后的操作都在這個(gè)目錄中
WORKDIR?/var/www/html/
RUN?wget?-c?http://static.kodcloud.com/update/download/kodexplorer4.25.zip
RUN?unzip?kodexplorer4.25.zip?&&?rm?-f?kodexplorer4.25.zip
RUN?chown?-R?apache.apache?.
CMD?["/usr/sbin/apachectl","-D","FOREGROUND"]
更多的Dockerfile可以參考官方方法。
8 Docker中的鏡像分層
參考文檔:
http://www.maiziedu.com/wiki/cloud/dockerimage
Docker 支持通過擴(kuò)展現(xiàn)有鏡像,創(chuàng)建新的鏡像。實(shí)際上,Docker Hub 中 99% 的鏡像都是通過在 base 鏡像中安裝和配置需要的軟件構(gòu)建出來的。

從上圖可以看到,新鏡像是從 base 鏡像一層一層疊加生成的。每安裝一個(gè)軟件,就在現(xiàn)有鏡像的基礎(chǔ)上增加一層。
8.1 Docker 鏡像為什么分層
鏡像分層最大的一個(gè)好處就是共享資源。
比如說有多個(gè)鏡像都從相同的 base 鏡像構(gòu)建而來,那么 Docker Host 只需在磁盤上保存一份 base 鏡像;同時(shí)內(nèi)存中也只需加載一份 base 鏡像,就可以為所有容器服務(wù)了。而且鏡像的每一層都可以被共享。
如果多個(gè)容器共享一份基礎(chǔ)鏡像,當(dāng)某個(gè)容器修改了基礎(chǔ)鏡像的內(nèi)容,比如 /etc 下的文件,這時(shí)其他容器的 /etc 是不會(huì)被修改的,修改只會(huì)被限制在單個(gè)容器內(nèi)。這就是容器 Copy-on-Write 特性。
8.2 可寫的容器層
當(dāng)容器啟動(dòng)時(shí),一個(gè)新的可寫層被加載到鏡像的頂部。這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”。

所有對(duì)容器的改動(dòng) - 無論添加、刪除、還是修改文件都只會(huì)發(fā)生在容器層中。只有容器層是可寫的,容器層下面的所有鏡像層都是只讀的。
8.3 容器層的細(xì)節(jié)說明
鏡像層數(shù)量可能會(huì)很多,所有鏡像層會(huì)聯(lián)合在一起組成一個(gè)統(tǒng)一的文件系統(tǒng)。如果不同層中有一個(gè)相同路徑的文件,比如 /a,上層的 /a 會(huì)覆蓋下層的 /a,也就是說用戶只能訪問到上層中的文件 /a。在容器層中,用戶看到的是一個(gè)疊加之后的文件系統(tǒng)。
文件操作說明
| 文件操作 | 說明 |
|---|---|
| 添加文件 | 在容器中創(chuàng)建文件時(shí),新文件被添加到容器層中。 |
| 讀取文件 | 在容器中讀取某個(gè)文件時(shí),Docker 會(huì)從上往下依次在各鏡像層中查找此文件。一旦找到,立即將其復(fù)制到容器層,然后打開并讀入內(nèi)存。 |
| 修改文件 | 在容器中修改已存在的文件時(shí),Docker 會(huì)從上往下依次在各鏡像層中查找此文件。一旦找到,立即將其復(fù)制到容器層,然后修改之。 |
| 刪除文件 | 在容器中刪除文件時(shí),Docker 也是從上往下依次在鏡像層中查找此文件。找到后,會(huì)在容器層中記錄下此刪除操作。(只是記錄刪除操作) |
只有當(dāng)需要修改時(shí)才復(fù)制一份數(shù)據(jù),這種特性被稱作 Copy-on-Write。可見,容器層保存的是鏡像變化的部分,不會(huì)對(duì)鏡像本身進(jìn)行任何修改。
這樣就解釋了我們前面提出的問題:容器層記錄對(duì)鏡像的修改,所有鏡像層都是只讀的,不會(huì)被容器修改,所以鏡像可以被多個(gè)容器共享。
9 使用docker運(yùn)行zabbix-server
9.1 容器間的互聯(lián)
在運(yùn)行zabbix之前務(wù)必要了解容器間互聯(lián)的方法。
#?創(chuàng)建一個(gè)nginx容器
docker?run?-d?-p?80:80?nginx
#?創(chuàng)建容器,做link,并進(jìn)入容器中
docker?run?-it?--link?quirky_brown:web01?centos-ssh?/bin/bash
#?在容器中訪問nginx容器可以ping通
ping?web01
命令執(zhí)行過程
#?啟動(dòng)apache容器
[root@docker01?~]#?docker?run?-d?httpd:2.4??
3f1f7fc554720424327286bd2b04aeab1b084a3fb011a785b0deab6a34e56955
^[[A[root@docker01?docker?ps?-a
CONTAINER?ID????????IMAGE???????????????COMMAND??????????????CREATED?????????????STATUS??????????????PORTS???????????????NAMES
3f1f7fc55472????????httpd:2.4"httpd-foreground"6?seconds?ago???????Up?5?seconds????????80/tcp??????????????determined_clarke
#?拉取一個(gè)busybox?鏡像
[root@docker01?~]#?docker?pull?busybox?
#?啟動(dòng)容器
[root@docker01?~]#?docker?run?-it??--link?determined_clarke:web?busybox:latest???/bin/sh?
/?#?
#?使用新的容器訪問最初的web容器
/?#?ping?web?
PING?web?(172.17.0.2):?56?data?bytes
64?bytes?from?172.17.0.2:?seq=0?ttl=64?time=0.058?ms
^C
---?web?ping?statistics?---
1?packets?transmitted,?1?packets?received,?0%?packet?loss
round-trip?min/avg/max?=?0.058/0.058/0.058?ms
9.2 啟動(dòng)zabbix容器
1、啟動(dòng)一個(gè)mysql的容器
docker?run?--name?mysql-server?-t?\
??????-e?MYSQL_DATABASE="zabbix"?\
??????-e?MYSQL_USER="zabbix"?\
??????-e?MYSQL_PASSWORD="zabbix_pwd"?\
??????-e?MYSQL_ROOT_PASSWORD="root_pwd"?\
??????-d?mysql:5.7?\
??????--character-set-server=utf8?--collation-server=utf8_bin
2、啟動(dòng)java-gateway容器監(jiān)控java服務(wù)
docker?run?--name?zabbix-java-gateway?-t?\
??????-d?zabbix/zabbix-java-gateway:latest
3、啟動(dòng)zabbix-mysql容器使用link連接mysql與java-gateway。
docker?run?--name?zabbix-server-mysql?-t?\
??????-e?DB_SERVER_HOST="mysql-server"?\
??????-e?MYSQL_DATABASE="zabbix"?\
??????-e?MYSQL_USER="zabbix"?\
??????-e?MYSQL_PASSWORD="zabbix_pwd"?\
??????-e?MYSQL_ROOT_PASSWORD="root_pwd"?\
??????-e?ZBX_JAVAGATEWAY="zabbix-java-gateway"?\
??????--link?mysql-server:mysql?\
??????--link?zabbix-java-gateway:zabbix-java-gateway?\
??????-p?10051:10051?\
??????-d?zabbix/zabbix-server-mysql:latest
4、啟動(dòng)zabbix web顯示,使用link連接zabbix-mysql與mysql。
docker?run?--name?zabbix-web-nginx-mysql?-t?\
??????-e?DB_SERVER_HOST="mysql-server"?\
??????-e?MYSQL_DATABASE="zabbix"?\
??????-e?MYSQL_USER="zabbix"?\
??????-e?MYSQL_PASSWORD="zabbix_pwd"?\
??????-e?MYSQL_ROOT_PASSWORD="root_pwd"?\
??????--link?mysql-server:mysql?\
??????--link?zabbix-server-mysql:zabbix-server?\
??????-p?80:80?\
??????-d?zabbix/zabbix-web-nginx-mysql:latest
9.3 關(guān)于zabbix API
關(guān)于zabbix API可以參考官方文檔:
https://www.zabbix.com/documentation/3.4/zh/manual/api
獲取token方法
#?獲取token
[root@docker02?~]#?curl?-s?-X?POST?-H?'Content-Type:application/json'?-d?'
{
"jsonrpc":?"2.0",
"method":?"user.login",
"params":?{
"user":?"Admin",
"password":?"zabbix"
},
"id":?1
}'?http://10.0.0.100/api_jsonrpc.php
{"jsonrpc":"2.0","result":"d3be707f9e866ec5d0d1c242292cbebd","id":1}
10 docker 倉(cāng)庫(kù)(registry)
10.1 創(chuàng)建一個(gè)普通倉(cāng)庫(kù)
1、創(chuàng)建倉(cāng)庫(kù)
docker?run?-d?-p?5000:5000?--restart=always?--name?registry?-v?/opt/myregistry:/var/lib/registry??registry
2、修改配置文件,使之支持http
[root@docker01?~]#?cat??/etc/docker/daemon.json?
{
??"registry-mirrors":?["https://registry.docker-cn.com"],
??"insecure-registries":?["10.0.0.100:5000"]
}
重啟docker讓修改生效
[root@docker01?~]#?systemctl?restart??docker.service
3、修改鏡像標(biāo)簽
[root@docker01?~]#?docker?tag??busybox:latest??10.0.0.100:5000/clsn/busybox:1.0
[root@docker01?~]#?docker?images
REPOSITORY??????????????????????TAG?????????????????IMAGE?ID????????????CREATED?????????????SIZE
centos6-ssh?????????????????????latest??????????????3c2b1e57a0f5????????18?hours?ago????????393MB
httpd???????????????????????????2.42e202f453940????????6?days?ago??????????179MB
10.0.0.100:5000/clsn/busybox????1.05b0d59026729????????8?days?ago??????????1.15MB
4、將新打標(biāo)簽的鏡像上傳鏡像到倉(cāng)庫(kù)
[root@docker01?~]#?docker?push???10.0.0.100:5000/clsn/busybox
10.2 帶basic認(rèn)證的倉(cāng)庫(kù)
1、安裝加密工具
[root@docker01?clsn]#?yum?install?httpd-tools??-y
2、設(shè)置認(rèn)證密碼
mkdir?/opt/registry-var/auth/?-p
htpasswd?\-Bbn?clsn?123456??>?/opt/registry-var/auth/htpasswd
3、啟動(dòng)容器,在啟動(dòng)時(shí)傳入認(rèn)證參數(shù)
docker?run?-d?-p?5000:5000?-v?/opt/registry-var/auth/:/auth/?-e?"REGISTRY_AUTH=htpasswd"?-e?"REGISTRY_AUTH_HTPASSWD_REALM=Registry?Realm"?-e?REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd?registry
4、使用驗(yàn)證用戶測(cè)試
#?登陸用戶
[root@docker01?~]#?docker?login?10.0.0.100:5000?
Username:?clsn??
Password:?123456
Login?Succeeded
#?推送鏡像到倉(cāng)庫(kù)
[root@docker01?~]#?docker?push?10.0.0.100:5000/clsn/busybox?
The?push?refers?to?repository?[10.0.0.100:5000/clsn/busybox]
4febd3792a1f:?Pushed?
1.0:?digest:?sha256:4cee1979ba0bf7db9fc5d28fb7b798ca69ae95a47c5fecf46327720df4ff352d?size:?527
#認(rèn)證文件的保存位置
[root@docker01?~]#?cat?.docker/config.json?
{
????"auths":?{
????????"10.0.0.100:5000":?{
????????????"auth":?"Y2xzbjoxMjM0NTY="
????????},
????????"https://index.docker.io/v1/":?{
????????????"auth":?"Y2xzbjpIenNAMTk5Ng=="
????????}
????},
????"HttpHeaders":?{
????????"User-Agent":?"Docker-Client/17.12.0-ce?(linux)"
????}
}
至此,一個(gè)簡(jiǎn)單的docker鏡像倉(cāng)庫(kù)搭建完成
11 docker-compose編排工具
11.1 安裝docker-compose
安裝docker-compose
#?下載pip軟件
yum?install?-y?python2-pip
#?下載?docker-compose
pip?install?docker-compose
國(guó)內(nèi)開啟pip 下載加速:http://mirrors.aliyun.com/help/pypi
mkdir?~/.pip/
cat?>?~/.pip/pip.conf?<<'EOF'
[global]
index-url?=?https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
EOF
11.2 編排啟動(dòng)鏡像
1、創(chuàng)建文件目錄
[root@docker01?~]#?mkdir?/opt/my_wordpress/
[root@docker01?~]#?cd?/opt/my_wordpress/
2、編寫編排文件
[root@docker01?my_wordpress]#?vim?docker-compose.yml
version:?'3'
services:
???db:
?????image:?mysql:5.7
?????volumes:
???????-?/data/db_data:/var/lib/mysql
?????restart:?always
?????environment:
???????MYSQL_ROOT_PASSWORD:?somewordpress
???????MYSQL_DATABASE:?wordpress
???????MYSQL_USER:?wordpress
???????MYSQL_PASSWORD:?wordpress
???wordpress:
?????depends_on:
???????-?db
?????image:?wordpress:latest
?????volumes:
???????-?/data/web_data:/var/www/html
?????ports:?
???????-?"8000:80"
?????restart:?always
?????environment:
???????WORDPRESS_DB_HOST:?db:3306
???????WORDPRESS_DB_USER:?wordpress
???????WORDPRESS_DB_PASSWORD:?wordpress
3、啟動(dòng)
[root@docker01?my_wordpress]#?docker-compose?up
??#啟動(dòng)方法:docker-compose up
??#后臺(tái)啟動(dòng)方法:docker-compose up -d
4、瀏覽器上訪問http://10.0.0.100:8000
進(jìn)行wordpress的安裝即可
11.3 haproxy代理后端docker容器
1、修改編排腳本
[root@docker01?my_wordpress]#?cat?docker-compose.yml?
version:?'3'
services:
???db:
?????image:?mysql:5.7
?????volumes:
???????-?/data/db_data:/var/lib/mysql
?????restart:?always
?????environment:
???????MYSQL_ROOT_PASSWORD:?somewordpress
???????MYSQL_DATABASE:?wordpress
???????MYSQL_USER:?wordpress
???????MYSQL_PASSWORD:?wordpress
???wordpress:
?????depends_on:
???????-?db
?????image:?wordpress:latest
?????volumes:
???????-?/data/web_data:/var/www/html
?????ports:?
???????-?"80"
?????restart:?always
?????environment:
???????WORDPRESS_DB_HOST:?db:3306
???????WORDPRESS_DB_USER:?wordpress
???????WORDPRESS_DB_PASSWORD:?wordpress
2、同時(shí)啟動(dòng)兩臺(tái)wordpress
[root@docker01?my_wordpress]#?docker-compose?scale?wordpress=2?
WARNING:?The?scale?command?is?deprecated.?Use?the?up?command?with?the?--scale?flag?instead.
Starting?mywordpress_wordpress_1?...?done
Creating?mywordpress_wordpress_2?...?done
3、安裝haproxy
[root@docker01?~]#?yum?install?haproxy?-y
4、修改haproxy配置文件
關(guān)于配置文件的詳細(xì)說明,參考:
https://www.cnblogs.com/MacoLee/p/5853413.html
[root@docker01?~]#cp?/etc/haproxy/haproxy.cfg{,.bak}
[root@docker01?~]#?vim?/etc/haproxy/haproxy.cfg
global
????log127.0.0.1?local2
????chroot??????/var/lib/haproxy
????pidfile?????/var/run/haproxy.pid
????maxconn?????4000
????user????????haproxy
????group???????haproxy
????daemon
????stats?socket?/var/lib/haproxy/stats?level?admin??#支持命令行控制
defaults
????mode????????????????????http
????log?????????????????????global
????option??????????????????httplog
????option??????????????????dontlognull
????option?http-server-close
????option?forwardfor???????except?127.0.0.0/8
????option??????????????????redispatch
????retries?????????????????3
????timeout?http-request????10s
????timeout?queue1m
????timeout?connect?????????10s
????timeout?client??????????1m
????timeout?server??????????1m
????timeout?http-keep-alive?10s
????timeout?check???????????10s
????maxconn?????????????????3000
listen?stats
????mode?http
????bind?0.0.0.0:8888
????stats?enable
????stats?uri?????/haproxy-status?
????stats?auth????admin:123456
frontend?frontend_www_example_com
????bind?10.0.0.100:8000
????mode?http
????option?httplog
????log?global
????default_backend?backend_www_example_com
backend?backend_www_example_com
????option?forwardfor?header?X-REAL-IP
????option?httpchk?HEAD?/?HTTP/1.0
????balance?roundrobin
????server?web-node1??10.0.0.100:32768?check?inter?2000?rise?30?fall?15
????server?web-node2??10.0.0.100:32769?check?inter?2000?rise?30?fall?15
5、啟動(dòng)haproxy
systemctl?start?haproxy
systemctl?enable?haproxy
6、使用瀏覽器訪問hapeoxy監(jiān)聽的8000端口可以看到負(fù)載的情況

7、使用瀏覽器訪問 http://10.0.0.100:8888/haproxy-status
可以看到后端節(jié)點(diǎn)的監(jiān)控狀況,

11.4 安裝socat 直接操作socket控制haproxy
1、安裝軟件
yum?install?socat.x86\_64?-y
2、查看幫助
[root@docker01?web_data]#?echo?"help"|socat?stdio?/var/lib/haproxy/stats
3、下線后端節(jié)點(diǎn)
echo?"disable?server?backend_www_example_com/web-node2"|socat?stdio?/var/lib/haproxy/stats
4、上線后端節(jié)點(diǎn)
echo?"enable?server?backend_www_example_com/web-node3"|socat?stdio?/var/lib/haproxy/stats
5、編寫php測(cè)試頁(yè),放到/data/web_data下,在瀏覽器中訪問可以查看當(dāng)前的節(jié)點(diǎn)
[root@docker01?web_data]#?vim?check.php
????
????????PHP測(cè)試
????
????
????????Hello?World?';??>
????????".$_SERVER['SERVER_ADDR'].""."
";
????????echo"訪問的服務(wù)器域名是:"."".$_SERVER['SERVER_NAME'].""."
";
?????????>
????
12 重啟docker服務(wù),容器全部退出的解決辦法
12.1 在啟動(dòng)是指定自動(dòng)重啟
docker?run??--restart=always
12.2 修改docker默認(rèn)配置文件
#?添加上下面這行
"live-restore":?true
docker server配置文件/etc/docker/daemon.json參考
[root@docker02?~]#?cat??/etc/docker/daemon.json?
{
??"registry-mirrors":?["https://registry.docker-cn.com"],
??"graph":?"/opt/mydocker",?#?修改數(shù)據(jù)的存放目錄到/opt/mydocker/,原/var/lib/docker/
??"insecure-registries":?["10.0.0.100:5000"],
??"live-restore":?true
}
重啟生效,只對(duì)在此之后啟動(dòng)的容器生效
[root@docker01?~]#?systemctl?restart??docker.service
13 Docker網(wǎng)絡(luò)類型

13.1 docker的網(wǎng)絡(luò)類型
| 類型 | 說明 |
|---|---|
| None | 不為容器配置任何網(wǎng)絡(luò)功能,沒有網(wǎng)絡(luò) --net=none |
| Container | 與另一個(gè)運(yùn)行中的容器共享Network Namespace,--net=container:containerID |
| Host | 與主機(jī)共享Network Namespace,--net=host |
| Bridge | Docker設(shè)計(jì)的NAT網(wǎng)絡(luò)模型(默認(rèn)類型) |
Bridge默認(rèn)docker網(wǎng)絡(luò)隔離基于網(wǎng)絡(luò)命名空間,在物理機(jī)上創(chuàng)建docker容器時(shí)會(huì)為每一個(gè)docker容器分配網(wǎng)絡(luò)命名空間,并且把容器IP橋接到物理機(jī)的虛擬網(wǎng)橋上。
13.2 不為容器配置網(wǎng)絡(luò)功能
此模式下創(chuàng)建容器是不會(huì)為容器配置任何網(wǎng)絡(luò)參數(shù)的,如:容器網(wǎng)卡、IP、通信路由等,全部需要自己去配置。
[root@docker01?~]#?docker?run??-it?--network?none?busybox:latest??/bin/sh?
/?#?ip?a
1:?lo:??mtu?65536?qdisc?noqueue?
????link/loopback?00:00:00:00:00:00?brd?00:00:00:00:00:00
????inet?127.0.0.1/8?scope?host?lo
???????valid_lft?forever?preferred_lft?forever
13.3 與其他容器共享網(wǎng)絡(luò)配置(Container)
此模式和host模式很類似,只是此模式創(chuàng)建容器共享的是其他容器的IP和端口而不是物理機(jī),此模式容器自身是不會(huì)配置網(wǎng)絡(luò)和端口,創(chuàng)建此模式容器進(jìn)去后,你會(huì)發(fā)現(xiàn)里邊的IP是你所指定的那個(gè)容器IP并且端口也是共享的,而且其它還是互相隔離的,如進(jìn)程等。
[root@docker01?~]#?docker?run??-it?--network?container:mywordpress_db_1??busybox:latest??/bin/sh?
/?#?ip?a
1:?lo:??mtu?65536?qdisc?noqueue?
????link/loopback?00:00:00:00:00:00?brd?00:00:00:00:00:00
????inet?127.0.0.1/8?scope?host?lo
???????valid_lft?forever?preferred_lft?forever
105:?eth0@if106:??mtu?1500?qdisc?noqueue?
????link/ether?02:42:ac:12:00:03?brd?ff:ff:ff:ff:ff:ff
????inet?172.18.0.3/16?brd?172.18.255.255?scope?global?eth0
???????valid_lft?forever?preferred_lft?forever
13.4 使用宿主機(jī)網(wǎng)絡(luò)
此模式創(chuàng)建的容器沒有自己獨(dú)立的網(wǎng)絡(luò)命名空間,是和物理機(jī)共享一個(gè)Network Namespace,并且共享物理機(jī)的所有端口與IP,并且這個(gè)模式認(rèn)為是不安全的。
[root@docker01?~]#?docker?run??-it?--network?host??busybox:latest??/bin/sh
13.5 查看網(wǎng)絡(luò)列表
[root@docker01?~]#?docker?network?list?
NETWORK?ID??????????NAME??????????????????DRIVER??????????????SCOPE
b15e8a720d3b????????bridge????????????????bridge??????????????local
345d65b4c2a0????????host??????????????????host????????????????local
bc5e2a32bb55????????mywordpress_default???bridge??????????????local
ebf76eea91bb????????none??????????????????null????????????????local
13.6 用PIPEWORK為docker容器配置獨(dú)立IP
參考文檔:
http://blog.csdn.net/design321/article/details/48264825
官方網(wǎng)站:
https://github.com/jpetazzo/pipework
宿主環(huán)境:centos7.2
1、安裝pipework
wget?https://github.com/jpetazzo/pipework/archive/master.zip
unzip?master.zip?
cp?pipework-master/pipework??/usr/local/bin/
chmod?+x?/usr/local/bin/pipework
2、配置橋接網(wǎng)卡
安裝橋接工具
yum?install?bridge-utils.x86\_64?-y
修改網(wǎng)卡配置,實(shí)現(xiàn)橋接
#?修改eth0配置,讓br0實(shí)現(xiàn)橋接
[root@docker01?~]#?cat?/etc/sysconfig/network-scripts/ifcfg-eth0?
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
[root@docker01?~]#?cat?/etc/sysconfig/network-scripts/ifcfg-br0?
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=10.0.0.100
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
DNS1=223.5.5.5
#?重啟網(wǎng)絡(luò)
[root@docker01?~]#?/etc/init.d/network?restart
3、運(yùn)行一個(gè)容器鏡像測(cè)試:
pipework?br0?\$\(docker?run?-d?-it?-p?6880:80?--name??httpd\_pw?httpd\)?10.0.0.220/24\@10.0.0.254
在其他主機(jī)上測(cè)試端口及連通性
[root@docker01?~]#?curl?10.0.0.220
It?works!
[root@docker01?~]#?ping?10.0.0.220?-c?1
PING?10.0.0.220?(10.0.0.220)?56(84)?bytes?of?data.
64?bytes?from?10.0.0.220:?icmp_seq=1?ttl=64?time=0.043?ms
4、再運(yùn)行一個(gè)容器,設(shè)置網(wǎng)路類型為none:
pipework?br0?$(docker?run?-d?-it?--net=none?--name?test?httpd:2.4)?10.0.0.221/[email protected]
進(jìn)行訪問測(cè)試
[root@docker01?~]#?curl?10.0.0.221
It?works!
5、重啟容器后需要再次指定:
pipework?br0?testduliip??172.16.146.113/24\@172.16.146.1?pipework?br0?testduliip01?172.16.146.112/24\@172.16.146.1
Dcoker跨主機(jī)通信之overlay可以參考:
http://www.cnblogs.com/CloudMan6/p/7270551.html
13.7 Docker跨主機(jī)通信之macvlan
創(chuàng)建網(wǎng)絡(luò)
[root@docker01?~]#?docker?network??create?--driver?macvlan??--subnet?10.1.0.0/24?--gateway?10.1.0.254?-o?parent=eth0??macvlan_1
33a1f41dcc074f91b5bd45e7dfedabfb2b8ec82db16542f05213839a119b62ca
設(shè)置網(wǎng)卡為混雜模式
ip?link?set?eth0?promisc?on
創(chuàng)建使用macvlan網(wǎng)絡(luò)容器
[root@docker02?~]#?docker?run??-it?--network?macvlan_1??--ip=10.1.0.222?busybox?/bin/sh
14 docker企業(yè)級(jí)鏡像倉(cāng)庫(kù)harbor
容器管理
[root@docker01?harbor]#?pwd
/opt/harbor
[root@docker01?harbor]#?docker-compose?stop
1、安裝docker、docker-compose
下載 harbor
cd?/opt?&&?https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.3.0.tgz
tar?xf?harbor-offline-installer-v1.3.0.tgz
2、修改主機(jī)及web界面密碼
[root@docker01?harbor]#?vim?harbor.cfg?
????···
????hostname?=?10.0.0.100
????harbor_admin_password?=?Harbor12345
????···
3、執(zhí)行安裝腳本
[root@docker01?harbor]#?./install.sh
瀏覽器訪問 http://10.0.0.11

添加一個(gè)項(xiàng)目

4、鏡像推送到倉(cāng)庫(kù)的指定項(xiàng)目
[root@docker02?~]#?docker??tag?centos:6.8??10.0.0.100/clsn/centos6.8:1.0
[root@docker02?~]#??
[root@docker02?~]#?docker?images?
REPOSITORY??????????????????TAG?????????????????IMAGE?ID????????????CREATED?????????????SIZE
busybox?????????????????????latest??????????????5b0d59026729????????8?days?ago??????????1.15MB
10.0.0.100/clsn/centos6.81.06704d778b3ba????????2?months?ago????????195MB
centos??????????????????????6.86704d778b3ba????????2?months?ago????????195MB
[root@docker02?~]#?docker?login?10.0.0.100
Username:?admin
Password:?
Login?Succeeded
5、推送鏡像
[root@docker02?~]#?docker?push?10.0.0.100/clsn/centos6.8?
The?push?refers?to?repository?[10.0.0.100/clsn/centos6.8]
e00c9229b481:?Pushing??13.53MB/194.5MB
6、在web界面里查看

14.1 使用容器的建議
不要以拆分方式進(jìn)行應(yīng)用程序發(fā)布 不要?jiǎng)?chuàng)建大型鏡像 不要在單個(gè)容器中運(yùn)行多個(gè)進(jìn)程 不要在鏡像內(nèi)保存憑證,不要依賴IP地址 以非root用戶運(yùn)行進(jìn)程 不要使用“最新”標(biāo)簽 不要利用運(yùn)行中的容器創(chuàng)建鏡像 不要使用單層鏡像 不要將數(shù)據(jù)存放在容器內(nèi)
14.2 關(guān)于Docker容器的監(jiān)控
容器的基本信息
包括容器的數(shù)量、ID、名稱、鏡像、啟動(dòng)命令、端口等信息。
容器的運(yùn)行狀態(tài)
統(tǒng)計(jì)各狀態(tài)的容器的數(shù)量,包括運(yùn)行中、暫停、停止及異常退出。
容器的用量信息
統(tǒng)計(jì)容器的CPU使用率、內(nèi)存使用量、塊設(shè)備I/O使用量、網(wǎng)絡(luò)使用情況等資源的使用情況。
[2] https://www.redhat.com/zh/topics/containers/what-is-docker
[3] http://blog.51cto.com/dihaifeng/1713512
[4] https://www.cnblogs.com/Bourbon-tian/p/6867796.html
[5] https://www.cnblogs.com/CloudMan6/p/6806193.html
來自:開源Linux ?作者 | 慘綠少年?原文 |http://adkx.net/9804r
往期精彩回顧
適合初學(xué)者入門人工智能的路線及資料下載 (圖文+視頻)機(jī)器學(xué)習(xí)入門系列下載 中國(guó)大學(xué)慕課《機(jī)器學(xué)習(xí)》(黃海廣主講) 機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印 《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 機(jī)器學(xué)習(xí)交流qq群955171419,加入微信群請(qǐng)掃碼:
