Docker 入門萬字詳解!新手也能看懂!
共 60475字,需瀏覽 121分鐘
·
2024-06-22 22:32
1.1 容器簡介
1.1.1 什么是 Linux 容器
Linux 容器是與系統(tǒng)其他部分隔離開的一系列進(jìn)程,從另一個鏡像運(yùn)行,并由該鏡像提供支持進(jìn)程所需的全部文件。容器提供的鏡像包含了應(yīng)用的所有依賴項(xiàng),因而在從開發(fā)到測試再到生產(chǎn)的整個過程中,它都具有可移植性和一致性。
“更加詳細(xì)地來說,請您假定您在開發(fā)一個應(yīng)用。您使用的是一臺筆記本電腦,而且您的開發(fā)環(huán)境具有特定的配置。其他開發(fā)人員身處的環(huán)境配置可能稍有不同。您正在開發(fā)的應(yīng)用依賴于您當(dāng)前的配置,還要依賴于某些特定文件。與此同時,您的企業(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)的整個流程中順利運(yùn)行,而不出現(xiàn)任何不良問題。這樣可以避免危機(jī),做到皆大歡喜。
雖然這只是簡化的示例,但在需要很高的可移植性、可配置性和隔離的情況下,我們可以利用 Linux 容器通過很多方式解決難題。無論基礎(chǔ)架構(gòu)是在企業(yè)內(nèi)部還是在云端,或者混合使用兩者,容器都能滿足您的需求。
1.1.2 容器不就是虛擬化嗎
是,但也不竟然。我們用一種簡單方式來思考一下:
虛擬化使得許多操作系統(tǒng)可同時在單個系統(tǒng)上運(yùn)行。
容器則可共享同一個操作系統(tǒng)內(nèi)核,將應(yīng)用進(jìn)程與系統(tǒng)其他部分隔離開。
圖 - 普通虛擬化技術(shù)和 Docker 的對比
這意味著什么?首先,讓多個操作系統(tǒng)在單個虛擬機(jī)監(jiān)控程序上運(yùn)行以實(shí)現(xiàn)虛擬化,并不能達(dá)成和使用容器同等的輕量級效果。事實(shí)上,在僅擁有容量有限的有限資源時,您需要能夠可以進(jìn)行密集部署的輕量級應(yīng)用。Linux 容器可從單個操作系統(tǒng)運(yùn)行,在所有容器中共享該操作系統(tǒng),因此應(yīng)用和服務(wù)能夠保持輕量級,并行快速運(yùn)行。
1.1.3 容器發(fā)展簡史
我們現(xiàn)在稱為容器技術(shù)的概念最初出現(xiàn)在 2000 年,當(dāng)時稱為 FreeBSD jail,這種技術(shù)可將 FreeBSD 系統(tǒng)分區(qū)為多個子系統(tǒng)(也稱為 Jail)。Jail 是作為安全環(huán)境而開發(fā)的,系統(tǒng)管理員可與企業(yè)內(nèi)部或外部的多個用戶共享這些 Jail。
Jail 的目的是讓進(jìn)程在經(jīng)過修改的 chroot 環(huán)境中創(chuàng)建,而不會脫離和影響整個系統(tǒng) — 在 chroot 環(huán)境中,對文件系統(tǒng)、網(wǎng)絡(luò)和用戶的訪問都實(shí)現(xiàn)了虛擬化。盡管 Jail 在實(shí)施方面存在局限性,但最終人們找到了脫離這種隔離環(huán)境的方法。
但這個概念非常有吸引力。
2001 年,通過 Jacques Gélinas 的 VServer 項(xiàng)目,隔離環(huán)境的實(shí)施進(jìn)入了 Linux 領(lǐng)域。正如 Gélinas 所說,這項(xiàng)工作的目的是“在高度獨(dú)立且安全的單一環(huán)境中運(yùn)行多個通用 Linux 服務(wù)器 [sic]。” 在完成了這項(xiàng)針對 Linux 中多個受控制用戶空間的基礎(chǔ)性工作后,Linux 容器開始逐漸成形并最終發(fā)展成了現(xiàn)在的模樣。
1.2 什么是 Docker?
“Docker” 一詞指代多種事物,包括開源社區(qū)項(xiàng)目、開源項(xiàng)目使用的工具、主導(dǎo)支持此類項(xiàng)目的公司 Docker Inc. 以及該公司官方支持的工具。技術(shù)產(chǎn)品和公司使用同一名稱,的確讓人有點(diǎn)困惑。
我們來簡單說明一下:
“??1. IT 軟件中所說的 “Docker” ,是指容器化技術(shù),用于支持創(chuàng)建和使用 Linux 容器。
?? 2.開源 Docker 社區(qū)致力于改進(jìn)這類技術(shù),并免費(fèi)提供給所有用戶,使之獲益。
?? 3.Docker Inc. 公司憑借 Docker 社區(qū)產(chǎn)品起家,它主要負(fù)責(zé)提升社區(qū)版本的安全性,并將改進(jìn)后的版本與更廣泛的技術(shù)社區(qū)分享。此外,它還專門對這些技術(shù)產(chǎn)品進(jìn)行完善和安全固化,以服務(wù)于企業(yè)客戶。
借助 Docker ,您可將容器當(dāng)做重量輕、模塊化的虛擬機(jī)使用。同時,您還將獲得高度的靈活性,從而實(shí)現(xiàn)對容器的高效創(chuàng)建、部署及復(fù)制,并能將其從一個環(huán)境順利遷移至另一個環(huán)境。
1.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)程、多個應(yīng)用程序,更加充分地發(fā)揮基礎(chǔ)設(shè)施的作用,同時保持各個獨(dú)立系統(tǒng)的安全性。
容器工具(包括 Docker)可提供基于鏡像的部署模式。這使得它能夠輕松跨多種環(huán)境,與其依賴程序共享應(yīng)用或服務(wù)組。Docker 還可在這一容器環(huán)境中自動部署應(yīng)用程序(或者合并多種流程,以構(gòu)建單個應(yīng)用程序)。
此外,由于這些工具基于 Linux 容器構(gòu)建,使得 Docker 既易于使用,又別具一格 —— 它可為用戶提供前所未有的高度應(yīng)用程訪問權(quán)限、快速部署以及版本控制和分發(fā)能力。
1.2.2 Docker 技術(shù)是否與傳統(tǒng)的 Linux 容器相同?
否。Docker 技術(shù)最初是基于 LXC 技術(shù)構(gòu)建(大多數(shù)人都會將這一技術(shù)與“傳統(tǒng)的” Linux 容器聯(lián)系在一起),但后來它逐漸擺脫了對這種技術(shù)的依賴。
就輕量級 虛擬化 這一功能來看,LXC 非常有用,但它無法提供出色的開發(fā)人員或用戶體驗(yàn)。除了運(yùn)行容器之外,Docker 技術(shù)還具備其他多項(xiàng)功能,包括簡化用于構(gòu)建容器、傳輸鏡像以及控制鏡像版本的流程。
傳統(tǒng)的 Linux 容器使用 init 系統(tǒng)來管理多種進(jìn)程。這意味著,所有應(yīng)用程序都作為一個整體運(yùn)行。與此相反,Docker 技術(shù)鼓勵應(yīng)用程序各自獨(dú)立運(yùn)行其進(jìn)程,并提供相應(yīng)工具以實(shí)現(xiàn)這一功能。這種精細(xì)化運(yùn)作模式自有其優(yōu)勢。
1.2.3 docker 的目標(biāo)
docker 的主要目標(biāo)是"Build,Ship and Run any App,Angwhere",構(gòu)建,運(yùn)輸,處處運(yùn)行
構(gòu)建:做一個 docker 鏡像
運(yùn)輸:docker pull
運(yùn)行:啟動一個容器
每一個容器,他都有自己的文件系統(tǒng) rootfs.
1.3 安裝 Docker
環(huán)境說明
# 需要兩臺幾點(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
在兩個節(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 配置:
# 修改啟動文件,監(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)行,是否啟動
在 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
···
1.3.1 Docker 基礎(chǔ)命令操作
查看 docker 相關(guān)信息:docker version
[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"]
}
1.3.2 啟動第一個容器
[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
# 容器啟動后,在瀏覽器進(jìn)行訪問測試
參數(shù)說明
| 參數(shù) | 說明 |
|---|---|
| run | 創(chuàng)建并運(yùn)行一個容器 |
| -d | 放入后臺 |
| -p | 端口映射 |
| nginx | 鏡像名稱 |
1.3.3 Docker 鏡像生命周期
1.4 docker 鏡像相關(guān)操作
1.4.1 搜索官方倉庫鏡像
[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]
列表說明
| 參數(shù) | 說明 |
|---|---|
| NAME | 鏡像名稱 |
| DESCRIPTION | 鏡像說明 |
| STARS | 點(diǎn)贊數(shù)量 |
| OFFICIAL | 是否是官方的 |
| AUTOMATED | 是否是自動構(gòu)建的 |
1.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
1.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
1.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
1.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
1.4.6 查看鏡像的詳細(xì)信息
[root@docker01 ~]# docker image inspect centos
1.5 容器的日常管理
1.5.1 容器的起/停
最簡單的運(yùn)行一個容器
[root@docker01 ~]# docker run nginx
創(chuàng)建容器,兩步走(不常用)
[root@docker01 ~]# docker create centos:latest /bin/bash
bb7f32368ecf0492adb59e20032ab2e6cf6a563a0e6751e58930ee5f7aaef204
[root@docker01 ~]# docker start stupefied_nobel
stupefied_nobel
快速啟動容器方法
[root@docker01 ~]# docker run centos:latest /usr/bin/sleep 20;
容器內(nèi)的第一個進(jìn)程必須一直處于運(yùn)行的狀態(tài),否則這個容器,就會處于退出狀態(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…" 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
1.5.2 進(jìn)入容器方法
啟動時進(jìn)去方法
[root@docker01 ~]# docker run -it #參數(shù):-it 可交互終端
[root@docker01 ~]# docker run -it nginx:latest /bin/bash
root@79241093859e:/#
退出/離開容器
ctrl+p & ctrl+q
啟動后進(jìn)入容器的方法
啟動一個 docker
[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 ,會讓所用通過此方法進(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
自命名啟動一個容器 --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 /]# 重新分配一個終端
[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
1.5.3 刪除所有容器
[root@docker01 ~]# docker rm -f `docker ps -a -q`
# -f 強(qiáng)制刪除
1.5.4 啟動時進(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 | 指定多個 |
隨機(jī)映射
docker run -P (大P)# 需要鏡像支持
1.6 Docker 數(shù)據(jù)卷的管理
1.6.1 掛載時創(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è)置共享卷,使用同一個卷啟動一個新的容器
[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
1.6.2 創(chuàng)建卷后掛載
創(chuàng)建一個卷
[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ī)測試
[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
1.6.3 手動將容器保存為鏡像
本次是基于 docker 官方 centos 6.8 鏡像創(chuàng)建
官方鏡像列表:https://hub.docker.com/explore/
啟動一個 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
啟動完成后鏡像 ssh 連接測試
將容器提交為鏡像
[root@docker01 ~]# docker commit brave_mcclintock centos6-ssh
使用新的鏡像啟動容器
[root@docker01 ~]# docker run -d -p 1122:22 centos6-ssh:latest /usr/sbin/sshd -D
5b8161fda2a9f2c39c196c67e2eb9274977e7723fe51c4f08a0190217ae93094
在容器安裝 httpd 服務(wù)
[root@5b8161fda2a9 /]# yum install httpd -y
編寫啟動腳本腳本
[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)限
再次提交為新的鏡像
[root@docker01 ~]# docker commit 5b8161fda2a9 centos6-httpd
sha256:705d67a786cac040800b8485cf046fd57b1828b805c515377fc3e9cea3a481c1
啟動鏡像,做好端口映射。并在瀏覽器中測試訪問
[root@docker01 ~]# docker run -d -p 1222:22 -p 80:80 centos6-httpd /init.sh
46fa6a06644e31701dc019fb3a8c3b6ef008d4c2c10d46662a97664f838d8c2c
1.7 Dockerfile 自動構(gòu)建 docker 鏡像
官方構(gòu)建 dockerffile 文件參考
https://github.com/CentOS/CentOS-Dockerfiles
1.7.1 Dockerfile 指令集
dockerfile 主要組成部分:
“基礎(chǔ)鏡像信息 FROM centos:6.8
制作鏡像操作指令 RUN yum insatll openssh-server -y
容器啟動時執(zhí)行指令 CMD ["/bin/bash"]
dockerfile 常用指令:
“FROM 這個鏡像的媽媽是誰?(指定基礎(chǔ)鏡像)
MAINTAINER 告訴別人,誰負(fù)責(zé)養(yǎng)它?(指定維護(hù)者信息,可以沒有)
RUN 你想讓它干啥(在命令前面加上 RUN 即可)
ADD 給它點(diǎn)創(chuàng)業(yè)資金(COPY 文件,會自動解壓)
WORKDIR 我是 cd,今天剛化了妝(設(shè)置當(dāng)前工作目錄)
VOLUME 給它一個存放行李的地方(設(shè)置卷,掛載主機(jī)目錄)
EXPOSE 它要打開的門是啥(指定對外的端口)
CMD 奔跑吧,兄弟!(指定容器啟動后的要干的事情)
dockerfile 其他指令:
“COPY 復(fù)制文件
ENV 環(huán)境變量
ENTRYPOINT 容器啟動后執(zhí)行的命令
1.7.2 創(chuàng)建一個 Dockerfile
創(chuàng)建第一個 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)建的鏡像啟動
[root@docker01 base]# docker run -d -p 2022:22 centos6.8-ssh-b
dc3027d3c15dac881e8e2aeff80724216f3ac725f142daa66484f7cb5d074e7a
1.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è)置工作目錄,之后的操作都在這個目錄中
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 可以參考官方方法。
1.8 Docker 中的鏡像分層
參考文檔:http://www.maiziedu.com/wiki/cloud/dockerimage/
Docker 支持通過擴(kuò)展現(xiàn)有鏡像,創(chuàng)建新的鏡像。實(shí)際上,Docker Hub 中 99% 的鏡像都是通過在 base 鏡像中安裝和配置需要的軟件構(gòu)建出來的。
從上圖可以看到,新鏡像是從 base 鏡像一層一層疊加生成的。每安裝一個軟件,就在現(xiàn)有鏡像的基礎(chǔ)上增加一層。
1.8.1 Docker 鏡像為什么分層
鏡像分層最大的一個好處就是共享資源。
比如說有多個鏡像都從相同的 base 鏡像構(gòu)建而來,那么 Docker Host 只需在磁盤上保存一份 base 鏡像;同時內(nèi)存中也只需加載一份 base 鏡像,就可以為所有容器服務(wù)了。而且鏡像的每一層都可以被共享。
如果多個容器共享一份基礎(chǔ)鏡像,當(dāng)某個容器修改了基礎(chǔ)鏡像的內(nèi)容,比如 /etc 下的文件,這時其他容器的 /etc 是不會被修改的,修改只會被限制在單個容器內(nèi)。這就是容器 Copy-on-Write 特性。
1.8.2 可寫的容器層
當(dāng)容器啟動時,一個新的可寫層被加載到鏡像的頂部。這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”。
所有對容器的改動 - 無論添加、刪除、還是修改文件都只會發(fā)生在容器層中。只有容器層是可寫的,容器層下面的所有鏡像層都是只讀的。
1.8.3 容器層的細(xì)節(jié)說明
鏡像層數(shù)量可能會很多,所有鏡像層會聯(lián)合在一起組成一個統(tǒng)一的文件系統(tǒng)。如果不同層中有一個相同路徑的文件,比如 /a,上層的 /a 會覆蓋下層的 /a,也就是說用戶只能訪問到上層中的文件 /a。在容器層中,用戶看到的是一個疊加之后的文件系統(tǒng)。
文件操作的
| 文件操作 | 說明 |
|---|---|
| 添加文件 | 在容器中創(chuàng)建文件時,新文件被添加到容器層中。 |
| 讀取文件 | 在容器中讀取某個文件時,Docker 會從上往下依次在各鏡像層中查找此文件。一旦找到,立即將其復(fù)制到容器層,然后打開并讀入內(nèi)存。 |
| 修改文件 | 在容器中修改已存在的文件時,Docker 會從上往下依次在各鏡像層中查找此文件。一旦找到,立即將其復(fù)制到容器層,然后修改之。 |
| 刪除文件 | 在容器中刪除文件時,Docker 也是從上往下依次在鏡像層中查找此文件。找到后,會在容器層中記錄下此刪除操作。(只是記錄刪除操作) |
只有當(dāng)需要修改時才復(fù)制一份數(shù)據(jù),這種特性被稱作 Copy-on-Write。可見,容器層保存的是鏡像變化的部分,不會對鏡像本身進(jìn)行任何修改。
這樣就解釋了我們前面提出的問題:容器層記錄對鏡像的修改,所有鏡像層都是只讀的,不會被容器修改,所以鏡像可以被多個容器共享。
1.9 使用 docker 運(yùn)行 zabbix-server
1.9.1 容器間的互聯(lián)
在運(yùn)行 zabbix 之前務(wù)必要了解容器間互聯(lián)的方法
# 創(chuàng)建一個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í)行過程
# 啟動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
# 拉取一個busybox 鏡像
[root@docker01 ~]# docker pull busybox
# 啟動容器
[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
1.9.2 啟動 zabbix 容器
1、啟動一個 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、啟動 java-gateway 容器監(jiān)控 java 服務(wù)
docker run --name zabbix-java-gateway -t \
-d zabbix/zabbix-java-gateway:latest
3、啟動 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、啟動 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
1.9.3 關(guān)于 zabbix API
關(guān)于 zabbix API 可以參考官方文檔:https://www.zabbix.com/documentation/3.4/zh/manual/api
1、獲取 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}
1.10 docker 倉庫(registry)
1.10.1 創(chuàng)建一個普通倉庫
1、創(chuàng)建倉庫
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.4 2e202f453940 6 days ago 179MB
10.0.0.100:5000/clsn/busybox 1.0 5b0d59026729 8 days ago 1.15MB
4、將新打標(biāo)簽的鏡像上傳鏡像到倉庫
[root@docker01 ~]# docker push 10.0.0.100:5000/clsn/busybox
1.10.2 帶 basic 認(rèn)證的倉庫
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、啟動容器,在啟動時傳入認(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)證用戶測試
# 登陸用戶
[root@docker01 ~]# docker login 10.0.0.100:5000
Username: clsn
Password: 123456
Login Succeeded
# 推送鏡像到倉庫
[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)"
}
}
至此,一個簡單的 docker 鏡像倉庫搭建完成
1.11 docker-compose 編排工具
1.11.1 安裝 docker-compose
安裝 docker-compose
# 下載pip軟件
yum install -y python2-pip
# 下載 docker-compose
pip install docker-compose
國內(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
1.11.2 編排啟動鏡像
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、啟動
[root@docker01 my_wordpress]# docker-compose up
#啟動方法:docker-compose up
#后臺啟動方法:docker-compose up -d
4、瀏覽器上訪問http://10.0.0.100:8000
進(jìn)行 wordpress 的安裝即可
1.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、同時啟動兩臺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
log 127.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 queue 1m
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、啟動 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)控狀況,
1.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 測試頁,放到/data/web_data 下,在瀏覽器中訪問可以查看當(dāng)前的節(jié)點(diǎn)
[root@docker01 web_data]# vim check.php
<html>
<head>
<title>PHP測試</title>
</head>
<body>
<?php echo '<p>Hello World </p>'; ?>
<?php echo "訪問的服務(wù)器地址是:"."<fontcolor=red>".$_SERVER['SERVER_ADDR']."</font>"."<br>";
echo"訪問的服務(wù)器域名是:"."<fontcolor=red>".$_SERVER['SERVER_NAME']."</font>"."<br>";
?>
</body>
</html>
1.12 重啟 docker 服務(wù),容器全部退出的解決辦法
1.12.1 在啟動是指定自動重啟
docker run --restart=always
1.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
}
重啟生效,只對在此之后啟動的容器生效
[root@docker01 ~]# systemctl restart docker.service
1.13 Docker 網(wǎng)絡(luò)類型
1.13.1 docker 的網(wǎng)絡(luò)類型
| 類型 | 說明 |
|---|---|
| None | 不為容器配置任何網(wǎng)絡(luò)功能,沒有網(wǎng)絡(luò) --net=none |
| Container | 與另一個運(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 容器時會為每一個 docker 容器分配網(wǎng)絡(luò)命名空間,并且把容器 IP 橋接到物理機(jī)的虛擬網(wǎng)橋上。
1.13.2 不為容器配置網(wǎng)絡(luò)功能
此模式下創(chuàng)建容器是不會為容器配置任何網(wǎng)絡(luò)參數(shù)的,如:容器網(wǎng)卡、IP、通信路由等,全部需要自己去配置。
[root@docker01 ~]# docker run -it --network none busybox:latest /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> 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
1.13.3 與其他容器共享網(wǎng)絡(luò)配置(Container)
此模式和 host 模式很類似,只是此模式創(chuàng)建容器共享的是其他容器的 IP 和端口而不是物理機(jī),此模式容器自身是不會配置網(wǎng)絡(luò)和端口,創(chuàng)建此模式容器進(jìn)去后,你會發(fā)現(xiàn)里邊的 IP 是你所指定的那個容器 IP 并且端口也是共享的,而且其它還是互相隔離的,如進(jìn)程等。
[root@docker01 ~]# docker run -it --network container:mywordpress_db_1 busybox:latest /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> 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
1.13.4 使用宿主機(jī)網(wǎng)絡(luò)
此模式創(chuàng)建的容器沒有自己獨(dú)立的網(wǎng)絡(luò)命名空間,是和物理機(jī)共享一個 Network Namespace,并且共享物理機(jī)的所有端口與 IP,并且這個模式認(rèn)為是不安全的。
[root@docker01 ~]# docker run -it --network host busybox:latest /bin/sh
1.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
1.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)行一個容器鏡像測試:
pipework br0 $(docker run -d -it -p 6880:80 --name httpd_pw httpd) 10.0.0.220/[email protected]
在其他主機(jī)上測試端口及連通性
[root@docker01 ~]# curl 10.0.0.220
<html><body><h1>It works!</h1></body></html>
[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)行一個容器,設(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)行訪問測試
[root@docker01 ~]# curl 10.0.0.221
<html><body><h1>It works!</h1></body></html>
5、重啟容器后需要再次指定:
pipework br0 testduliip 172.16.146.113/[email protected]
pipework br0 testduliip01 172.16.146.112/[email protected]
Dcoker 跨主機(jī)通信之 overlay 可以參考:
http://www.cnblogs.com/CloudMan6/p/7270551.html
1.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
1.14 docker 企業(yè)級鏡像倉庫 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
添加一個項(xiàng)目
4、鏡像推送到倉庫的指定項(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.8 1.0 6704d778b3ba 2 months ago 195MB
centos 6.8 6704d778b3ba 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 界面里查看
1.14.1 使用容器的建議
-
不要以拆分方式進(jìn)行應(yīng)用程序發(fā)布 -
不要創(chuàng)建大型鏡像 -
不要在單個容器中運(yùn)行多個進(jìn)程 -
不要再鏡像內(nèi)保存憑證,不要依賴 IP 地址 -
以非 root 用戶運(yùn)行進(jìn)程 -
不要使用“最新”標(biāo)簽 -
不要利用運(yùn)行中的容器創(chuàng)建鏡像 -
不要使用單層鏡像 -
不要將數(shù)據(jù)存放在容器內(nèi)
1.14.2 關(guān)于 Docker 容器的監(jiān)控
容器的基本信息
包括容器的數(shù)量、ID、名稱、鏡像、啟動命令、端口等信息
容器的運(yùn)行狀態(tài)
統(tǒng)計(jì)各狀態(tài)的容器的數(shù)量,包括運(yùn)行中、暫停、停止及異常退出
容器的用量信息
統(tǒng)計(jì)容器的 CPU 使用率、內(nèi)存使用量、塊設(shè)備 I/O 使用量、網(wǎng)絡(luò)使用情況等資源的使用情況。
來源:慘綠少年| 鏈接:cnblogs.com/clsn/p/8410309.html
