可寫的容器層
- 當(dāng)容器啟動(dòng)時(shí)搅幅,一個(gè)新的可寫層被加載到鏡像的頂部;
- 新增加的這一層叫做“容器層”堪置,“容器層”之下的叫做“鏡像層”躬存;
- 所有多容器的改動(dòng),無論是增加舀锨、刪除岭洲、還是修改文件都只會(huì)發(fā)生在容器層;
- 容器層保存的是鏡像變化的部分坎匿,不會(huì)對(duì)鏡像本身進(jìn)行任何修改盾剩,這個(gè)操作叫做copy-on-write
構(gòu)建鏡像:
方法:
docker commit命令構(gòu)建鏡像
docker-file構(gòu)建鏡像
docker commit
- 運(yùn)行容器:
?docker run -it 鏡像名稱 - 安裝需要的軟件:
?在運(yùn)行的容器的內(nèi)部 - 使用docker ps命令:
?查看當(dāng)前正在運(yùn)行的容器,主要是查看容器名稱 - 使用docker commit 運(yùn)行容器名稱 新的鏡像名稱
?創(chuàng)建鏡像
docker file
1.創(chuàng)建dockerfile文件:
vim Dockerfile
FROM ubuntu
RUN apt-get update && apt-get -y install vim
2.運(yùn)行命令使用Dockerfile文件創(chuàng)建鏡像:
[root@localhost ~]# docker build -t ubuntu-dockerfile .
Sending build context to Docker daemon 4.055 MB
Step 1/2 : FROM ubuntu
Trying to pull repository docker.io/library/ubuntu ...
latest: Pulling from docker.io/library/ubuntu
84ed7d2f608f: Pull complete
be2bf1c4a48d: Pull complete
a5bdc6303093: Pull complete
e9055237d68d: Pull complete
Digest: sha256:868fd30a0e47b8d8ac485df174795b5e2fe8a6c8f056cc707b232d65b8a1ab68
Status: Downloaded newer image for docker.io/ubuntu:latest
---> 1d9c17228a9e
Step 2/2 : RUN apt-get update && apt-get install -y vim
---> Running in c0eb0a550442
Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [83.2 kB]
Processing triggers for libc-bin (2.27-3ubuntu1) ...
---> f24a4faf7b23
Removing intermediate container c0eb0a550442
Successfully built f24a4faf7b23
命令解釋:
docker build :
-t :
ubuntu-dockerfile :
. :
3.查看創(chuàng)建成功的鏡像文件
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu-dockerfile latest f24a4faf7b23 8 minutes ago 170 MB
4.查看鏡像的構(gòu)建歷史替蔬,也就是dockfile的執(zhí)行過程
[root@localhost ~]# docker history ubuntu-dockerfile
IMAGE CREATED CREATED BY SIZE COMMENT
f24a4faf7b23 2 hours ago /bin/sh -c apt-get update && apt-get insta... 83.8 MB
1d9c17228a9e 4 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
<missing> 4 days ago /bin/sh -c mkdir -p /run/systemd && echo '... 7 B
<missing> 4 days ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0 B
<missing> 4 days ago /bin/sh -c set -xe && echo '#!/bin/sh' >... 745 B
<missing> 4 days ago /bin/sh -c #(nop) ADD file:c0f17c7189fc11b... 86.7 MB
鏡像的緩存特性:
- Docker 會(huì)緩存已有鏡像的鏡像層告私,構(gòu)建新鏡像時(shí),如果某鏡像層已經(jīng)存在承桥,就直接使用驻粟,無需重新創(chuàng)建。
- 如果不想使用緩存凶异,可以在docker build 命令中添加--no-cache命令選項(xiàng)
- 如果改變Dockfile中命令的執(zhí)行順序格嗅,但由于docker分層的結(jié)構(gòu)特性,Docker 必須重建受影響的鏡像層
1.修改原有的Dockerfile文件唠帝,添加復(fù)制一個(gè)文件到/
vim Dockerfile
FROM ubuntu
RUN apt-get update && apt-get install -y vim
COPY testfile /
2.創(chuàng)建需要被復(fù)制的文件
[root@localhost ~]# touch testfile
3.執(zhí)行命令進(jìn)行新鏡像的構(gòu)建
[root@localhost ~]# docker build -t ubuntu-dockerfile2 .
Sending build context to Docker daemon 4.059 MB
Step 1/3 : FROM ubuntu
---> 1d9c17228a9e
Step 2/3 : RUN apt-get update && apt-get install -y vim
---> Using cache #使用了緩存
---> f24a4faf7b23
Step 3/3 : COPY testfile /
---> ae5a3ec0f33a
Removing intermediate container 5461a0ed5c9a #移除創(chuàng)建鏡像時(shí)啟動(dòng)的中間容器
Successfully built ae5a3ec0f33a #成功創(chuàng)建新的鏡像
鏡像的保存和分發(fā):
docker hub是docker公司開發(fā)的和維護(hù)的公共倉庫,用戶可以注冊(cè)賬號(hào)后將自己構(gòu)建的鏡像通過docker push 用戶名/倉庫名:tag
命令將鏡像上傳到自己的倉庫玄柏。
- 首相使用docker images m 命令查看本地已經(jīng)構(gòu)建的鏡像:
root@jyq-virtual-machine:/home/jyq# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest d3a13ec4a0f1 2 weeks ago 132MB
root@jyq-virtual-machine:/home/jyq#
- 然后使用docker tag命令對(duì)存在的鏡像進(jìn)行重新的命名:
root@jyq-virtual-machine:/home/jyq# docker tag httpd:latest jiyongqiang0310/learn-test:v1
root@jyq-virtual-machine:/home/jyq# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jiyongqiang0310/learn-test v1 d3a13ec4a0f1 2 weeks ago 132MB
httpd latest d3a13ec4a0f1 2 weeks ago 132MB
- 登錄已經(jīng)申請(qǐng)的docker hub賬號(hào):
# 使用 -u 選項(xiàng)指定自己的用戶名
root@jyq-virtual-machine:/home/jyq# docker login -u jiyongqiang0310
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
root@jyq-virtual-machine:/home/jyq#
- 登錄成功后上傳自己已經(jīng)構(gòu)建好的鏡像文件:
root@jyq-virtual-machine:/home/jyq# docker push jiyongqiang0310/learn-test:v1
The push refers to repository [docker.io/jiyongqiang0310/learn-test]
32d58e8790a5: Layer already exists
15c7c3e3b182: Layer already exists
bc313b7c45f1: Layer already exists
7fb2893e5a45: Layer already exists
0a07e81f5da3: Layer already exists
v1: digest: sha256:214019bfc77677ac1f0c86b3a96e2b91600de7e2224f195b446cb13572cebb6b size: 1367
root@jyq-virtual-machine:/home/jyq#
- 登錄 [https://hub.docker.com就可以看到自己上產(chǎn)的鏡像文件
企業(yè)微信截圖_15517653131553.png
構(gòu)建自己的倉庫:
- 首先在自己本地的根目錄創(chuàng)建一個(gè)用于存儲(chǔ)鏡像文件的目錄:
root@jyq-virtual-machine:/# mkdir myregistry
- 然后使用docker開源的倉庫軟件啟動(dòng)一個(gè)容器:
# 啟動(dòng)一個(gè)倉庫容器
root@jyq-virtual-machine:/# docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:2
Unable to find image 'registry:2' locally
2: Pulling from library/registry
169185f82c45: Pull complete
046e2d030894: Pull complete
188836fddeeb: Pull complete
832744537747: Pull complete
7ceea07e80be: Pull complete
Digest: sha256:870474507964d8e7d8c3b53bcfa738e3356d2747a42adad26d0d81ef4479eb1b
Status: Downloaded newer image for registry:2
83936c63e2488a40170f8c1afc42cce5f444f0b73f699ea4a5f4293a6633c1f8
#查看容器是否已經(jīng)運(yùn)行成功
root@jyq-virtual-machine:/# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83936c63e248 registry:2 "/entrypoint.sh /etc…" 54 seconds ago Up 53 seconds 0.0.0.0:5000->5000/tcp xenodochial_noyce
35eaaec97f0b httpd "httpd-foreground" 24 hours ago Up 24 hours 0.0.0.0:8080->80/tcp goofy_swartz
- 將本地已經(jīng)存在的鏡像進(jìn)行重命名襟衰,使其滿足[registry-host]:[port]/[username]/xxx的格式:
root@jyq-virtual-machine:/# docker tag httpd:latest 192.168.100.128:5000/jiyongqiang/httpd:v1
root@jyq-virtual-machine:/# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.100.128:5000/jiyongqiang/httpd v1 d3a13ec4a0f1 2 weeks ago 132MB
- 然后使用docker push 命令將已經(jīng)構(gòu)建好的容器上傳到自己的私有倉庫。
命令回顧:
- docker run 運(yùn)行容器
- docker commit 將運(yùn)行的容器提交生成新的鏡像
- docker build 使用DockerFile文件構(gòu)建鏡像
- docker history 查看某鏡像構(gòu)建時(shí)執(zhí)行的命令
- docker images 查看本地已經(jīng)存在的鏡像文件
- docker ps -a 查看所有狀態(tài)的容器
- docker container ls -a 同上
- docker tag 給本地鏡像重新鏡像tag命名
- docker pull 從倉庫拉取鏡像
- docker push 將鏡像上傳到倉庫
- docker rmi 刪除沒有被啟動(dòng)容器使用的鏡像文件