收藏:Docker 從入門(mén)到精通


docker不是一個(gè)值得投入的領(lǐng)域,它解決的問(wèn)題是Unix系統(tǒng)最初設(shè)計(jì)的一個(gè)疏忽。從一個(gè)不會(huì)用docker的小白,自己一步一步的摸索,中間也踩過(guò)許多坑。但任然,堅(jiān)持從哪里跌倒就從哪里爬起來(lái)。不求感動(dòng)自己,但求人生無(wú)悔。?
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 安裝Docker
3.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安裝kodexplorer
8 Docker中的鏡像分層
8.1 Docker 鏡像為什么分層
8.2 可寫(xiě)的容器層
8.3 容器層的細(xì)節(jié)說(shuō)明
9 使用docker運(yùn)行zabbix-server
9.1 容器間的互聯(lián)
9.2 啟動(dòng)zabbix容器
9.3 關(guān)于zabbix API
10 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控制haproxy
12 重啟docker服務(wù),容器全部退出的解決辦法
12.1 在啟動(dòng)是指定自動(dòng)重啟
12.2 修改docker默認(rèn)配置文件
13 Docker網(wǎng)絡(luò)類(lèi)型
13.1 docker的網(wǎng)絡(luò)類(lèi)型
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ī)通信之macvlan
14 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 容器

更加詳細(xì)地來(lái)說(shuō),請(qǐng)您假定您在開(kāi)發(fā)一個(gè)應(yīng)用。您使用的是一臺(tái)筆記本電腦,而且您的開(kāi)發(fā)環(huán)境具有特定的配置。其他開(kāi)發(fā)人員身處的環(huán)境配置可能稍有不同。您正在開(kāi)發(fā)的應(yīng)用依賴(lài)于您當(dāng)前的配置,還要依賴(lài)于某些特定文件。與此同時(shí),您的企業(yè)還擁有標(biāo)準(zhǔn)化的測(cè)試和生產(chǎn)環(huán)境,且具有自身的配置和一系列支持文件。您希望盡可能多在本地模擬這些環(huán)境,而不產(chǎn)生重新創(chuàng)建服務(wù)器環(huán)境的開(kāi)銷(xiāo)。
因此,您要如何確保應(yīng)用能夠在這些環(huán)境中運(yùn)行和通過(guò)質(zhì)量檢測(cè),并且在部署過(guò)程中不出現(xiàn)令人頭疼的問(wèn)題,也無(wú)需重新編寫(xiě)代碼和進(jìn)行故障修復(fù)?答案就是使用容器。容器可以確保您的應(yīng)用擁有必需的配置和文件,使得這些應(yīng)用能夠在從開(kāi)發(fā)到測(cè)試、再到生產(chǎn)的整個(gè)流程中順利運(yùn)行,而不出現(xiàn)任何不良問(wèn)題。這樣可以避免危機(jī),做到皆大歡喜。
1.2 容器不就是虛擬化嗎

1.3 容器發(fā)展簡(jiǎn)史

2 什么是 Docker?
IT 軟件中所說(shuō)的 “Docker” ,是指容器化技術(shù),用于支持創(chuàng)建和使用 Linux 容器。 開(kāi)源 Docker 社區(qū)致力于改進(jìn)這類(lèi)技術(shù),并免費(fèi)提供給所有用戶(hù),使之獲益。 Docker Inc. 公司憑借 Docker 社區(qū)產(chǎn)品起家,它主要負(fù)責(zé)提升社區(qū)版本的安全性,并將改進(jìn)后的版本與更廣泛的技術(shù)社區(qū)分享。此外,它還專(zhuān)門(mén)對(duì)這些技術(shù)產(chǎn)品進(jìn)行完善和安全固化,以服務(wù)于企業(yè)客戶(hù)。
2.1 Docker 如何工作?
2.2 Docker 技術(shù)是否與傳統(tǒng)的 Linux 容器相同?

