Docker學(xué)習(xí)

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)入容器使用:

  1. docker attach '容器的名稱 | 容器的唯一標(biāo)識(shí)'
    ?? Ctrl+PQ 退出不關(guān)閉容器
    ?? exit 退出關(guān)閉容器
  2. docker exec -it '容器的名稱 | 容器的唯一標(biāo)識(shí)' /bin/bash (推薦使用)
    ?? Ctrl+PQ 退出不關(guān)閉容器
    ?? exit 退出不關(guān)閉容器
    image.png

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

image.png

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

  1. 創(chuàng)建一個(gè)守護(hù)式容器,并映射容器的80端口
    docker run -p 80 --name 名稱 -it centos:7 /bin/bash
  2. 進(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

image.png

注意:當(dāng)容器重新啟動(dòng)會(huì)重新給我們進(jìn)行端口映射

8 Docker鏡像和倉(cāng)庫

Docker Image鏡像:1. 容器的基石沙廉,2.層疊的只讀文件系統(tǒng),3.聯(lián)合加載

  1. 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í)是中間層鏡像
  2. docker inspect [OPTIONS] CONTAINER | IMAGE [CONTAINER | IMAGE...]:查看鏡像
  3. docker rmi [OPTIONS] IMAGE [IMAGE...]:刪除鏡像
  4. 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)庫中拉取鏡像和推送鏡像

  1. 查找鏡像
    ?? 方式一:
    ?? ?? 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ù)
  2. 獲取鏡像
    ??docker pull [OPTIONS] name[:TAG]
    ?? 示例: docker pull centos:7
    可以發(fā)現(xiàn)下載速度非常慢撬陵,這時(shí)可以是用鏡像加速器(daocloud或者阿里云-控制臺(tái)-搜索鏡像加速器-按照說明配置)
  3. 推送鏡像
    docker push 鏡像名
    步驟:
    ?? 1. 注冊(cè)hub賬號(hào)
    2.登陸hub的賬號(hào).docker login
    3.使用push命令推送到hub中

10 構(gòu)建鏡像

  1. 方式一:docker commit -m='描述信息' -a='作者' srcDockerID desDockerName:version
  2. 方式二: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)建過程

  1. 從基礎(chǔ)鏡像運(yùn)行一個(gè)容器.
  2. 執(zhí)行一條指令,對(duì)容器做出修改.
  3. 執(zhí)行類似docker commit 的操作,提交一個(gè)新的鏡像層.
  4. 再基于剛提交的鏡像運(yùn)行一個(gè)新容器.
  5. 執(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

image.png

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訪問

image.png

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í)寫大量的命令而頭疼。

  1. 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
  1. 配置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)停止了的容器
  1. 常用命令
        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ù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末侵歇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舆瘪,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疮茄,死亡現(xiàn)場(chǎng)離奇詭異吝梅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)妆兑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門魂拦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毛仪,“玉大人,你說我怎么就攤上這事芯勘∠溲ィ” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵荷愕,是天一觀的道長(zhǎng)衡怀。 經(jīng)常有香客問我,道長(zhǎng)安疗,這世上最難降的妖魔是什么抛杨? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮荐类,結(jié)果婚禮上怖现,老公的妹妹穿的比我還像新娘。我一直安慰自己玉罐,他們只是感情好屈嗤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吊输,像睡著了一般饶号。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上璧亚,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天讨韭,我揣著相機(jī)與錄音,去河邊找鬼癣蟋。 笑死透硝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疯搅。 我是一名探鬼主播濒生,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼幔欧!你這毒婦竟也來了罪治?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤礁蔗,失蹤者是張志新(化名)和其女友劉穎觉义,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浴井,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晒骇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洪囤。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徒坡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瘤缩,到底是詐尸還是另有隱情喇完,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布剥啤,位于F島的核電站锦溪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏铐殃。R本人自食惡果不足惜海洼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望富腊。 院中可真熱鬧坏逢,春花似錦、人聲如沸赘被。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽民假。三九已至浮入,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間羊异,已是汗流浹背事秀。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留野舶,地道東北人易迹。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像平道,于是被迫代替她去往敵國(guó)和親睹欲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容