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

Posted 文火冰糖的硅基工坊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[云原生专题-10]:容器 - Docker的修改保存共享:commitsaveload-v相关的知识,希望对你有一定的参考价值。

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

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122709124


目录

前言:

第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内部文件系统的能力,如通过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

以上是关于[云原生专题-10]:容器 - Docker的修改保存共享:commitsaveload-v的主要内容,如果未能解决你的问题,请参考以下文章

[云原生专题-15]:容器 - docker主机管理工具-docker machine

[云原生专题-6]:容器 - Docker概述以及虚拟机的比较

[云原生专题-9]:容器 - Docker的启动与关闭:runstop

[云原生专题-11]:容器 - 如何构建自己的docker镜像:Docker Dockerfile

[云原生专题-14]:容器 - 批量定义构建运行多个微服务- docker编排工具Compose

[云原生专题-16]:容器 - 在Windows主机上搭建Docker环境