[云原生专题-10]:容器 - Docker的修改、保存、共享:commit、save、load、-v

网友投稿 250 2022-10-22

[云原生专题-10]:容器 - Docker的修改、保存、共享:commit、save、load、-v

作者主页(​​文火冰糖的硅基工坊​​​):​​文火冰糖(王文兵)的博客_文火冰糖的硅基工坊​

​目录​

​​前言:​​

​​第1章 Docker的修改:docker exec​​

​​第2章 docker修改内容的保存:docker commit​​

​​第3章 docker修改内容的共享​​

​​3.1 通过远程docker镜像仓库共享​​

​​3.2 从远程仓库下载镜像​​

​​3.3 通过主机端镜像文件文件共享-docker镜像的保存:Docker save -o​​

​​3.4 通过主机端镜像文件文件共享-docker镜像的加载:Docker load -i​​

​​第4章  容器与主机共享文件或目录进行交换数据(mount)​​

​​第5章 在容器与主机之间拷贝文件:docker cp​​

前言:

在实际过程中,我们经常需要修改docker内部的内容,比如在docker中安装了一组工具,我们希望把这样修改保存下来,以便下次重启或更换主机时候使用,或者分享给其他人使用。

这就是docker的修改、保存与共享。

第1章 Docker的修改:docker exec

docker要提供修改的能力,需要提供外部主机Host能够访问Docker内部文件系统的能力,如通过server或通过Linux shell。比如:

# 启动一个Linux docker[root@i-vwwup7v8 ~]# docker run -itd --name ubuntu-test ubuntu /bin/bashd7f90848fb2152a144dc229ed69d795161be749bf9ccf535f64a124bc725a8a7# 进入docker[root@i-vwwup7v8 ~]# docker exec -it ubuntu-test2 /bin/bashroot@afe2a89a4bd9:/## 修改docker内部内容cd ~root@afe2a89a4bd9:/# mkdir testroot@afe2a89a4bd9:/# lstest

第2章 docker修改内容的保存:docker commit

docker是docker镜像的一个实例,对docker的修改,实际上是对docker实例的修改,而实例存在与内存中,重启后全部消失,因此,如需保存docker实例文件系统的修改,需要把docker实例的内容保存为新的docker镜像。

[root@i-vwwup7v8 ~]# docker commit --helpUsage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]Create a new image from a container's changesOptions: -a, --author string Author (e.g., "John Hannibal Smith ") -c, --change list Apply Dockerfile instruction to the created image -m, --message string Commit message -p, --pause Pause container during commit (default true)[root@i-vwwup7v8 ~]# docker commit -a "wangwenbing" -m "modify for test" ubuntu-test2 ubuntu-modify:v1sha256:bdc2e2c1a4c990fb3b91a29fa2bb824f665a42162d381f026549a40219a3aee2[root@i-vwwup7v8 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEubuntu-modify v1 bdc2e2c1a4c9 8 seconds ago 72.8MBnginx v3 9ac0587209a8 7 hours ago 141MBubuntu latest d13c942271d6 2 weeks ago 72.8MBnginx latest 605c77e624dd 3 weeks ago 141MBredis latest 7614ae9453d1 5 weeks ago 113MBubuntu 15.10 9b9cb95443b5 5 years ago 137MBtraining/webapp latest 6fae60ef3446 6 years ago 349MB

备注:

docker commit的结果是,把修改后的docker实例,保存在本地的docker image中,但此时的docker image是有docker daemon管辖,并不是一个普通的文件。

ubuntu-modify     v1        bdc2e2c1a4c9   8 seconds ago   72.8MB

ubuntu                latest    d13c942271d6   2 weeks ago     72.8MB

如果要与他人共享,还需要进一步的操作。

第3章 docker修改内容的共享

3.1 通过远程docker镜像仓库共享

与他人共享,一种方法就是该新生成的docker 镜像push到远程仓库,其他人通过远程仓库中pull获得该修改后的docker。

​(1)在docker hub中注册​

​​Docker Hub - Container Image Library | Docker​​

​(2)通过docker daemon登录到远程服务器​

docker login

​(3)重新给docker image打标签​

docker tag ubuntu-modify:v1 hiwangwenbing/ubuntu-update:v1

docker tag:重启打标签的命令ubuntu-modify:v1 :本地docker image的标签hiwangwenbing/ubuntu-update:v1  =》远程仓库的标签,其中hiwangwenbing是该用户在docker hub中的用户名,ubuntu-update为该用户下的docker镜像的仓库名,每个镜像有一个独立的仓库,v1为该镜像在远程仓库中的某个版本

备注:

仓库名:版本 =》唯一的标识一个docker镜像,而同一个仓库名下,可以存放多个不同的版本的镜像。因此,hiwangwenbing/ubuntu-update标识了镜像的在远程仓库中的位置。

3.2 从远程仓库下载镜像

docker pull hiwangwenbing/ubuntu-update:v2

3.3 通过主机端镜像文件文件共享-docker镜像的保存:Docker save -o

与他人共享的第二种方法,就是把docker镜像从Docker Daemon中拷贝成主机端的不同文件。

然后,通过sftp进行网络传输,实现共享。

[root@i-vwwup7v8 ~]# docker save --helpUsage: docker save [OPTIONS] IMAGE [IMAGE...]Save one or more images to a tar archive (streamed to STDOUT by default)Options: -o, --output string Write to a file, instead of STDOUT

备注:

docker save会吧docker image存储成主机端的压缩文件。

