1. Docker是什么熬甚?
Docker是一個(gè)用來裝應(yīng)用的容器蜜自,就好比用書包來裝書诅病,用水杯來裝水讽膏,你可以把你想到的任何應(yīng)用程序放到Docker里
2. Docker特點(diǎn)
2.1 組織有序性
以傳統(tǒng)方式部署應(yīng)用,可能會(huì)出現(xiàn)兩個(gè)應(yīng)用依賴同一程序的不同版本棚瘟。使用Docker可以方便管理各個(gè)應(yīng)用的的依賴现斋,并以容器為基礎(chǔ)將各個(gè)應(yīng)用的運(yùn)行環(huán)境獨(dú)立開來,從而不會(huì)相互影響偎蘸,還能提高資源利用率
2.2 便捷性
應(yīng)用的后期遷移庄蹋,大規(guī)模集群都非常的方便
2.3 安全性
容器的資源和系統(tǒng)是隔離的
Docker VS VM
類別 | Docker | VM |
---|---|---|
操作系統(tǒng) | 與宿主機(jī)功效OS | 在宿主機(jī)OS運(yùn)行虛擬OS |
部署難度 | 非常簡(jiǎn)單 | 組件多,部署復(fù)雜 |
啟動(dòng)速度 | 秒級(jí) | 分鐘級(jí) |
執(zhí)行性能 | 與物理系統(tǒng)幾乎一致 | VM會(huì)占用一些資源 |
鏡像體積 | MB | GB |
管理效率 | 管理簡(jiǎn)單 | 組件相互依賴迷雪,管理復(fù)雜 |
隔離性 | 比較弱 | 徹底 |
資源消耗 | 很小限书,輕松創(chuàng)建多個(gè)容器 | 很大 |
操作系統(tǒng)覆蓋 | 僅僅是內(nèi)核所支持的OS | 支持Linux、Mac章咧、Window等 |
3. Container的核心技術(shù)
3.1 CGroup限制容器的資源使用
Linux內(nèi)核提供的限制,記錄和隔離進(jìn)程組所使用的資源.由Google的工程師提出,后臺(tái)被整合到內(nèi)核中.
通過不同的子系統(tǒng)來實(shí)現(xiàn)對(duì)不同資源使用的控制和記錄.
/sys/fs/cgroup
3.2 Namespace機(jī)制,實(shí)現(xiàn)容器間的隔離
pid:容器有自己獨(dú)立的進(jìn)程表和1號(hào)線程.
net:容器有自己獨(dú)立的network info
ipc:在ipc通信的時(shí)候,需要加入額外信息來標(biāo)示進(jìn)程
mnt:每個(gè)容器都有自己唯一的目錄掛載
utc:每個(gè)容器都有獨(dú)立的hostname和domain
3.3 chroot,文件系統(tǒng)的隔離.
在宿主機(jī)中的某個(gè)目錄就是容器中的根目錄
4 容器的基本概念
docker三大重要概念:倉(cāng)庫倦西、鏡像、容器
4.1 倉(cāng)庫(repository)
倉(cāng)庫適用于存放鏡像的地方赁严,類似于Maven扰柠、git倉(cāng)庫等。一個(gè)倉(cāng)庫注冊(cè)服務(wù)器(Registry)用多個(gè)倉(cāng)庫疼约,一個(gè)倉(cāng)庫有多個(gè)鏡像卤档,一個(gè)鏡像有多個(gè)標(biāo)簽(tag),目前最大的公開倉(cāng)庫是Docker Hub
4.2 鏡像(Image)
可以理解為一個(gè)只讀模板程剥,鏡像可以用來創(chuàng)建倉(cāng)庫劝枣,一個(gè)鏡像可以創(chuàng)建多個(gè)容器,也可以從官方倉(cāng)庫(docker hub)或者其他私服倉(cāng)庫拉瘸(pull)想要的鏡像哨免,或者通過哦Dockerfile文件來構(gòu)建屬于自己的鏡像
4.3 容器(Container)
容器是由鏡像創(chuàng)建的實(shí)例,可以被啟動(dòng)昙沦、停止、運(yùn)行载荔、刪除盾饮。每個(gè)容器相互隔離,也可以把容器看做一個(gè)簡(jiǎn)單的Linux環(huán)境
5. 安裝Docker
Docker安裝相對(duì)簡(jiǎn)單懒熙,不過官方要求CentOS操作系統(tǒng)內(nèi)核(uname -r)必須在3.10以上丘损,我這里使用CentOS7來安裝
1. 更新yum倉(cāng)庫,確保yum包都是最新的
yum update
2. 檢查是否安裝過Docker工扎,若有將其刪除
yum list installed | grep docker
yum remove docker...#如果有則刪除
3. 安裝需要的軟件包徘钥,yum-util 提供 yum-config-manager 功能,另外兩個(gè)是 devicemapper 驅(qū)動(dòng)依賴的
yum install -y yum-utils device-mapper-persistent-data lvm2
4. 設(shè)置 yum 源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5. 查看倉(cāng)庫中所有 docker 版本肢娘,選擇你需要的版本安裝
yum list docker-ce --showduplicates | sort -r
6. 安裝 docker
yum install -y docker-ce
7. 設(shè)置 docker 開機(jī)自動(dòng)啟動(dòng)
systemctl start docker # 啟動(dòng) docker 服務(wù)端
systemctl enable docker # 啟用 docker 服務(wù)開機(jī)自啟
8. 校驗(yàn) docker 是否啟動(dòng)成功
docker version
6. 容器的基本操作
6.1. 啟動(dòng)容器
docker run IMAGE [COMMAND] [ARGS]
docker run centos echo 'hello docker'
run 命令解釋:
?? 1.1. 命令會(huì)檢查當(dāng)前要運(yùn)行的鏡像在本地存不存在,若不存在他會(huì)自動(dòng) pull 下來再運(yùn)行
?? 1.2. 運(yùn)行后會(huì)啟動(dòng)一個(gè)容器, 并且開啟一個(gè)文件系統(tǒng), 你可以直接在容器內(nèi)創(chuàng)建文件夾. 運(yùn)行一個(gè)指定的程序, 當(dāng)程序退出后, 容器也就退出了
?? 1.3. 運(yùn)行時(shí)的容器無法刪除, 只能停止后刪除, 或者加上 -f 參數(shù)強(qiáng)制刪除
6.2. 啟動(dòng)守護(hù)式容器
1.docker run --name 自定義容器名稱 -it IMAGE /bin/bash
2.docker run --name 自定義容器名稱 -itd IMAGE /bin/bash
參數(shù)說明:
?? --name
給容器取一個(gè)自定義的名稱
?? -i
交互式操作
?? -t
終端
?? -d
默認(rèn)不會(huì)進(jìn)入容器
?? /bin/bash
交互式Shell
6.3. 退出容器
進(jìn)入容器使用:
-
docker attach '容器的名稱 | 容器的唯一標(biāo)識(shí)'
??Ctrl+PQ
退出不關(guān)閉容器
??exit
退出關(guān)閉容器 -
docker exec -it '容器的名稱 | 容器的唯一標(biāo)識(shí)' /bin/bash
(推薦使用)
??Ctrl+PQ
退出不關(guān)閉容器
??exit
退出不關(guān)閉容器
6.4 查看容器
docker ps [-a] [-l]
參數(shù)說明:
?? -a
列舉所有容器
?? -l
列舉最近創(chuàng)建的容器
默認(rèn)情況下容器運(yùn)行之后歐就停止了呈础,ps只顯示正在運(yùn)行的容器
6.5 查看容器詳細(xì)信息
docker inspect [容器的名稱 | 容器的唯一標(biāo)識(shí)]
6.6 重新啟動(dòng)停止的容器
docker start [-i] 容器名
6.7 刪除停止的容器
docker rm 容器名
docker rm $(docker ps -qa)
刪除所有
6.8 查看容器日志
docker logs [-f] [-t] [--tail] 容器名
參數(shù)說明:
?? -f
--follow=true|false 默認(rèn)為false 一致跟蹤日志的變化,并返回結(jié)果
?? -t
--timestamps=true|false 默認(rèn)為false 在返回的結(jié)果上加上時(shí)間戳
?? --tail
= “all” 返回后幾行的日志數(shù)據(jù)
6.9 查看容器內(nèi)的進(jìn)程
docker top 容器名
6.10 在運(yùn)行的容器內(nèi)啟動(dòng)新的進(jìn)程
docker exec -itd 容器名 [command] [arg...]
如下圖舆驶,關(guān)閉和啟動(dòng)Nginx
6.11 停止守護(hù)式容器
docker stop 容器名
發(fā)送一個(gè)信號(hào)給容器,等待容器的關(guān)閉
docker kill 容器名
直接停止容器
7 部署靜態(tài)網(wǎng)站
7.1 設(shè)置容器的端口映射
run [-P] [-p]
參數(shù)說明:
1 -P
, --publish-all=true|false 默認(rèn)為false :將為容器所有暴露的端口進(jìn)行映射而钞,容器內(nèi)部使用的網(wǎng)絡(luò)端口映射到我們使用的主機(jī)上
示例:docker run -P -i -t centos /bin/bash
2 -p
, --publish=[] :給指定的端口進(jìn)行映射
docker run -p 80 centos /bin/bash
:containerPort
docker run -p 8080:80 centos /bin/bash
:hostPort:containerPort
7.2 部署Nginx
- 創(chuàng)建一個(gè)守護(hù)式容器,并映射容器的80端口
docker run -p 80 --name 名稱 -it centos:7 /bin/bash
- 進(jìn)入容器后,需要安裝nginx和vim,執(zhí)行如下命令
yum install -y vim
yum install -y wget
#修改centos鏡像倉(cāng)庫
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#安裝Nginx
yum install -y epel-release
yum install -y nginx
#運(yùn)行Nginx
/usr/sbin/nginx
#退出容器
Ctrl+PQ
在宿主機(jī)中使用curl命令查看是否能訪問
curl http://127.0.0.1:32769/index.html
注意:
當(dāng)容器重新啟動(dòng)會(huì)重新給我們進(jìn)行端口映射
8 Docker鏡像和倉(cāng)庫
Docker Image鏡像:1. 容器的基石沙廉,2.層疊的只讀文件系統(tǒng),3.聯(lián)合加載
-
docker images [OPTIONS] [REPOSITORY]
:列出鏡像
參數(shù)說明:
??-a
, --all=false :表示列舉出所有的鏡像.默認(rèn)并不顯示中間層的鏡像.
??-f
, --filter=[] :表示添加過濾條件.
??--no-trunc=false
:表示對(duì)信息進(jìn)行截?cái)?默認(rèn)情況是會(huì)截?cái)噻R像的唯一id的.
??-q
, --quiet=false:表示值顯示鏡像的唯一id
REPOSITORY 倉(cāng)庫
:是一切鏡像的集合
REGISTRY 注冊(cè)倉(cāng)庫
:包含REPOSITORY的倉(cāng)庫
TAG 標(biāo)簽
:之前運(yùn)行的centos默認(rèn)使用lastest的標(biāo)簽臼节。倉(cāng)庫名+標(biāo)簽就能唯一確定一個(gè)鏡像
如果使用docker images -a 看到?jīng)]有倉(cāng)庫名和標(biāo)簽名的其實(shí)是中間層鏡像 -
docker inspect [OPTIONS] CONTAINER | IMAGE [CONTAINER | IMAGE...]
:查看鏡像 -
docker rmi [OPTIONS] IMAGE [IMAGE...]
:刪除鏡像 -
docker rmi $(docker image -q centos)
:刪除對(duì)應(yīng)倉(cāng)庫的所有鏡像
參數(shù)說明:
??-f
, --force=false :表示強(qiáng)制刪除鏡像.
??--no-proune
=false :會(huì)保留未被打標(biāo)簽的父鏡像
9 獲取和推送鏡像
Docker中REGISTER倉(cāng)庫有些類似Maven的中央倉(cāng)庫.我們通過類似Git中的pull和push命令從REGISTER倉(cāng)庫中拉取鏡像和推送鏡像
- 查找鏡像
?? 方式一:
?? ?? Docker Hub:http://hub.docker.com/
?? 方式二:
?? ??docker search [OPTIONS] TERM
?? ?? -no-trunc=false : 截?cái)嗖僮?br> ?? ?? -s,--starts=0 : 每個(gè)鏡像都會(huì)有star,我們可以通過-s操作來限定star數(shù) - 獲取鏡像
??docker pull [OPTIONS] name[:TAG]
?? 示例: docker pull centos:7
可以發(fā)現(xiàn)下載速度非常慢撬陵,這時(shí)可以是用鏡像加速器(daocloud或者阿里云-控制臺(tái)-搜索鏡像加速器-按照說明配置)
- 推送鏡像
docker push 鏡像名
步驟:
?? 1. 注冊(cè)hub賬號(hào)
2.登陸hub的賬號(hào).docker login
3.使用push命令推送到hub中
10 構(gòu)建鏡像
- 方式一:
docker commit -m='描述信息' -a='作者' srcDockerID desDockerName:version
- 方式二:
docker build [OPTIONS] PATH|URL|-
--force-rm=false
--no-cache=false
--pull=false
-q, --quiet=false
-rm=true
-t, --tag=””
使用Dockerfile構(gòu)建鏡像的步驟:
??1. 在宿主機(jī)中,創(chuàng)建存放Dockerfile文件的目錄和Dockerfile文件
??mkdir -p dockerfile/df_test1/
??cd dockerfile/df_test1/
??vi Dockerfile
??2. 編寫Dockfile文件
# First docker file for test
FROM centos
MAINTAINER xxx "lxxx"
RUN yum install -y wget
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum install -y epel-release
RUN yum install -y nginx
EXPOSE 80
?? 3. 使用build命令構(gòu)建鏡像
?? docker build -t='df_test1'
?? 4. 通過構(gòu)建好的鏡像來創(chuàng)建容器
?? docker run -d --name nginx_web3 -p 80 df_test1 /usr/sbin/nginx -g "daemon off;"
11 Dockerfile指令格式
指令主要分為兩種:
注釋 : # Comment
指令 : INSTRUCTION argument
FROM:
包含兩種格式:
1. FROM <image>
2. FROM <image>:<tag>
image要求是已經(jīng)存在的鏡像,我們也稱為基礎(chǔ)鏡像.必須是第一條非注釋指令
MAINTAINER:
指定鏡像的作者信息,包含鏡像的所有者和聯(lián)系信息.
RUN:
指定當(dāng)前鏡像中運(yùn)行的命令
RUN <command> (shell模式)
/bin/sh -c command
RUN echo hello
RUN [“executable”,”param1”,”param2”] (exec模式)
RUN [“/bin/bash”,”-c”,”echo hello”]
每個(gè)RUN命令都會(huì)在當(dāng)前鏡像的上層創(chuàng)建一個(gè)新的鏡像來運(yùn)行指令.
EXPOSE:
指定運(yùn)行該鏡像的容器使用的端口.
雖然我們?cè)跇?gòu)建鏡像的時(shí)候暴露了端口號(hào),但是我們?cè)谶\(yùn)行容器的時(shí)候依然需要指定端口的映射.
我們使用EXPOSE只是告訴Docker運(yùn)行該鏡像的容器會(huì)使用80端口,出于安全的考慮,docker并不會(huì)打開該端口.
而是需要我們?cè)谑褂迷撶R像運(yùn)行容器的時(shí)候指定端口的映射.
CMD:
CMD指令提供容器默認(rèn)運(yùn)行的命令,和之前講的RUN指令類似.都是執(zhí)行一個(gè)命令,但是RUN命令指定的命令是在鏡像構(gòu)建的過程運(yùn)行的.
CMD的命令是在容器運(yùn)行的時(shí)候運(yùn)行的.如果我們?cè)赿ocker run命令中指定運(yùn)行的命令的時(shí)候,CMD的指令會(huì)被覆蓋,默認(rèn)命令就不會(huì)執(zhí)行.
CMD命令是指定容器啟動(dòng)的時(shí)候默認(rèn)命令.
兩種模式.
CMD [“executable”,”param1”,”param2”] (exec模式)
CMD command param1 param2 (shell 模式)
CMD [”param1”,”param2”] (作為ENTRYPOINT指令的默認(rèn)參數(shù).)
示例:
通過構(gòu)建的鏡像來創(chuàng)建容器
docker run -p 80 --name cmd_test1 -itd df_test3
docker top cmd_test1
發(fā)現(xiàn)已經(jīng)啟動(dòng)nginx了.
如果我們?cè)趩?dòng)的時(shí)候指定了參數(shù),默認(rèn)的CMD命令就會(huì)被覆蓋了.
ENTRYPOINT:
這個(gè)和我們剛剛講的CMD指令非常相似,唯一的區(qū)別:不會(huì)給docker run的啟動(dòng)命令給覆蓋.
如果需要覆蓋ENTRYPOINT的指令,需要在docker run使用docker run --entrypoint覆蓋.
ENTRYPOINT [“executable”,”param1”,”param2”] (exec模式)
ENTRYPOINT command param1 param2 (shell 模式)
示例:
docker build -t="df_test4" .
docker run -p 80 --name ep_test1 -d df_test4
docker ps -l
可以發(fā)現(xiàn),啟動(dòng)的容器依然使用的ENTRYPOINT指定的命令執(zhí)行.
ADD:
將文件和目錄復(fù)制到使用dockerfile構(gòu)建的鏡像中.
目標(biāo)的來源可以本地的地址也可以是遠(yuǎn)程地址.
如果是本地地址,本地地址必須是構(gòu)建目錄中的相對(duì)地址
對(duì)于遠(yuǎn)程URL,docker并不推薦使用,更建議使用的是curl或者wget的命令來獲取
目標(biāo)路徑需要指定鏡像中的絕對(duì)路徑
ADD <src>...<dest>
ADD [“<src>”...”<dest>”](適用于文件路徑有空格的情況)
COPY:
同上.
COPY<src>...<dest>
COPY[“<src>”...”<dest>”](適用于文件路徑有空格的情況)
示例:
在Dockerfile所在目錄添加index.html文件
docker build -t="df_test6" .
docker run -p 80 --name add_test1 -d df_test6
curl http://127.0.0.1:32775
VOLUME:
用于基于鏡像創(chuàng)建的容器添加卷,一個(gè)卷可以存在一個(gè)或者多個(gè)容器的特定目錄.這個(gè)目錄可以繞過聯(lián)合文件系統(tǒng).提供共享數(shù)據(jù)和持久化數(shù)據(jù)的 功能.(后面單獨(dú)講)
WORKDIR:
WORKDIR /path/to/workdir
這個(gè)指令從指令創(chuàng)建一個(gè)容器是,在容器內(nèi)部設(shè)置工作目錄.ENTRYPOINT和CMD的命令都會(huì)在這個(gè)目錄下執(zhí)行.
我們也可以使用這個(gè)命令給后續(xù)的構(gòu)建中指定工作目錄.
通常會(huì)使用絕對(duì)路徑,如果使用了相對(duì)路徑,那這個(gè)路徑會(huì)一致傳遞下去.如下所示:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
結(jié)果====>/a/b/c
ENV:
ENV <key><value>
ENV <key><value>...
這個(gè)指令主要是來設(shè)置環(huán)境變量,這個(gè)環(huán)境變量在構(gòu)建過程中和運(yùn)行過程中都有效.
USER:
USER daemon
指定鏡像會(huì)以什么樣的用戶去運(yùn)行.
比如:USER nginx
基于該鏡像啟動(dòng)的容器就會(huì)以nginx的用戶來運(yùn)行.
如果沒有指定USER,容器會(huì)使用root用戶來運(yùn)行.
ONBUILD:
ONBUILD [INSTRUCTION]
鏡像觸發(fā)器.
當(dāng)一個(gè)鏡像被其他鏡像作為基礎(chǔ)鏡像時(shí)執(zhí)行
會(huì)在構(gòu)建過程中插入指令
示例:
docker run -p 80 --name onbuild_test1 -d df_test7
curl http://127.0.0.1:32776
發(fā)現(xiàn)在構(gòu)建這個(gè)鏡像的時(shí)候并沒有執(zhí)行COPY命令.
接下來我們基于這個(gè)鏡像來構(gòu)建新的鏡像.
docker build -t="df_test8" .
docker run -p 80 --name onbuild_test2 -d df_test8
curl http://127.0.0.1:32777
此時(shí)發(fā)現(xiàn)已經(jīng)執(zhí)行COPY命令了.
12 Dockerfile構(gòu)建過程
- 從基礎(chǔ)鏡像運(yùn)行一個(gè)容器.
- 執(zhí)行一條指令,對(duì)容器做出修改.
- 執(zhí)行類似docker commit 的操作,提交一個(gè)新的鏡像層.
- 再基于剛提交的鏡像運(yùn)行一個(gè)新容器.
- 執(zhí)行Dockerfile中的下一條指令,直到所有指令執(zhí)行完畢.
docker build會(huì)刪除中間層創(chuàng)建的容器,但是不會(huì)刪除中間層創(chuàng)建的鏡像.我們可以使用docker run 的方式來運(yùn)行中間層鏡像.從而查看每一步創(chuàng)建后的鏡像的實(shí)際狀態(tài),這就給了我們調(diào)試鏡像的能力.
docker會(huì)把之前創(chuàng)建過的中間層鏡像建立成緩存,第二次構(gòu)建的時(shí)候其實(shí)就直接中緩存中拿到中間層的鏡像.但是有些時(shí)候我們不想使用緩存.
docker build --no-cache
13 容器的網(wǎng)絡(luò)基礎(chǔ)
docker有四種網(wǎng)絡(luò)模式网缝。分別是:bridge模式巨税、host模式、container模式粉臊、none模式垢夹。
在容器運(yùn)行時(shí),添加一下參數(shù):
?? -net bridge | host | container | none 選擇其中一種
bridge模式:
容器中的環(huán)境與宿主機(jī)隔離维费,那么此時(shí)容器內(nèi)與外部進(jìn)行網(wǎng)絡(luò)通信就會(huì)有些問題果元,外部不能直接訪問容器內(nèi)的IP地址和端口。
docker 為我們提供了宿主機(jī)的端口與容器內(nèi)的端口映射來解決此問題犀盟,方式有兩種而晒,一種是隨機(jī)映射,一種是指定映射阅畴。
docker run --name doc-test -it -p 8080:8080 -p 80:80 centos /bin/bash
host模式
如果啟動(dòng)容器的時(shí)候使用host模式倡怎,那么容器將不會(huì)虛擬出自己的網(wǎng)卡,配置自己的IP等贱枣,而是使用宿主機(jī)的IP和端口监署。但是,容器的其他方面纽哥,如文件系統(tǒng)钠乏、進(jìn)程列表等還是和宿主機(jī)隔離的
container模式
這個(gè)模式指定新創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的 IP春塌,而是和一個(gè)指定的容器共享 IP晓避、端口范圍等。同樣只壳,兩個(gè)容器除了網(wǎng)絡(luò)方面俏拱,其他的如文件系統(tǒng)、進(jìn)程列表等還是隔離的
none模式
使用none模式吼句,Docker容器不會(huì)進(jìn)行任何網(wǎng)絡(luò)配置锅必。也就是說,這個(gè)Docker容器沒有網(wǎng)卡惕艳、IP搞隐、路由等信息驹愚。需要我們自己為Docker容器添加網(wǎng)卡、配置IP等
14 容器之間相互連接
Docker容器互聯(lián)的默認(rèn)方式,在同一宿主機(jī)上,docker容器是通過虛擬網(wǎng)橋來進(jìn)行連接的.在默認(rèn)情況下,在同一宿主機(jī)中的所有容器都是可以互相連接的尔许。但是么鹤,重啟容器發(fā)現(xiàn),容器的地址并不是固定的,如果在容器內(nèi)部使用的服務(wù)是以地址的方式連接的,可能在容器重啟的時(shí)候就會(huì)失效.所以通過地址連接是不可靠的.docker為了避免這種情況,提供了另外一種方式
docker run --link=[CONTAINER_NAME]:[ALIAS] [IMAGE] [COMMAND]
:這樣就可以通過別名來訪問,避免了ip訪問
15 容器的數(shù)據(jù)管理
什么是數(shù)據(jù)卷(Data Volume):
我們都知道Docker其中一個(gè)理念就是應(yīng)用和環(huán)境打包.通常docker容器的生命周期都是和容器中的應(yīng)用是一致的.而我們對(duì)數(shù)據(jù)的要求是持久化,另外docker容器之間也需要有一個(gè)共享數(shù)據(jù)的渠道.這些需求就催生了數(shù)據(jù)卷的需求.
數(shù)據(jù)卷是經(jīng)過特殊設(shè)計(jì)的目錄,可以繞過聯(lián)合文件系統(tǒng)(UFS),為一個(gè)或者多個(gè)容器提供訪問.
數(shù)據(jù)卷設(shè)計(jì)的目的,在于數(shù)據(jù)的永久化,它完全獨(dú)立與容器的生命周期,因此Docker不會(huì)在容器刪除的時(shí)候刪除其關(guān)聯(lián)的數(shù)據(jù)卷,也不會(huì)存在類似垃圾收集機(jī)制,對(duì)容器應(yīng)用的數(shù)據(jù)卷進(jìn)行處理
為容器添加數(shù)據(jù)卷:
docker run -v ~/container_data:/data -it centos /bin/bash
為數(shù)據(jù)卷添加訪問權(quán)限
docker run -v ~/datavolume:/data:ro -it centos /bin/bash
使用Dockerfile構(gòu)建包含數(shù)據(jù)卷的鏡像
Dockerfile指令:VOLUME[“/data”]
示例:
# Test
FROM centos
VOLUME ["/datavolume1","/datavolume2"]
CMD /bin/bash
執(zhí)行構(gòu)建命令: docker build -t doc:0.01
16 多容器管理(docker-compose)
Dockerfile 用來構(gòu)建 Docker 鏡像味廊,那么 docker-compose 則是用來創(chuàng)建容器的蒸甜。 Docker 有三個(gè)主要的功能:Build、Ship 和 Run余佛,使用 docker-compose 可以幫我們?cè)?Run 的層面解決很多實(shí)際問題柠新。docker-compose 通過一個(gè) yaml 模板文件來統(tǒng)一管理多個(gè)容器的配置,如網(wǎng)絡(luò)辉巡、數(shù)據(jù)卷恨憎、執(zhí)行指令、環(huán)境變量郊楣、資源限制等等憔恳。有了 docker-compose 我們便可以一鍵重啟、關(guān)閉净蚤、刪除钥组、監(jiān)控所有的 docker 服務(wù),只需要一次配置今瀑,則可以對(duì)容器進(jìn)行統(tǒng)一管理程梦,那么此時(shí)我們則不必為了每次要運(yùn)行一堆容器時(shí)寫大量的命令而頭疼。
- docker-compose安裝
1橘荠、安裝python-pip
yum -y install epel-release
yum -y install python-pip
2屿附、安裝docker-compose
pip install --ignore-installed docker-compose
待安裝完成后,執(zhí)行查詢版本的命令確認(rèn)安裝成功
docker-compose version
- 配置docker-compose.yml文件
version: '3' # docker 的版本
services: # 配置的容器列表
CONTAINER_NAME: # 容器的名稱
image: BASE_IMAGE # 這個(gè)一個(gè)容器的基礎(chǔ)鏡像
ports: # 你的容器需不需要做端口映射
- "host_port:container_port"
volumes: # 數(shù)據(jù)卷配置
- host_dir:container_dir
environment: # 環(huán)境變量(map 的配置方式 key: value)
PARAM: VALUE
environments: # 環(huán)境變量(數(shù)組的配置方式 - key=value)
- PARAM=VALUE
restart: always # 容器的重啟策略
dns: # dns 的配置
- "8.8.8.8"
------------------------------------------------------------------
restart 容器的重啟策略:
no:默認(rèn)策略哥童,在容器退出時(shí)不重啟容器
on-failure:在容器非正常退出時(shí)(退出狀態(tài)非0)挺份,才會(huì)重啟容器
on-failure:3:在容器非正常退出時(shí)重啟容器,最多重啟3次
always:在容器退出時(shí)總是重啟容器
unless-stopped:在容器退出時(shí)總是重啟容器,但是不考慮在Docker守護(hù)進(jìn)程啟動(dòng)時(shí)就已經(jīng)停止了的容器
- 常用命令
docker-compose up -d # 啟動(dòng)所有服務(wù)并在后臺(tái)運(yùn)行
docker-compose ps # 查看服務(wù)運(yùn)行狀態(tài)
docker-compose restart # 重啟所有服務(wù)
docker-compose restart myApp # 重啟 myApp 服務(wù)
docker-compose start # 開啟所有服務(wù)
docker-compose start myApp # 開啟 myApp 服務(wù)
docker-compose stop # 停止所有服務(wù)
docker-compose stop myApp # 停止 myApp 服務(wù)
docker-compose rm # 刪除所有服務(wù)
docker-compose rm myApp # 刪除 myApp 服務(wù)