2.3 docker的目標(biāo)
3 安裝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.100172.16.1.100
[root@docker02 ~]# hostname -I
10.0.0.101172.16.1.101
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)聽(tīng)遠(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ǔ)命令操作
[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
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)行訪(fǎng)問(wèn)測(cè)試
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
4.2 獲取鏡像
[root@docker01 ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
af4b0a2388c6: Downloading ?34.65MB/73.67MB
[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 容器的起/停
[root@docker01 ~]# docker run nginx
[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;
[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
[root@docker01 ~]# docker container ?inspect ?容器名稱(chēng)/id
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 容器名稱(chēng)/id
或
[root@docker01 ~]# docker container ?kill ?容器名稱(chēng)/id
5.2 進(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
[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
[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
[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
[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)行端口映射
[root@docker01 ~]# docker run -d -p 8888:80 ?nginx:latest
287bec5c60263166c03e1fc5b0b8262fe76507be3dfae4ce5cd2ee2d1e8a89a9
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
[root@docker01 ~]# echo 'http://www.nmtui.com' >/data/index.html
[root@docker01 ~]# curl 10.0.0.100
http://www.nmtui.com
[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)建卷后掛載
[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'
? ?}
]
[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
[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)將容器保存為鏡像
[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
[root@docker01 ~]# docker commit brave_mcclintock ?centos6-ssh
[root@docker01 ~]# docker run -d ?-p 1122:22 ?centos6-ssh:latest ?/usr/sbin/sshd -D
5b8161fda2a9f2c39c196c67e2eb9274977e7723fe51c4f08a0190217ae93094
[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)限
注意執(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
7 Dockerfile自動(dòng)構(gòu)建docker鏡像
7.1 Dockerfile指令集
基礎(chǔ)鏡像信息 FROM centos:6.8
制作鏡像操作指令RUN yum insatll openssh-server -y
容器啟動(dòng)時(shí)執(zhí)行指令 CMD ['/bin/bash']
FROM 這個(gè)鏡像的媽媽是誰(shuí)?(指定基礎(chǔ)鏡像)
MAINTAINER 告訴別人,誰(shuí)負(fù)責(zé)養(yǎng)它?(指定維護(hù)者信息,可以沒(méi)有)
RUN 你想讓它干啥(在命令前面加上RUN即可)
ADD 給它點(diǎn)創(chuàng)業(yè)資金(COPY文件,會(huì)自動(dòng)解壓)
WORKDIR 我是cd,今天剛化了妝(設(shè)置當(dāng)前工作目錄)
VOLUME 給它一個(gè)存放行李的地方(設(shè)置卷,掛載主機(jī)目錄)
EXPOSE 它要打開(kāi)的門(mén)是啥(指定對(duì)外的端口)
CMD 奔跑吧,兄弟!(指定容器啟動(dòng)后的要干的事情)
COPY 復(fù)制文件
ENV ?環(huán)境變量
ENTRYPOINT ?容器啟動(dòng)后執(zhí)行的命令
7.2 創(chuàng)建一個(gè)Dockerfile
# 創(chuàng)建目錄
[root@docker01 base]# cd /opt/base
# 創(chuàng)建Dcokerfile文件,注意大小寫(xiě)
[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']
[root@docker01 base]# docker image build ?-t centos6.8-ssh .
-t 為鏡像標(biāo)簽打標(biāo)簽 ?. 表示當(dāng)前路徑
[root@docker01 base]# docker run ?-d -p 2022:22 centos6.8-ssh-b
dc3027d3c15dac881e8e2aeff80724216f3ac725f142daa66484f7cb5d074e7a
7.3 使用Dcokerfile安裝kodexplorer
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']
8 Docker中的鏡像分層

8.1 Docker 鏡像為什么分層
8.2 可寫(xiě)的容器層

8.3 容器層的細(xì)節(jié)說(shuō)明
9 使用docker運(yùn)行zabbix-server
9.1 容器間的互聯(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
# 在容器中訪(fǎng)問(wèn)nginx容器可以ping通
ping web01
# 啟動(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
/ #
# 使用新的容器訪(fǎng)問(wèn)最初的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容器
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
docker run --name zabbix-java-gateway -t
? ? ?-d zabbix/zabbix-java-gateway:latest
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
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
# 獲取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ù)
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry ?registry
[root@docker01 ~]# cat ?/etc/docker/daemon.json
{
?'registry-mirrors': ['https://registry.docker-cn.com'],
?'insecure-registries': ['10.0.0.100:5000']
}
[root@docker01 ~]# systemctl restart ?docker.service
[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
[root@docker01 ~]# docker push ? 10.0.0.100:5000/clsn/busybox
10.2 帶basic認(rèn)證的倉(cāng)庫(kù)
[root@docker01 clsn]# yum install httpd-tools ?-y
mkdir /opt/registry-var/auth/ -p
htpasswd -Bbn clsn 123456 ?> /opt/registry-var/auth/htpasswd
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
# 登陸用戶(hù)
[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)'
? ?}
}
11 docker-compose編排工具
11.1 安裝docker-compose
# 下載pip軟件
yum install -y python2-pip
# 下載 docker-compose
pip install docker-compose
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)鏡像
[root@docker01 ~]# mkdir /opt/my_wordpress/
[root@docker01 ~]# cd /opt/my_wordpress/
[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
[root@docker01 my_wordpress]# docker-compose up
#啟動(dòng)方法:docker-compose up
#后臺(tái)啟動(dòng)方法:docker-compose up -d
11.3 haproxy代理后端docker容器
[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
[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
[root@docker01 ~]# yum install haproxy -y
[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
systemctl start haproxy
systemctl enable haproxy


11.4 安裝socat 直接操作socket控制haproxy
yum install socat.x86_64 -y
[root@docker01 web_data]# echo 'help'|socat stdio /var/lib/haproxy/stats
echo 'disable server backend_www_example_com/web-node2'|socat stdio /var/lib/haproxy/stats
echo 'enable server backend_www_example_com/web-node3'|socat stdio /var/lib/haproxy/stats
[root@docker01 web_data]# vim check.php
? ?
? ? ? ?PHP測(cè)試
? ?
? ?
? ? ? ?\'Hello World
\'; ?>
? ? ? ?'訪(fǎng)問(wèn)的服務(wù)器地址是:'.'' .$_SERVER[\'SERVER_ADDR\'].''.'
';
? ? ? ?echo'訪(fǎng)問(wèn)的服務(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
[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
13 Docker網(wǎng)絡(luò)類(lèi)型

13.1 docker的網(wǎng)絡(luò)類(lèi)型
13.2 不為容器配置網(wǎng)絡(luò)功能
[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)
[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ò)
[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
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
yum install bridge-utils.x86_64 -y
# 修改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
pipework br0 $(docker run -d -it -p 6880:80 --name ?httpd_pw httpd) 10.0.0.220/24@10.0.0.254
[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
pipework br0 $(docker run -d -it --net=none --name test httpd:2.4) 10.0.0.221/24@10.0.0.254
[root@docker01 ~]# curl 10.0.0.221 It works!
pipework br0 testduliip ?172.16.146.113/24@172.16.146.1 pipework br0 testduliip01 172.16.146.112/24@172.16.146.1
1.13.7 Docker跨主機(jī)通信之macvlan
[root@docker01 ~]# docker network ?create --driver macvlan ?--subnet 10.1.0.0/24 --gateway 10.1.0.254 -o parent=eth0 ?macvlan_1
33a1f41dcc074f91b5bd45e7dfedabfb2b8ec82db16542f05213839a119b62ca
ip link set eth0 promisc on
[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
cd /opt && https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.3.0.tgz
tar xf harbor-offline-installer-v1.3.0.tgz
[root@docker01 harbor]# vim harbor.cfg
? ?···
? ?hostname = 10.0.0.100
? ?harbor_admin_password = Harbor12345
? ?···
[root@docker01 harbor]# ./install.sh


[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
[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

14.1 使用容器的建議
不要以拆分方式進(jìn)行應(yīng)用程序發(fā)布 不要?jiǎng)?chuàng)建大型鏡像 不要在單個(gè)容器中運(yùn)行多個(gè)進(jìn)程 不要再鏡像內(nèi)保存憑證,不要依賴(lài)IP地址 以非root用戶(hù)運(yùn)行進(jìn)程 不要使用“最新”標(biāo)簽 不要利用運(yùn)行中的容器創(chuàng)建鏡像 不要使用單層鏡像 不要將數(shù)據(jù)存放在容器內(nèi)
14.2 關(guān)于Docker容器的監(jiān)控
下載方式:
參考文獻(xiàn)
[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
作者:慘綠少年 來(lái)源:https://www.cnblogs.com/clsn/p/8410309.html
???????????????? ?END ?????????????????
免責(zé)申明:本號(hào)聚焦相關(guān)技術(shù)分享,內(nèi)容觀(guān)點(diǎn)不代表本號(hào)立場(chǎng),可追溯內(nèi)容均注明來(lái)源,發(fā)布文章若存在版權(quán)等問(wèn)題,請(qǐng)留言刪除,謝謝。
?關(guān)注公眾號(hào):Java后端編程,回復(fù)下面關(guān)鍵字?
要Java學(xué)習(xí)完整路線(xiàn),回復(fù)??路線(xiàn)?
缺Java入門(mén)視頻,回復(fù):?視頻?
要Java面試經(jīng)驗(yàn),回復(fù)??面試?
缺Java項(xiàng)目,回復(fù):?項(xiàng)目?
進(jìn)Java粉絲群:?加群?
PS:如果覺(jué)得我的分享不錯(cuò),歡迎大家隨手點(diǎn)贊、在看。
(完) 加我"微信"?獲取一份 最新Java面試題資料 請(qǐng)備注:666,不然不通過(guò)~
最近好文
2、Java學(xué)生宿舍管理系統(tǒng),附上源碼 !
最近面試BAT,整理一份面試資料《Java面試BAT通關(guān)手冊(cè)》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫(kù)、數(shù)據(jù)結(jié)構(gòu)等等。 獲取方式:關(guān)注公眾號(hào)并回復(fù)?java?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。 明天見(jiàn)(??ω??)??