命令如下:

docker save -o ubuntu-update.tar ubuntu-modify:v1

3.4 通过主机端镜像文件文件共享-docker镜像的加载:Docker load -i

[root@i-vwwup7v8 ~]# docker rmi bdc2e2c1a4c9Untagged: ubuntu-modify:v1Deleted: sha256:bdc2e2c1a4c990fb3b91a29fa2bb824f665a42162d381f026549a40219a3aee2[root@i-vwwup7v8 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx v3 9ac0587209a8 7 hours ago 141MBubuntu latest d13c942271d6 2 weeks ago 72.8MBnginx latest 605c77e624dd 3 weeks ago 141MBredis latest 7614ae9453d1 5 weeks ago 113MBubuntu 15.10 9b9cb95443b5 5 years ago 137MBtraining/webapp latest 6fae60ef3446 6 years ago 349MB[root@i-vwwup7v8 ~]# lscentos Dockerfile ubuntu-update.tar[root@i-vwwup7v8 ~]# docker load -i ubuntu-update.tar4e61c04695f0: Loading layer [==================================================>] 5.632kB/5.632kBLoaded image: ubuntu-modify:v1[root@i-vwwup7v8 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEubuntu-modify v1 bdc2e2c1a4c9 23 minutes ago 72.8MBnginx v3 9ac0587209a8 7 hours ago 141MBubuntu latest d13c942271d6 2 weeks ago 72.8MBnginx latest 605c77e624dd 3 weeks ago 141MBredis latest 7614ae9453d1 5 weeks ago 113MBubuntu 15.10 9b9cb95443b5 5 years ago 137MBtraining/webapp latest 6fae60ef3446 6 years ago 349MB

先通过docker rmi 把docker镜像ubuntu-modify从docker daemon移除。

然后通过docker load -i 把ubuntu-update.tar文件load成docker镜像,接受docker daemon管辖。

第4章  容器与主机共享文件或目录进行交换数据(mount)

有时候,我们需要在主机环境下修改容器内部的内容(如容器内应用程序的配置文件),但容器或没有终端接口,或进入终端后,修改不方便(如容器没有vi)等原因,我们需要在host环境下直接修改容器内部的文件,或在host与容器之间传递数据,这时候,共享目录或文件就非常有用。

​(1)指定共享路径的方式启动容器​

docker run -itd --name ubuntu-share -v /share/hello-E.txt:/share/hello-I.txt ubuntu /bin/bash

-v :指定共享的volume

参数格式: “主机共享文件全路径:容器内共享文件全路径”

/share/hello-E.txt:/share/hello-I.txt

备注:

通过通过多个-v指定多个mount映射。

​(2)查看主机文件:​/share/hello-E.txt

​(3)看容器文件:​/share/hello-I.txt

​(4)软附着容器:​

[root@i-vwwup7v8 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa312a85392d6 ubuntu "/bin/bash" 8 minutes ago Up 8 minutes ubuntu-share19543c15111b training/webapp "python app.py" 3 hours ago Up 3 hours 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp practical_greiderroot@a312a85392d6:/share# docker exec -it ubuntu-share /bin/bashroot@a312a85392d6:/share# cd /share/root@a312a85392d6:/share# lshello-I.txt

​(5)在容器外修改文件,在容器内检查是否同步修改​

# 容器外[root@i-vwwup7v8 share]# echo "hello-e" > hello-E.txt[root@i-vwwup7v8 share]# cat hello-E.txthello-e# 容器内root@87102b01dbd7:/share# cat hello-I.txthello-e

​(6)在容器内修改文件,在容器外检查是否同步修改​

# 容器内

root@87102b01dbd7:/share#  echo "hello-i" > hello-I.txt

root@87102b01dbd7:/share#  cat hello-I.txt

hello-i

# 容器外

[root@i-vwwup7v8 share]# cat hello-I.txt

hello-i

第5章 在容器与主机之间拷贝文件:docker cp

# 容器到主机文件拷贝docker cp docker-id:full-path host-full-path# 主机到容器文件拷贝docker cp host-full-path docker-id:full-path

​实际操作案例:​

----------------------主机端操作-------------------[root@i-vwwup7v8 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES975181ce7357 training/webapp "/bin/bash" 21 minutes ago Up 21 minutes 5000/tcp web-app-shell19543c15111b training/webapp "python app.py" 12 hours ago Up 23 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp practical_greider[root@i-vwwup7v8 ~]# ls] centos Dockerfile ubuntu-update.tar[root@i-vwwup7v8 ~]# docker cp 975181ce7357:/opt/webapp/Procfile .[root@i-vwwup7v8 ~]# ls] centos Dockerfile Procfile [root@i-vwwup7v8 ~]# touch host_file[root@i-vwwup7v8 ~]# docker cp ./host_file 975181ce7357:/opt/webapp/[root@i-vwwup7v8 ~]# [root@i-vwwup7v8 ~]# [root@i-vwwup7v8 ~]# ----------------------容器shell操作-------------------root@975181ce7357:/opt/webapp# lsProcfile app.py host_file requirements.txt tests.py

作者主页(​​文火冰糖的硅基工坊​​​):​​文火冰糖(王文兵)的博客_文火冰糖的硅基工坊​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java线程池不同场景下使用示例经验总结
下一篇:[云原生专题-11]:容器 - 如何构建自己的docker镜像:Docker Dockerfile
相关文章

 发表评论

暂时没有评论,来抢沙发吧~