作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122709124
目录
第2章 docker修改内容的保存:docker commit
3.3 通过主机端镜像文件文件共享-docker镜像的保存:Docker save -o
3.4 通过主机端镜像文件文件共享-docker镜像的加载:Docker load -i
前言:
在实际过程中,我们经常需要修改docker内部的内容,比如在docker中安装了一组工具,我们希望把这样修改保存下来,以便下次重启或更换主机时候使用,或者分享给其他人使用。
这就是docker的修改、保存与共享。
第1章 Docker的修改:docker exec
docker要提供修改的能力,需要提供外部主机Host能够访问Docker内部文件系统的能力,如通过http server或通过Linux shell。比如:
# 启动一个Linux docker
[root@i-vwwup7v8 ~]# docker run -itd --name ubuntu-test ubuntu /bin/bash
d7f90848fb2152a144dc229ed69d795161be749bf9ccf535f64a124bc725a8a7
# 进入docker
[root@i-vwwup7v8 ~]# docker exec -it ubuntu-test2 /bin/bash
root@afe2a89a4bd9:/#
# 修改docker内部内容
cd ~
root@afe2a89a4bd9:/# mkdir test
root@afe2a89a4bd9:/# ls
test
第2章 docker修改内容的保存:docker commit
docker是docker镜像的一个实例,对docker的修改,实际上是对docker实例的修改,而实例存在与内存中,重启后全部消失,因此,如需保存docker实例文件系统的修改,需要把docker实例的内容保存为新的docker镜像。
[root@i-vwwup7v8 ~]# docker commit --help
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
Options:
-a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-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:v1
sha256:bdc2e2c1a4c990fb3b91a29fa2bb824f665a42162d381f026549a40219a3aee2
[root@i-vwwup7v8 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu-modify v1 bdc2e2c1a4c9 8 seconds ago 72.8MB
nginx v3 9ac0587209a8 7 hours ago 141MB
ubuntu latest d13c942271d6 2 weeks ago 72.8MB
nginx latest 605c77e624dd 3 weeks ago 141MB
redis latest 7614ae9453d1 5 weeks ago 113MB
ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
training/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 --help
Usage: 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 bdc2e2c1a4c9
Untagged: ubuntu-modify:v1
Deleted: sha256:bdc2e2c1a4c990fb3b91a29fa2bb824f665a42162d381f026549a40219a3aee2
[root@i-vwwup7v8 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v3 9ac0587209a8 7 hours ago 141MB
ubuntu latest d13c942271d6 2 weeks ago 72.8MB
nginx latest 605c77e624dd 3 weeks ago 141MB
redis latest 7614ae9453d1 5 weeks ago 113MB
ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
training/webapp latest 6fae60ef3446 6 years ago 349MB
[root@i-vwwup7v8 ~]# ls
centos Dockerfile ubuntu-update.tar
[root@i-vwwup7v8 ~]# docker load -i ubuntu-update.tar
4e61c04695f0: Loading layer [==================================================>] 5.632kB/5.632kB
Loaded image: ubuntu-modify:v1
[root@i-vwwup7v8 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu-modify v1 bdc2e2c1a4c9 23 minutes ago 72.8MB
nginx v3 9ac0587209a8 7 hours ago 141MB
ubuntu latest d13c942271d6 2 weeks ago 72.8MB
nginx latest 605c77e624dd 3 weeks ago 141MB
redis latest 7614ae9453d1 5 weeks ago 113MB
ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
training/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 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a312a85392d6 ubuntu "/bin/bash" 8 minutes ago Up 8 minutes ubuntu-share
19543c15111b training/webapp "python app.py" 3 hours ago Up 3 hours 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp practical_greider
root@a312a85392d6:/share# docker exec -it ubuntu-share /bin/bash
root@a312a85392d6:/share# cd /share/
root@a312a85392d6:/share# ls
hello-I.txt
(5)在容器外修改文件,在容器内检查是否同步修改
# 容器外
[root@i-vwwup7v8 share]# echo "hello-e" > hello-E.txt
[root@i-vwwup7v8 share]# cat hello-E.txt
hello-e
# 容器内
root@87102b01dbd7:/share# cat hello-I.txt
hello-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 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
975181ce7357 training/webapp "/bin/bash" 21 minutes ago Up 21 minutes 5000/tcp web-app-shell
19543c15111b 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# ls
Procfile app.py host_file requirements.txt tests.py
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122709124