Docker映象的構建以及資料卷和埠對映

八雲家的小幼紫發表於2020-11-26

前言

Docker 包含三個基本概念,分別是映象(Image)、容器(Container)和倉庫(Repository)。映象是 Docker 執行容器的前提,倉庫是存放映象的場所,可見映象更是Docker的核心。回到正題,Docker 映象可以看作是一個特殊的檔案系統,除了提供容器執行時所需的程式、庫、資源、配置等檔案外,還包含了一些為執行時準備的一些配置引數(如匿名卷、環境變數、使用者等)。映象不包含任何動態資料,其內容在構建之後也不會被改變。要想更深入的瞭解 Docker 映象,映象的原理也必不可少,而這其中最重要的概念就是映象層(Layers)(如下圖)。映象層依賴於一系列的底層技術,比如檔案系統(filesystems)、寫時複製(copy-on-write)、聯合掛載(union mounts)等。映象作為 Docker 最突出的創新之一,它變革了軟體交付標準。理解映象,對理解整個 Docker 的生命週期非常重要。

Docker映象的分層

在這裡插入圖片描述

  • Dockerfile中的每個指令都會建立一個新的映象層 映象層將被快取和複用
  • 當Dockerfile的指令修改了,複製的檔案變化了,或者構建映象時指定的變數不同了,對應的映象層快取就會失效
  • 某一層的映象快取失效之後,它之後的映象層都會失效
  • 映象層時不可變的,如果在某一層中新增一個檔案,然後再下一層中刪除它,則映象中依然會包含該檔案

映象建立

在這裡插入圖片描述
Docker映象的建立方法

  • 基於已有映象建立
  • 基於本地模板建立
  • 基於Dockerfile建立——DIY

基於已有映象建立

將容器裡面的執行的程式及執行環境打包生成新的映象

docker commit [選項] 容器ID/名稱 倉庫名稱:[標籤]
-m:說明資訊
-a:作者資訊
-p:生成過程中停止容器的執行

詳細過程

[root@server1 ~]# docker commit -m "new" -a "zhong" 5ce0a250c414 centos:zhong
[root@server1 ~]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
centos                zhong               53d9614685d4        19 seconds ago      215MB
nginx                 latest              bc9a0695f571        32 hours ago        133MB
centos                latest              0d120b6ccaa8        3 months ago        215MB
paigeeworld/centos7   latest              4cbe7aa905e7        6 years ago         382MB

基於本地模板建立

[root@server1 ~]# cat debian-7.0-x86-minimal.tar.gz | docker import - docker:debian
sha256:8d60dc9daf1a8341a68718b566a906fb95f06c7ee50a593136235d6d8087b248
[root@server1 ~]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
docker                debian              8d60dc9daf1a        22 seconds ago      215MB
centos                zhong               53d9614685d4        4 minutes ago       215MB
nginx                 latest              bc9a0695f571        32 hours ago        133MB
centos                latest              0d120b6ccaa8        3 months ago        215MB
paigeeworld/centos7   latest              4cbe7aa905e7        6 years ago         382MB

基於Dockerfile建立

Dockerfile是由一組指令組成的檔案Dockerfile結構四部分

  • 基礎映象資訊
  • 維護者資訊·映象操作指令
  • 容器啟動時執行指令

Dockerfile每行支援一條指令,每條指令可攜帶多個引數,支援使用以“#”號開頭的註釋

Dockerfile操作指令

指令含義
FROM映象指定新映象所基於的映象,第一條指令必須為FROM指令,每建立一個映象就需要一條FROM指令。
MAINTAINER名字說明新映象的維護人資訊
RUN命令在所基於的映象上執行命令,並提交到新的
CMD[“要執行的程式“,”引數1,“引數2“]指令啟動容器時要執行的命令或者指令碼,Dockerfile只能有一條CMD命令,如果指定多條則只能最後一條被執行
EXPOSE埠號指定新映象載入到Docker時要開啟的埠
ENV環境變數變數值設定一個環境變數的值,會被後面的RUN使用
ADD 原始檔/目錄目標檔案/目錄將原始檔複製到目標檔案,原始檔要與Dockerfile位於相同或者是一個URL(從宿主目錄複製到容器中,再複製的過程解壓縮)
COPY 原始檔/目錄目標檔案/目錄將本地主機上的檔案/目錄複製到目標地點,原始檔/目錄要與Dockerfile在相同的目錄中
VOLUME[“目錄“]資料卷在容器中建立一個掛載點
USER使用者名稱/UID指定執行容器時的使用者
WORKDIR路徑=cd為後續的RUN、CMD、ENTRYPOINT指定工作目錄
ONBUILD命令指定所生成的映象作為一個基礎映象時所要執行的命令
HEALTHCHECK健康檢查

Dockerfile建立

[root@server1 ~]# mkdir httpd
[root@server1 ~]# cd httpd/
[root@server1 httpd]# vim Dockerfile
FROM centos7
#維護映象的使用者資訊   
MAINTAINER this is project
#映象操作指令安裝apache軟體10 RUN yum -y install httpd
#開啟80埠   
EXPOSE 80
#複製網址首頁檔案   
ADD index.html /var/www/html/index.html
#將執行指令碼複製到映象中   
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#啟動容器時執行指令碼   
CMD ["/run.sh"]

製作指令碼

