Docker映象的構建以及資料卷和埠對映
前言
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
相關文章
- 如何修改正在執行的docker映象的埠對映?Docker
- Docker-埠對映Docker
- Docker Image 的釋出和 Container 埠對映DockerAI
- 修改docker容器的埠對映Docker
- 修改 Docker 容器對映的埠Docker
- Docker(33)- 如何修改 docker 容器的埠對映Docker
- 如何修改Docker容器埠對映?Docker
- Docker介紹下載安裝、製作映象及容器、做目錄對映、做埠對映Docker
- docker構建映象Docker
- docker 構建自己的映象Docker
- 突破難關:Docker映象和容器的區別以及構建的最佳實踐Docker
- WSL docker打通容器間通訊和追加埠對映Docker
- Docker映象構建(五)Docker
- docker構建supervisor映象Docker
- Docker 構建 kubectl 映象Docker
- 【Docker】Docker基礎-埠對映與容器互聯Docker
- Docker 埠對映防火牆規則配置Docker防火牆
- Docker 網路基礎配置一(埠對映)Docker
- Docker 如何動態修改容器埠對映Docker
- Docker映象構建原理解析(不裝docker也能構建映象)Docker
- Docker容器內部埠對映到外部宿主機埠Docker
- Docker學習筆記:映象、容器、資料卷Docker筆記
- Docker提交映象-資料卷-視覺化Docker視覺化
- 資料結構-對映資料結構
- Docker 映象構建之 DockerfileDocker
- Docker容器內部埠對映到外部宿主機埠的方法小結Docker
- WSL 埠對映
- Docker 分階段構建映象Docker
- Docker 構建多平臺映象Docker
- Docker構建多平臺映象Docker
- Docker 構建PHP 映象環境DockerPHP
- Docker 映象分階段構建Docker
- Linux埠對映是什麼?如何進行埠對映?Linux
- 構建 Docker 映象的 N 個小技巧Docker
- 不用安裝docker也能構建docker映象Docker
- 從0開始構建一個瀚高資料庫Docker映象資料庫Docker
- Nginx埠對映配置Nginx
- VMware Fusion 埠對映