第1章 Docker容器介紹
1.1 docker是什么
Docker 是 Docker.Inc 公司開源的一個(gè)基于 LXC技術(shù)之上構(gòu)建的Container容器引擎循诉, 源代碼托管在 GitHub 上, 基于Go語言并遵從Apache2.0協(xié)議開源捏浊。
Docker是通過內(nèi)核虛擬化技術(shù)(namespaces及cgroups等)來提供容器的資源隔離與安全保障等寿谴。由于Docker通過操作系統(tǒng)層的虛擬化實(shí)現(xiàn)隔離,所以Docker容器在運(yùn)行時(shí)吊洼,不需要類似虛擬機(jī)(VM)額外的操作系統(tǒng)開銷份帐,提高資源利用率膏萧。
1.2 容器與虛擬機(jī)對(duì)比
1.3 docker的三個(gè)重要概念
Image(鏡像):
那么鏡像到底是什么呢?Docker 鏡像可以看作是一個(gè)特殊的文件系統(tǒng)饮怯,除了提供容器運(yùn)行時(shí)所需的程序闰歪、庫、資源蓖墅、配置等文件外库倘,還包含了一些為運(yùn)行時(shí)準(zhǔn)備的一些配置參數(shù)(如匿名卷、環(huán)境變量论矾、用戶等)教翩。
Container(容器)
容器(Container)的定義和鏡像(Image)幾乎一模一樣,也是一堆層的統(tǒng)一視角贪壳,唯一區(qū)別在于容器的最上面那一層是可讀可寫的饱亿。
Repository(倉庫)
鏡像倉庫是 Docker 用來集中存放鏡像文件的地方,類似于我們之前常用的代碼倉庫。
通常彪笼,一個(gè)倉庫會(huì)包含同一個(gè)軟件不同版本的鏡像钻注,而標(biāo)簽就常用于對(duì)應(yīng)該軟件的各個(gè)版本 。
我們可以通過<倉庫名>:<標(biāo)簽>的格式來指定具體是這個(gè)軟件哪個(gè)版本的鏡像配猫。如果不給出標(biāo)簽幅恋,將以 Latest 作為默認(rèn)標(biāo)簽。
1.4 docker的組成部分
docker是傳統(tǒng)的CS架構(gòu)分為docker client和docker server
Docker 客戶端是 Docker 用戶與 Docker 交互的主要方式泵肄。當(dāng)您使用 Docker 命令行運(yùn)行命令時(shí)捆交,Docker 客戶端將這些命令發(fā)送給服務(wù)器端,服務(wù)端將執(zhí)行這些命令凡伊。
Docker 命令使用 Docker API 零渐。Docker 客戶端可以與多個(gè)服務(wù)端進(jìn)行通信。
第2章 Docker安裝部署
2.1 國內(nèi)源安裝docker-ce
這里我們使用清華源:
https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
操作步驟:
yum remove docker docker-common docker-selinux docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
yum install docker-ce
systemctl start docker
2.2 國內(nèi)遠(yuǎn)鏡像加速配置
[root@docker01 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
[root@docker01 ~]# systemctl restart docker
2.3 快速安裝
思路:
1.開啟yum緩存
2.全新環(huán)境安裝docker
3.將緩存的包全部打包出來
4.安裝的時(shí)候使用rpm -ivh *.rpm方式安裝
2.4 運(yùn)行第一個(gè)容器
運(yùn)行一個(gè)Hello world
docker run alpine /bin/echo "Hello world"
第3章 Docker鏡像和容器管理
3.1 鏡像相關(guān)命令
3.1.1 搜索鏡像
選擇鏡像建議:
1.優(yōu)先選擇官方的
2.選擇星星多的
docker search centos
3.1.2 獲取鏡像
docker pull centos
docker pull busybox
docker pull busybox:1.29
3.1.3 查看鏡像
docker images
3.1.4 刪除鏡像
docker rmi centos
3.1.5 導(dǎo)出鏡像
docker save -o centos.tar centos:latest
3.1.6 導(dǎo)入鏡像
docker load < centos.tar
3.2 容器相關(guān)命令
3.2.1 啟動(dòng)容器
docker run -d -p 80:80 nginx
docker run --name mydocker -t -i centos /bin/bash
3.2.2 停止容器
docker stop
3.2.3 查看容器
docker ps
docker ps -a
docker ps -q
docker ps -aq
3.2.4 進(jìn)入容器
docker exec會(huì)分配一個(gè)新的終端tty
docker exec -it 容器ID /bin/bash
docker attach會(huì)使用同一個(gè)終端
docker attach 容器ID
3.2.5 刪除容器
刪除單個(gè)容器
docker rm 容器ID
批量刪除容器
docker stop $(docker ps -q)
docker rm $(docker ps -aq)
第4章 Docker網(wǎng)絡(luò)管理
4.1 隨機(jī)映射端口
docker run -P
4.2 指定映射端口
-p 宿主機(jī)端口:容器端口
-p 80:80 -p 443:443
-p 宿主機(jī)IP:宿主機(jī)端口:容器端口
如果想多個(gè)容器使用8080端口系忙,可以通過添加多個(gè)IP地址實(shí)現(xiàn)
ifconfig eth0:1 10.0.1.13 up
docker run -d -p 10.0.1.11:8080:80 nginx:latest
docker run -d -p 10.0.1.13:8080:80 nginx:latest
進(jìn)入容器里修改站點(diǎn)目錄诵盼,然后訪問測(cè)試
docker exec -it bdb2a4e7e24d /bin/bash
echo "web01" > /usr/share/nginx/html/index.html
docker exec -it 31c1de138dda /bin/bash
echo "web02" > /usr/share/nginx/html/index.html
訪問測(cè)試:
[root@docker01 ~]# curl 10.0.1.11:8080
web02
[root@docker01 ~]# curl 10.0.1.13:8080
web01
第5章 Docker數(shù)據(jù)卷管理
5.1 持久化數(shù)據(jù)卷
-v 宿主機(jī)目錄:容器內(nèi)目錄
下面我們來創(chuàng)建一個(gè)html5小游戲
5.1.1 創(chuàng)建游戲代碼目錄
mkdir /data/xiaoniao -p
cd /data/
unzip xiaoniaofeifei.zip -d xiaoniao /
5.1.2 創(chuàng)建容器并映射數(shù)據(jù)卷
docker run -d -p 80:80 -v /data/xiaoniao:/usr/share/nginx/html nginx:latest
docker ps
5.1.3 訪問游戲頁面
10.0.1.11
5.2 持久化數(shù)據(jù)卷容器
--volumes-from (跟某一個(gè)已經(jīng)存在的容器掛載相同的卷)
查看當(dāng)前容器有哪些卷
docker volume ls
下面我們利用容器卷創(chuàng)建一個(gè)小游戲
5.2.1 創(chuàng)建一個(gè)容器卷
docker run -d -p 8080:80 --volume xiaoniao:/usr/share/nginx/html nginx:latest
docker volume ls
5.2.2 查看卷的目錄
docker volume inspect xiaoniao
5.2.3 復(fù)制代碼目錄到容器卷目錄
\cp -a /data/xiaoniao/* /var/lib/docker/volumes/xiaoniao/_data/
5.2.4 使用容器卷創(chuàng)建新容器
docker run -d -p 8090:80 --volume xiaoniao:/usr/share/nginx/html nginx:latest
5.3 實(shí)驗(yàn)-訪問不同端口展示不同頁面
需求:
訪問8080端口,展示xiaoniao首頁
訪問8090端口银还,展示游戲集合頁面
5.3.1 準(zhǔn)備nginx配置文件
[root@docker01 ~]# cat /data/game.conf
server {
listen 8080;
server_name localhost;
location / {
root /opt/game/;
index index.html index.htm;
}
}
server {
listen 8090;
server_name localhost;
location / {
root /opt/xiaoniao/;
index index.html index.htm;
}
}
5.3.2 上傳代碼目錄
[root@docker01 /data]# ll
總用量 18896
drwxr-xr-x 5 root root 73 9月 7 23:03 game
-rw-r--r-- 1 root root 309 9月 7 22:57 game.conf
-rw-r--r-- 1 root root 19248295 8月 28 09:48 html5.zip
drwxr-xr-x 3 root root 92 9月 7 22:15 xiaoniao
-rw-r--r-- 1 root root 91014 9月 7 22:11 xiaoniaofeifei.zip
5.3.3 創(chuàng)建容器并掛載
需要掛載的內(nèi)容:
1.nginx配置文件
2.游戲目錄
創(chuàng)建容器命令
docker run -d -p 8080:8080 -p 8090:8090 -v /data/game.conf:/etc/nginx/conf.d/game.conf -v /data/game:/opt/game -v /data/xiaoniao:/opt/xiaoniao nginx:latest
5.3.4 訪問測(cè)試
10.0.1.11:8080
10.0.1.11:8090
第6章 Docker鏡像手動(dòng)構(gòu)建
6.1 手動(dòng)制作游戲鏡像
下面我們基于centos容器制作一個(gè)新鏡像风宁,并安裝nginx服務(wù)
6.1.1 啟動(dòng)一個(gè)容器并安裝nginx
[root@docker01 ~]# docker run -it centos /bin/bash
[root@0ede2760ba65 /]# yum install wget install openssh-clients -y
[root@0ede2760ba65 /]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@0ede2760ba65 /]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@0ede2760ba65 /]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[root@0ede2760ba65 /]# cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
[root@0ede2760ba65 /]# yum makecache fast
[root@0ede2760ba65 /]# yum install nginx -y
6.1.2 上傳代碼目錄并配置nginx配置文件
[root@0ede2760ba65 /]# scp -r 10.0.1.11:/data/* /opt/
[root@0ede2760ba65 /]# ll /opt/
total 18896
drwxr-xr-x 5 root root 73 Sep 7 16:02 game
-rw-r--r-- 1 root root 303 Sep 7 16:02 game.conf
-rw-r--r-- 1 root root 19248295 Sep 7 16:02 html5.zip
drwxr-xr-x 3 root root 92 Sep 7 16:02 xiaoniao
-rw-r--r-- 1 root root 91014 Sep 7 16:02 xiaoniaofeifei.zip
[root@0ede2760ba65 /]# cp /opt/game.conf /etc/nginx/conf.d/
6.1.3 將容器提交為新的鏡像
[root@docker01 ~]# docker ps -aq
0ede2760ba65
[root@docker01 ~]# docker commit 0ede2760ba65 game:v1
sha256:a61d28fbfe27ebe36d4b73825b55e5f94097083273ab56dccce0453ce2bd6d38
6.1.4 測(cè)試鏡像功能是否可用
[root@docker01 ~]# docker run -d -p 8080:8080 -p 8090:8090 game:v1 nginx -g 'daemon off;'
f58f209d4761c4bdd9bb164c0050a94a3273b1ee0e57eafe29e48b1517c72950
6.1.5 將新鏡像導(dǎo)出
docker save -o game_v1.tar game:v1
6.2 手動(dòng)制作云盤鏡像
6.2.1 創(chuàng)建容器
docker run -d -p 80:80 --name clould game:v1 nginx -g 'daemon off;'
6.2.2 進(jìn)入容器安裝php并求改運(yùn)行用戶
[root@d0c987bcefa2 /]# yum install php-fpm -y
[root@d0c987bcefa2 /]# php-fpm -v
PHP 5.4.16 (fpm-fcgi) (built: Oct 30 2018 19:32:20)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
[root@d0c987bcefa2 /]# sed -i '/^user/c user = nginx' /etc/php-fpm.d/www.conf
[root@d0c987bcefa2 /]# sed -i '/^group/c group = nginx' /etc/php-fpm.d/www.conf
[root@d0c987bcefa2 /]# sed -i '/daemonize/s#no#yes#g' /etc/php-fpm.conf
[root@d0c987bcefa2 /]# php-fpm -c /etc/php.ini -y /etc/php-fpm.conf
[root@d0c987bcefa2 /]# php-fpm -c /etc/php.ini -y /etc/php-fpm.conf
[root@d0c987bcefa2 /]# ps -ef|grep php
root 77 0 0 21:43 ? 00:00:00 php-fpm: master process (/etc/php-fpm.conf)
nginx 78 77 0 21:43 ? 00:00:00 php-fpm: pool www
nginx 79 77 0 21:43 ? 00:00:00 php-fpm: pool www
nginx 80 77 0 21:43 ? 00:00:00 php-fpm: pool www
nginx 81 77 0 21:43 ? 00:00:00 php-fpm: pool www
nginx 82 77 0 21:43 ? 00:00:00 php-fpm: pool www
6.2.3 配置nginx
[root@d0c987bcefa2 /]# cat /etc/nginx/conf.d/cloud.conf
server {
listen 80;
server_name localhost;
root /code;
index index.php index.html;
location ~ \.php$ {
root /code;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[root@d0c987bcefa2 /]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@d0c987bcefa2 /]# nginx -s reload
6.2.4 下載代碼目錄
[root@d0c987bcefa2 /]# mkdir /code
[root@d0c987bcefa2 /]# cd /code/
[root@d0c987bcefa2 code]# scp -r 10.0.1.11:/data/kod/* /code/
[root@d0c987bcefa2 code]# ls
ChangeLog.md README.MD app config data index.php plugins static
[root@d0c987bcefa2 code]# chown -R nginx:nginx /code/
6.2.5 測(cè)試
[root@d0c987bcefa2 code]# curl -I 127.0.0.1
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.16.1
Date: Sat, 07 Sep 2019 21:53:17 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
X-Powered-By: PHP/5.4.16
Set-Cookie: KOD_SESSION_ID_9d6d9=ljq63o0tmcscon6eb3gdpqscf4; path=/
Set-Cookie: KOD_SESSION_ID_9d6d9=ljq63o0tmcscon6eb3gdpqscf4; path=/
Set-Cookie: KOD_SESSION_ID_9d6d9=ljq63o0tmcscon6eb3gdpqscf4; path=/
Set-Cookie: KOD_SESSION_SSO=bboh1p0h1uc50tfibrg67dnra7; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: KOD_SESSION_ID_9d6d9=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/
Set-Cookie: kod_name=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT
Set-Cookie: kodToken=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT
Set-Cookie: X-CSRF-TOKEN=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT
Location: ./index.php?user/login
6.2.6 提交新的鏡像
[root@docker01 ~]# docker commit d0c987bcefa2 kod:v1
sha256:169df6e8db11bd044e3e05237f2947783f9cc7a65b643dc9206ecf05fdc4a3ea
6.2.7 編寫啟動(dòng)腳本并提交新鏡像
[root@docker01 ~]# docker exec -it c14835183fb5 /bin/bash
[root@c14835183fb5 /]# cat init.sh
#!/bin/bash
php-fpm -c /etc/php.ini -y /etc/php-fpm.conf
nginx -g 'daemon off;'
[root@c14835183fb5 /]# chmod +x init.sh
[root@docker01 ~]# docker commit c14835183fb5 kod:v2
sha256:c05ebdf400aa7f7a27aa857df0d9c75c42943db89abca66f79101771db8e9585
6.2.8 啟動(dòng)測(cè)試
[root@docker01 ~]# docker stop $(docker ps -qa)
[root@docker01 ~]# docker run -d -p 80:80 kod:v2 /bin/bash /init.sh
dccf4aea5471713872e4fefaca45f7fac3bffec8f5f602570863ed14231dea1a
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dccf4aea5471 kod:v2 "/bin/bash /init.sh" 36 seconds ago Up 35 seconds 0.0.0.0:80->80/tcp magical_napier
6.2.9 添加GD庫
此時(shí)打開頁面提示缺少GD庫,進(jìn)入容器內(nèi)安裝php支持插件
[root@dccf4aea5471 /]yum install php-mbstring php-gd -y
然后重啟容器
[root@docker01 ~]# docker restart dccf4aea5471
6.2.10 訪問測(cè)試沒問題后提交新鏡像
[root@docker01 ~]# docker commit dccf4aea5471 kod:v2
sha256:23051ce545a2eb6bb50bb2307bd9cfbaf6139e52f205a4126fb1d8d974c417f4
第7章 Dockerfile自動(dòng)構(gòu)建Docker鏡像
7.1 Dockerfile操作命令說明
Docker通過對(duì)于在Dockerfile中的一系列指令的順序解析實(shí)現(xiàn)自動(dòng)的image的構(gòu)建
通過使用build命令蛹疯,根據(jù)Dockerfiel的描述來構(gòu)建鏡像
通過源代碼路徑的方式
通過標(biāo)準(zhǔn)輸入流的方式
Dockerfile指令:
只支持Docker自己定義的一套指令戒财,不支持自定義
大小寫不敏感,但是建議全部使用大寫
根據(jù)Dockerfile的內(nèi)容順序執(zhí)行
FROM:
FROM {base鏡像}
必須放在DOckerfile的第一行捺弦,表示從哪個(gè)baseimage開始構(gòu)建
MAINTAINER:
可選的饮寞,用來標(biāo)識(shí)image作者的地方
RUN:
每一個(gè)RUN指令都會(huì)是在一個(gè)新的container里面運(yùn)行,并提交為一個(gè)image作為下一個(gè)RUN的base
一個(gè)Dockerfile中可以包含多個(gè)RUN列吼,按定義順序執(zhí)行
RUN支持兩種運(yùn)行方式:
RUN <cmd> 這個(gè)會(huì)當(dāng)作/bin/sh -c “cmd” 運(yùn)行
RUN [“executable”幽崩,“arg1”,寞钥。慌申。],Docker把他當(dāng)作json的順序來解析理郑,因此必須使用雙引號(hào)蹄溉,而且executable需要是完整路徑
RUN 都是啟動(dòng)一個(gè)容器、執(zhí)行命令您炉、然后提交存儲(chǔ)層文件變更柒爵。第一層 RUN command1 的執(zhí)行僅僅是當(dāng)前進(jìn)程,一個(gè)內(nèi)存上的變化而已赚爵,其結(jié)果不會(huì)造成任何文件餐弱。而到第二層的時(shí)候宴霸,啟動(dòng)的是一個(gè)全新的容器,跟第一層的容器更完全沒關(guān)系膏蚓,自然不可能繼承前一層構(gòu)建過程中的內(nèi)存變化瓢谢。而如果需要將兩條命令或者多條命令聯(lián)合起來執(zhí)行需要加上&&。如:cd /usr/local/src && wget xxxxxxx
CMD:
CMD的作用是作為執(zhí)行container時(shí)候的默認(rèn)行為(容器默認(rèn)的啟動(dòng)命令)
當(dāng)運(yùn)行container的時(shí)候聲明了command驮瞧,則不再用image中的CMD默認(rèn)所定義的命令
一個(gè)Dockerfile中只能有一個(gè)有效的CMD氓扛,當(dāng)定義多個(gè)CMD的時(shí)候,只有最后一個(gè)才會(huì)起作用
CMD定義的三種方式:
CMD <cmd> 這個(gè)會(huì)當(dāng)作/bin/sh -c "cmd"來執(zhí)行
CMD ["executable","arg1",....]
CMD ["arg1","arg2"]论笔,這個(gè)時(shí)候CMD作為ENTRYPOINT的參數(shù)
EXPOSE 聲明端口
格式為 EXPOSE <端口1> [<端口2>...]采郎。
EXPOSE 指令是聲明運(yùn)行時(shí)容器提供服務(wù)端口,這只是一個(gè)聲明狂魔,在運(yùn)行時(shí)并不會(huì)因?yàn)檫@個(gè)聲明應(yīng)用就會(huì)開啟這個(gè)端口的服務(wù)蒜埋。在 Dockerfile 中寫入這樣的聲明有兩個(gè)好處,一個(gè)是幫助鏡像使用者理解這個(gè)鏡像服務(wù)的守護(hù)端口最楷,以方便配置映射整份;另一個(gè)用處則是在運(yùn)行時(shí)使用隨機(jī)端口映射時(shí),也就是 docker run -P 時(shí)籽孙,會(huì)自動(dòng)隨機(jī)映射 EXPOSE 的端口烈评。
entrypoint:
entrypoint的作用是,把整個(gè)container變成了一個(gè)可執(zhí)行的文件犯建,這樣不能夠通過替換CMD的方法來改變創(chuàng)建container的方式讲冠。但是可以通過參數(shù)傳遞的方法影響到container內(nèi)部
每個(gè)Dockerfile只能夠包含一個(gè)entrypoint,多個(gè)entrypoint只有最后一個(gè)有效
當(dāng)定義了entrypoint以后适瓦,CMD只能夠作為參數(shù)進(jìn)行傳遞
entrypoint定義方式:
entrypoint ["executable","arg1","arg2"]竿开,這種定義方式下,CMD可以通過json的方式來定義entrypoint的參數(shù)玻熙,可以通過在運(yùn)行container的時(shí)候通過指定command的方式傳遞參數(shù)
entrypoint <cmd>否彩,當(dāng)作/bin/bash -c "cmd"運(yùn)行命令
ADD & COPY:
當(dāng)在源代碼構(gòu)建的方式下,可以通過ADD和COPY的方式揭芍,把host上的文件或者目錄復(fù)制到image中
ADD和COPY的源必須在context路徑下
當(dāng)src為網(wǎng)絡(luò)URL的情況下胳搞,ADD指令可以把它下載到dest的指定位置卸例,這個(gè)在任何build的方式下都可以work
ADD相對(duì)COPY還有一個(gè)多的功能称杨,能夠進(jìn)行自動(dòng)解壓壓縮包
ENV:
ENV key value
用來設(shè)置環(huán)境變量,后續(xù)的RUN可以使用它所創(chuàng)建的環(huán)境變量
當(dāng)創(chuàng)建基于該鏡像的container的時(shí)候筷转,會(huì)自動(dòng)擁有設(shè)置的環(huán)境變量
WORKDIR:
用來指定當(dāng)前工作目錄(或者稱為當(dāng)前目錄)
當(dāng)使用相對(duì)目錄的情況下姑原,采用上一個(gè)WORKDIR指定的目錄作為基準(zhǔn)
USER:
指定UID或者username,來決定運(yùn)行RUN指令的用戶
ONBUILD:
ONBUILD作為一個(gè)trigger的標(biāo)記呜舒,可以用來trigger任何Dockerfile中的指令
可以定義多個(gè)ONBUILD指令
當(dāng)下一個(gè)鏡像B使用鏡像A作為base的時(shí)候锭汛,在FROM A指令前,會(huì)先按照順序執(zhí)行在構(gòu)建A時(shí)候定義的ONBUILD指令
ONBUILD <DOCKERFILE 指令> <content>
VOLUME:
用來創(chuàng)建一個(gè)在image之外的mount point,用來在多個(gè)container之間實(shí)現(xiàn)數(shù)據(jù)共享
運(yùn)行使用json array的方式定義多個(gè)volume
VOLUME ["/var/data1","/var/data2"]
或者plain text的情況下定義多個(gè)VOLUME指令
7.2 使用Dockerfile創(chuàng)建云盤
7.2.1 準(zhǔn)備需要的文件
[root@docker01 ~/dockerfile/kod]# ls
CentOS-Base.repo cloud.conf dockerfile epel.repo init.sh kodexplorer4.40.zip nginx.repo
7.2.2 編寫dockerfile
[root@docker01 ~/dockerfile/kod]# cat dockerfile
FROM centos:latest
ADD CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo
ADD epel.repo /etc/yum.repos.d/epel.repo
ADD nginx.repo /etc/yum.repos.d/nginx.repo
RUN yum install nginx php-fpm unzip php-gd php-mbstring -y
RUN rm -rf /etc/nginx/conf.d/default.conf
RUN sed -i '/^user/c user = nginx' /etc/php-fpm.d/www.conf
RUN sed -i '/^group/c group = nginx' /etc/php-fpm.d/www.conf
RUN sed -i '/daemonize/s#no#yes#g' /etc/php-fpm.conf
ADD cloud.conf /etc/nginx/conf.d/cloud.conf
RUN mkdir /code
WORKDIR /code
ADD kodexplorer4.40.zip /code/kodexplorer4.40.zip
RUN unzip kodexplorer4.40.zip
RUN chown -R nginx:nginx .
VOLUME /code
ADD init.sh /init.sh
EXPOSE 80
CMD ["/bin/bash","/init.sh"]
7.2.3 構(gòu)建新鏡像
[root@docker01 ~/dockerfile/kod]# docker build --network=host -t centos_kod:v1 .
[root@docker01 ~/dockerfile/kod]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_kod v1 87071ea7c86b 2 minutes ago 465MB
7.2.4 基于新鏡像運(yùn)行容器
[root@docker01 ~/dockerfile/kod]# docker run -d -p 80:80 centos_kod:v1
4d1007d7194d434248762e5aca76070206643f0f0f533f2112d0359b25fe7ba0
第8章 Docker私有倉庫
8.1 普通的docker registry
8.2 帶認(rèn)證的docker registry
8.3 企業(yè)級(jí)的docker-harbor
8.3.1 部署思路
第一步:安裝docker和docker-compose
第二步:下載harbor-offline-installer-v1.9.0-rc1.tgz
第三步:上傳到/opt,并解壓
第四步:修改harbor.yml配置文件 hostname = 10.0.0.11 harbor_admin_password = 123456
第五步:執(zhí)行install.sh
8.3.2 安裝docker-compose
1.安裝docker-compose
yum install -y python2-pip
2.這里使用pip安裝唤殴,默認(rèn)源為國外般婆,可以使用國內(nèi)加速,相關(guān)網(wǎng)站
https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
pip加速操作命令
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
3.繼續(xù)安裝docker-compose
pip install docker-compose
4.檢查
docker-compose version
8.3.3 上傳解壓docker-harbor
[root@docker01 ~]# cd /opt/
[root@docker01 /opt]# ls
harbor-offline-installer-v1.9.0-rc1.tgz
[root@docker01 /opt]# tar zxf harbor-offline-installer-v1.9.0-rc1.tgz
[root@docker01 /opt]# ls
harbor harbor-offline-installer-v1.9.0-rc1.tgz
[root@docker01 /opt]# cd harbor/
8.3.4 修改配置文件
修改2個(gè)地方:
[root@docker01 /opt/harbor]# egrep "10.0.1.11|123456" harbor.yml
hostname: 10.0.1.11
harbor_admin_password: 123456
8.3.5 安裝
[root@docker01 /opt/harbor]# ./install.sh
8.3.6 修改docker信任倉庫
[root@docker01 /opt/harbor]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"insecure-registries": ["http://10.0.1.11"]
}
8.3.7 重啟docker并上傳鏡像
systemctl restart docker
8.3.8 給鏡像打標(biāo)簽并提交到dockerharbor
[root@docker01 /opt/harbor]# docker login 10.0.1.11
Username: zhangya
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@docker01 ~]# docker run -d -p 8080:80 centos_kod:v1
78be80f7c2029b68e8943e38fa99131ec6709f798e63c94afb5a7fdfa4a8047c
[root@docker01 ~]# docker ps|grep kod
78be80f7c202 centos_kod:v1 "/bin/bash /init.sh" 15 seconds ago Up 13 seconds 0.0.0.0:8080->80/tcp tender_dirac
[root@docker01 ~]# docker commit 78be80f7c202 10.0.1.11/linux/centos_kod:v1
sha256:6bf1e1eef1969bcd4c82472aed945d4dda74a923c0d7dae91e38539676f8c240
[root@docker01 ~/dockerfile/kod]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.1.11/linux/centos_kod v1 6bf1e1eef196 13 minutes ago 465MB
[root@docker01 /opt/harbor]# docker push 10.0.1.11/linux/centos_kod:v1
8.3.9 在docker-harbor上查看
8.3.10 其他主機(jī)上下載鏡像
[root@docker02 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"insecure-registries": ["http://10.0.1.11"],
"insecure-registries": ["https://10.0.1.11"]
}
[root@docker02 ~]# docker pull 10.0.1.11/linux/centos_kod:v1