[root@server1 httpd]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
[root@server1 httpd]# echo '<h1>this is web</h1>' > index.html

生成映象

docker build -t httpd:centos .

在這裡插入圖片描述
新映象執行容器並開放埠

[root@server1 docker]# docker run -d -p 1216:80 httpd:centos
[root@server1 docker]# docker ps -a

在這裡插入圖片描述
測試
在這裡插入圖片描述

私有倉庫建立

下載私有倉庫

[root@server1 docker]# docker pull registry

在這裡插入圖片描述
修改配置檔案並重啟服務

[root@server1 docker]# vim /etc/docker/daemon.json 

{
  "insecure-registries":["192.168.111.10:5000"],
  "registry-mirrors": ["https://xm3e5k4h.mirror.aliyuncs.com"]
}
[root@server1 docker]# systemctl restart docker

建立私有倉庫容器

[root@server1 docker]# docker create -it registry /bin/bash

讓宿主機的/data/registry自動建立掛載容器中的/tmp/registry

[root@server1 docker]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
46cedc499bb947b49440cbdaa7ad658d37a63190e2b45d396a7d682e30568501

更改映象名,上傳映象至私有倉庫,檢視私有倉庫日誌是否上傳成功

[root@server1 docker]# docker tag httpd:centos 192.168.111.10:5000/httpd
[root@server1 docker]# docker push 192.168.111.10:5000/httpd
The push refers to repository [192.168.111.10:5000/httpd]
b0409d78bc5f: Pushed 
e5bb66f473af: Pushed 
bb0014307cc3: Pushed 
08ed231e2429: Pushed 
d73671db015a: Pushed 
174f56854903: Pushed 
latest: digest: sha256:d5b9a68c95c1e0d358d5340103ee41bfb2f0e11623d6a619700d5cccf0595e7c size: 1574
[root@server1 docker]# curl -XGET http://192.168.111.10:5000/v2/_catalog
{"repositories":["httpd"]}

刪除映象測試從私有庫是否可以下載映象

[root@server1 docker]# docker rmi 192.168.111.10:5000/httpd:latest 
Untagged: 192.168.111.10:5000/httpd:latest
Untagged: 192.168.111.10:5000/httpd@sha256:d5b9a68c95c1e0d358d5340103ee41bfb2f0e11623d6a619700d5cccf0595e7c
[root@server1 docker]# docker pull 192.168.111.10:5000/httpd
Using default tag: latest
latest: Pulling from httpd
Digest: sha256:d5b9a68c95c1e0d358d5340103ee41bfb2f0e11623d6a619700d5cccf0595e7c
Status: Downloaded newer image for 192.168.111.10:5000/httpd:latest
192.168.111.10:5000/httpd:latest
[root@server1 docker]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
192.168.111.10:5000/httpd   latest              74f47a985320        2 hours ago         476MB
httpd                       centos              74f47a985320        2 hours ago         476MB
docker                      debian              8d60dc9daf1a        2 hours ago         215MB
centos                      zhong               53d9614685d4        2 hours ago         215MB
nginx                       latest              bc9a0695f571        34 hours ago        133MB
centos                      7                   8652b9f0cb4c        12 days ago         204MB
centos                      latest              0d120b6ccaa8        3 months ago        215MB
registry                    latest              2d4f4b5309b1        5 months ago        26.2MB
paigeeworld/centos7         latest              4cbe7aa905e7        6 years ago         382MB

下載成功

Docker資料卷

將宿主機目錄/var/www掛載到容器中的/data1

[root@server1 docker]# docker run -v /var/www:/data1 --name web1 -it centos /bin/bash

在容器中建立檔案,宿主機中檢視

[root@1884c885a4d1 /]# cd  /data1
[root@1884c885a4d1 data1]# touch qwe.txt
[root@1884c885a4d1 data1]# exit
exit
[root@server1 docker]# ls /var/www/
qwe.txt
[root@server1 docker]# 

建立資料卷容器,容器中含兩個資料卷提供使用

docker run --name web100 -v /data1 -v /data2 -it centos /bin/bash
[root@ace8b5cafd0a /]# cd /data1
[root@ace8b5cafd0a data1]# echo "111" > 111.txt
[root@ace8b5cafd0a data1]# cd ..
[root@ace8b5cafd0a /]# cd data2
[root@ace8b5cafd0a data2]# echo "222" > 222.txt
[root@ace8b5cafd0a data2]# exit

建立另一臺容器並關聯web100,資料卷使用的為web100,名字為db1

docker run -it --volumes-from web100 -it centos /bin/bash
[root@a30178bbcbaa /]# cd data1
[root@a30178bbcbaa data1]# ls
111.txt
[root@a30178bbcbaa data1]# cd ../data2
[root@a30178bbcbaa data2]# ls
222.txt
[root@a30178bbcbaa data2]# exit

埠對映

[root@server1 docker]# docker run -it -P --name web33 centos:7 /bin/bash
[root@server1 docker]# docker run -it -P --name web55 --link web33:web33  centos:7 /bin/bash
[root@9f5accdee9a6 /]# ping web33
PING web33 (172.17.0.4) 56(84) bytes of data.
64 bytes from web33 (172.17.0.4): icmp_seq=1 ttl=64 time=0.103 ms
64 bytes from web33 (172.17.0.4): icmp_seq=2 ttl=64 time=0.108 ms
^C

相關文章