2.0 容器運作基礎
鏡像是 Docker 運作的基礎, 就好比計算機硬體需要安裝作業系統. 使用 Docker Images 命 令可以看到目前系統中存在的鏡像。當運作容器時,使用的鏡像如果在本地系統中不存 在,Docker 就會自動從 Docker 鏡像倉庫或者配置的私有倉庫中下載下傳;預設是從 Docker Hub 公共鏡像源下載下傳。
上節在 Docker C/S 架構邏輯圖中提到了私有倉庫。這節主要講鏡像的基本操作。
2.1 Docker 加載鏡像流程
1)檢查本地是否有與啟動鏡像相比對的鏡像。
2)查詢與鏡像位址中是否有啟動鏡像
3)如果在鏡像位址中沒有完整的位址,則從預設的 Docker Hub 下載下傳。
Docker 加載鏡像的兩種方式:
公共倉庫與私有倉庫
2.2 Docker 鏡像基本操作
2.2.1 搜尋 Docker Hub 有哪些鏡像
docker search [鏡像名字]
[root@master jdk]# docker search nginx
/
2.2.2 從 Docker Hub 下載下傳鏡像
下載下傳鏡像,(沒有指定版本,預設會下載下傳最新版 latest)
docker pull nginx:latest = docker pull nginx
[root@master jdk]# docker pull nginx:latest
從第三方docker 鏡像倉庫或者私有倉庫下載下傳鏡像方法
[root@docker ~]# docker pull repo.abc.com/httpd:latest #位址不存在
2.2.3 鏡像加速器
在下載下傳 Docker Hub 鏡像非常慢的情況下, 可以使用鏡像加速功能。配置加速可以用官網 提供的, 也可以使用私有倉庫。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://plqjafsr.mirror.aliyuncs.com"]
}
EOF
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker
2.2.4 基于容器建立鏡像系統
- 類似虛拟機的克隆功能
- 在運作當中的容器基礎上建立一個新的鏡像(相當于 vm 的完整快照)
[root@docker ~]# docker ps -a #顯示所有的容器, ps 隻是顯示正在運作的容器
[root@master ~]# docker run -d -P nginx #啟動容器
[root@master /]# docker container commit 960d3f0e61eb centos-nginx:1.0 #容器運作 ID
sha256:7af7ffdea5e8ef703fb7cb30baaff3b3e75a1297bfbc75bb15454dd7eb622215
#檢查
[root@master /]# docker images REPOSITORY TAG centos-nginx 1.0
#不能删除原來的鏡像(父鏡像)
[root@master /]# docker rmi 6678c7c2e56c
Error response from daemon: conflict: unable to delete 6678c7c2e56c (cannot be forced) - image has dependent child images
#使用快照鏡像啟動新容器
[root@master /]# docker run -d -p 8090:80 centos-nginx:1.0
1dabb29c5a87a4ec8d58040e6ea4a21dcb17dda006168ce56021fd232208c18d
2.2.5 删除鏡像
[root@master ~]# docker image rm centos-nginx Error: No such image: centos-nginx
[root@docker ~]# docker image rm 07ddb4d9a8ab
Untagged: centos-nginx:latest
Deleted: sha256:07ddb4d9a8abfd51849f6b2747c115a28e2dd9587a56af881c43cc890e874861
Deleted: sha256:41c4debe112f55832a841e976e96d61ad170c7646460560799313c82f9f36f44
[root@docker ~]# docker rmi fdf13fa91c6e
Error response from daemon: conflict: unable to delete fdf13fa91c6e (must be forced) - image is being used by stopped container f30520fafcbf
#注:如果鏡像系統正在運作,需要停止程序才可以删除鏡像系統,否則無法删除!
或者選擇強制删除 (注意鏡像之間的依賴關系)
[root@docker ~]# docker rmi --force fdf13fa91c6e
[root@docker ~]# docker rmi -f fdf13fa91c6e #縮寫 -f 參數 == --force
2.2.6 導出鏡像
#導出鏡像為 tar 包
[root@master /]# docker image save nginx:latest > nginx.tar.gz
2.2.7 導入鏡像
直接使用tar 包導入鏡像,注意如果原來導出的源鏡像還是在存在于系統中,那麼新導入的 鏡像在系統将不可見。
[root@master /]# docker image load -i nginx.tar.gz
Loaded image: nginx:latest
#強制删除原來的鏡像
[root@master /]# docker rmi nginx:latest --force
#再執行導入
[root@master /]# docker image load -i nginx.tar.gz
Loaded image: nginx:latest
#最後檢視
[root@master /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 6678c7c2e56c 9 days ago 127MB
2.2.8 鏡像tag标簽
文法:docker image tag 源_IMAGE[:TAG] 目标_IMAGE[:TAG]
類似linux 硬連結,在推送鏡像到私有倉庫時,需要添加tag。
[root@docker01 ~]# docker image tag nginx:latest repo.abc.com/nginx:v1.0
[root@master /]# docker images
REPOSITORY TAG nginx latest repo.abc.com/nginx v1.0
IMAGE ID 6678c7c2e56c 6678c7c2e56c
CREATED 9 days ago
9 days ago
SIZE
127MB 127MB
#可以使用新的 tag 标簽啟動容器
[root@master /]# docker run -d -p 9091:80 repo.abc.com/nginx:v1.0
1f5f20b763ccb7661b41701b9319876a0bd074da12e4e77ba0ff7879c2b19627
2.2.9 建構Java基礎鏡像
之前使用為Docker自帶鏡像倉庫中的鏡像,現在我們自己來建構私有鏡像 #在java 鏡像中為什麼要建構alpine-glibc ?
#在java 鏡像中為什麼要建構alpine-glibc ?
#Java Dockerfile
[root@master /]# mkdir -p /root/jdk/
[root@master /]# vim Dockerfile
FROM frolvlad/alpine-glibc
#模闆鏡像
MAINTAINER 地鐵昌平線
#建立者
RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main/" > /etc/apk/repositories #修改源
RUN apk add --no-cache bash
#安裝 bash
ADD jre1.8.0_211.tar.gz /usr/java/jdk/
#添加檔案
ENV JAVA_HOME /usr/java/jdk/jre1.8.0_211
#設定環境變量
ENV PATH ${PATH}:${JAVA_HOME}/bin
RUN chmod +x /usr/java/jdk/jre1.8.0_211/bin/java
WORKDIR /opt
2.3.0 建構鏡像
#需要把 jre1.8.0_211.tar.gz 放到與 Dockerfile 同級目錄
[root@docker01 ~]# docker pull frolvlad/alpine-glibc #拉取鏡像
[root@master jdk]# docker build -t jre8:1.0 . #編譯鏡像
#檢視鏡像
[root@master jdk]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE jre8 1.0 c65645093f97 16 seconds ago 136MB #添加 tag
[root@master jdk]# docker tag jre8:1.0 repo.abc.com/jre8:v1.0
2.3.0.1 運作鏡像
[root@docker01 ~]# docker run -it jre8:1.0 #啟動并且進入容器
bash bash-4.3# java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
2.3.1 鏡像建構過程
建構容器:通過父鏡像上建立一個容器,重新封裝成一個鏡像,變成下一個新啟動容器的隻讀層(LOWER)。 但是如果目前容器需要對鏡像進行修改,就需要加載所有鏡像的隻讀層到容器中進行修改。
#特别注意之前提到的容器啟動,修改鏡像内容是不會修改源鏡像;隻是修改啟動容器的内容。在下一節将詳細講述鏡像存儲的原理。
#檢視容器的建構曆史
# missing 為目前鏡像的源鏡像建構曆史 FROM frolvlad/alpine-glibc
# f83c32dc03f3 為目前鏡像建構的曆史
[root@master jdk]# docker history jre8:1.3
IMAGE CREATED CREATED BY SIZE COMMENT ea65e9cde677 About a minute ago /bin/sh -c #(nop) WORKDIR /opt 0B d0afad7e579e About a minute ago /bin/sh -c chmod +x /usr/java/jdk/jre1.8.0_2… 8.46kB
12d49a4a8a61 6 minutes ago /bin/sh -c #(nop) ENV PATH=/usr/local/sbin:… 0B 256df34ef73f 6 minutes ago /bin/sh -c #(nop) ENV JAVA_HOME=/usr/java/j… 0B dba16cec6c49 7 minutes ago /bin/sh -c #(nop) ADD file:d614f1012c68493ba… 116MB 22b0f5f4b551 17 minutes ago /bin/sh -c apk add --no-cache bash 3.56MB c97cdc4cfa33 17 minutes ago /bin/sh -c echo "https://mirror.tuna.tsinghu… 54B f26f217e4a3f 17 minutes ago /bin/sh -c #(nop) MAINTAINER Tony 0B f83c32dc03f3 2 days ago /bin/sh -c apk add --update curl && curl -… 11.7MB
<missing> 2 days ago /bin/sh -c #(nop) ENV GLIBC_VERSION=2.31-r0 0B
<missing> 2 days ago /bin/sh -c #(nop) MAINTAINER Jean Blanchard… 0B
<missing> 7 weeks ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 7 weeks ago /bin/sh -c #(nop) ADD file:e69d441d729412d24… 5.59MB
2.3.2 查詢鏡像詳情
#存儲資訊
[root@master jdk]# docker image inspect jre8:1.3
2.4 Docker 鏡像和 Overlay2 關系
Docker 需要OverlayFS檔案系統存儲
1)Docker中的鏡像采用分層建構設計,每個層可以稱之為"layer", 鏡像檔案預設存在目錄:/var/lib/docker/overlay2
2) Docker支援的檔案存儲如下: AUFS、OverlayFS、VFS、Brtfs等。
3)通過Docker Info指令檢視目前的存儲驅動
[root@node-2 overlay2]# docker info | grep -E " Storage Driver|Server Version"
Server Version: 19.03.4
Storage Driver: overlay2
4)通常ubuntu類的系統預設采用的是AUFS,centos7.1+系列采用的是OverlayFS。