设为首页 收藏本站
查看: 1047|回复: 0

[经验分享] Docker入门实践之镜像管理

[复制链接]

尚未签到

发表于 2018-5-26 14:22:04 | 显示全部楼层 |阅读模式
  前面讲到了docker安装以及配置文件参数说明,今天我们来了解有关docker的基本管理:比如docker版本信息查包括客户端、服务端、依赖的Go等内部版本,还有容器启动/关闭/重启等等有关docker基本管理相关操作。

一 docker基本信息查看
  1.1 docker版本信息查看
使用docker version可以查看docker的版本号,包括客户端、服务端、依赖的Go等版本信息,如下所示:

[root@centos7 ~]# docker version
Client:
Version:      1.8.2-el7.centos
API version:  1.20
Package Version: docker-1.8.2-10.el7.centos.x86_64
Go version:   go1.4.2
Git commit:   a01dc02/1.8.2
Built:        
OS/Arch:      linux/amd64
Server:
Version:      1.8.2-el7.centos
API version:  1.20
Package Version:
Go version:   go1.4.2
Git commit:   a01dc02/1.8.2
Built:        
OS/Arch:      linux/amd64
  1.2 docker系统层面等信息查看
使用命令docker info可以查看docker系统层面信息,包括管理的images, containers数等,例如:

root@centos7 ~]# docker info
Containers: 1
Images: 4
Storage Driver: devicemapper
Pool Name: docker-8:3-36786088-pool
Pool Blocksize: 65.54 kB
Backing Filesystem: xfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 2.059 GB
Data Space Total: 107.4 GB
Data Space Available: 12.93 GB
Metadata Space Used: 1.765 MB
Metadata Space Total: 2.147 GB
Metadata Space Available: 2.146 GB
Udev Sync Supported: true
Deferred Removal Enabled: false
Data loop file: /var/lib/docker/devicemapper/devicemapper/data
Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
Library Version: 1.02.107-RHEL7 (2015-10-14)
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.10.0-327.el7.x86_64
Operating System: CentOS Linux 7 (Core)
CPUs: 1
Total Memory: 977.9 MiB
Name: centos7
ID: BUKD:MUW2:5X2D:G7BF:6Y7G:SKIH:LD6K:VUAC:3QA4:JY5C:S3DG:LFT2
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
二 docker镜像管理
  2.1 镜像搜索
docker search命令主要用于搜索镜像,默认搜索的镜像为docker hub官方仓库中的镜像,用法如下:" docker search 镜像名称 ",支持参数如下:
--automated=false 仅显示自动创建的镜像;
--no-trunc=false 输出信息不截断提示;
-s --starts=0 指定仅显示评价为指定星级的以上的镜像。
例如,搜索Ubuntu镜像:

[root@centos7 ~]# docker search ubuntu12.10
INDEX       NAME                                  DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/chug/ubuntu12.10x32         Ubuntu Quantal Quetzal 12.10 32bit  base i...   0                    
docker.io   docker.io/chug/ubuntu12.10x64         Ubuntu Quantal Quetzal 12.10 64bit  base i...   0                    
docker.io   docker.io/marcgibbons/ubuntu12.10                                                     0                    
docker.io   docker.io/mirolin/ubuntu12.10                                                         0                    
docker.io   docker.io/mirolin/ubuntu12.10_redis                                                   0
  可以看到返回了很多包含关键字的镜像,其中包括镜像的名字、描述、星级、以及是否官方创建,是否自动创建的等信息字段,注意默认输出是按照星级评价来排序。
  2.2 镜像拉取
使用docker pull命令可以从网络注册镜像仓库源上下载镜像,命令格式如下:

docker pull  docker仓库源:仓库源链接端口/镜像名称:镜像tag
  对于docker镜像来说,如果不指定tag,则默认会选择latest标签,即下载最新版本镜像,需要注意的如果不指定docker镜像仓库地址,默认为官方docker hub镜像仓库地址,即:registry.hub.docker.com镜像仓库地址。

[root@centos7 ~]# docker pull ubuntu
latest: Pulling from library/ubuntu
660c48dd555d: Pull complete
4c7380416e78: Pull complete
421e436b5f80: Pull complete
e4ce6c3651b3: Pull complete
be588e74bd34: Pull complete
Digest: sha256:7c67a2206d3c04703e5c23518707bdd4916c057562dd51c74b99b2ba26af0f79
  docker pull ubuntu相当于docker pull registry.hub.docker.com/ubuntu:lastest命令,即从默认的docker注册服务器仓库中拉去最新的ubuntu镜像,当然也可以从其他注册仓库地址拉取镜像,例如我们从dl.dockerpool.com社区镜像仓库拉取ubuntu镜像:

docker pull dl.dockerpool.com:5000/ubuntu
  2.3 镜像查看
使用docker images可以列出主机已存在的镜像,例如:

[gamaxwin@srv-xjwy-dns-node01 ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              3fa822599e10        11 days ago         204MB
ubuntu              latest              20c44cd7596f        3 weeks ago         123MB
  可以看到,在列出的信息栏中,有以下几个字段信息:

1.镜像来自哪个仓库,比如来自:ubuntu仓库;
2.镜像的标签(tag)信息,比如latest;
3.镜像的ID好,该ID号唯一;
4.镜像的创建时间;
5.镜像的size大小;
  其中镜像的id信息十分重要,它唯一标识了镜像,而tag信息用于标记来自同一个仓库中不同的镜像,例如ubuntu仓库中有多个奖项,通过tag来区分发行版本等信息;当然为了方便使用,也可以使用docker tag命令将现有的镜像添加一个标签(tag),例如为本地的ubuntu最新镜像添加一个新的标签:prod,可以这样操作:

[gamaxwin@srv-xjwy-dns-node01 ~]$ docker tag centos:latest centos:prod
[gamaxwin@srv-xjwy-dns-node01 ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              3fa822599e10        11 days ago         204MB
centos              prod                3fa822599e10        11 days ago         204MB
ubuntu              latest              20c44cd7596f        3 weeks ago         123MB
  可以发现多了一个prod标签镜像,仔细观察会注意到centos:prod标签的镜像id和centos:latest标签的镜像id一致,说明它们都是来自同一个镜像,只是别名不同,多了一种快捷方式而已,如果我们要查看关于该id镜像更多信息可以使用:docker  inspect 镜像id ,如果只需要查看某一下内容加上 “-f” 参数指定属性值即可。
备注:
inspect 收集有关容器和镜像的底层信息:Docker inspect命令可以收集有关容器和镜像的底层信息。这些信息包括

1.容器实例的IP地址
2.端口绑定列表
3.特定端口映射的搜索
4.收集配置的详细信息
  2.4 镜像删除
使用docker rmi命令可以删除镜像,格式:“docker rmi image”,其中image可以是镜像标签或镜像ID,例如删除创建的centos:prod镜像 :

[gamaxwin@srv-xjwy-dns-node01 ~]$ docker rmi centos:prod
Untagged: centos:prod
[gamaxwin@srv-xjwy-dns-node01 ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              3fa822599e10        11 days ago         204MB
ubuntu              latest              20c44cd7596f        3 weeks ago         123MB
[gamaxwin@srv-xjwy-dns-node01 ~]$
  发现centos:prod已经删除,而centos:latest还存在;需要注意的是docker rmi image 当image有多个tag标签时,此命令只删除指定tag镜像标签,不会删除其他镜像tag,而当只有一个tag标签时,使用docker rmi 会彻底删除该镜像,包括该镜像的所有的AUFS层文件,如下所示:

[gamaxwin@srv-xjwy-dns-node01 ~]$ docker rmi ubuntu:latest
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:7c67a2206d3c04703e5c23518707bdd4916c057562dd51c74b99b2ba26af0f79
Deleted: sha256:20c44cd7596ff4807aef84273c99588d22749e2a7e15a7545ac96347baa65eda
Deleted: sha256:928cadf24454047a7a1b8e8d034a539e882ed904d6627b343e2abcd338ae0123
Deleted: sha256:1f7b04df09e72e9b94e923567a168b438d195c4c610a335ed7320cc6dea93c3f
Deleted: sha256:289566599b45e8e2a7264923d3481c6e0e7460232a4e0ed1512528272fb15c70
Deleted: sha256:2eb2bdc452f61ae4703cb67be52a4d595265cecb257f3210647ea1d0bf84a549
Deleted: sha256:788ce2310e2fdbbf81fe21cbcc8a44da4cf648b0339b09c221abacb4cd5fd136
[gamaxwin@srv-xjwy-dns-node01 ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              3fa822599e10        11 days ago         204MB
[gamaxwin@srv-xjwy-dns-node01 ~]$
  上面使用的是根据镜像tag删除镜像,当我们使用使用镜像id删除镜像会是什么情况呢,如下根据镜像id号删除镜像:

[gamaxwin@srv-xjwy-dns-node01 ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              3fa822599e10        11 days ago         204MB
ubuntu              latest              20c44cd7596f        3 weeks ago         123MB
[gamaxwin@srv-xjwy-dns-node01 ~]$ docker rmi 20c44cd7596f
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:7c67a2206d3c04703e5c23518707bdd4916c057562dd51c74b99b2ba26af0f79
Deleted: sha256:20c44cd7596ff4807aef84273c99588d22749e2a7e15a7545ac96347baa65eda
Deleted: sha256:928cadf24454047a7a1b8e8d034a539e882ed904d6627b343e2abcd338ae0123
Deleted: sha256:1f7b04df09e72e9b94e923567a168b438d195c4c610a335ed7320cc6dea93c3f
Deleted: sha256:289566599b45e8e2a7264923d3481c6e0e7460232a4e0ed1512528272fb15c70
Deleted: sha256:2eb2bdc452f61ae4703cb67be52a4d595265cecb257f3210647ea1d0bf84a549
Deleted: sha256:788ce2310e2fdbbf81fe21cbcc8a44da4cf648b0339b09c221abacb4cd5fd136
  可以发现会根据镜像ID号删除镜像是直接删除镜像文件,实际会遇到以下几种情况是不能按照常规方式删除镜像文件本身,此时会提示你需要使用-f参数强制删除


  • 当该镜像id存在多个tag标签时,是无法删除该镜像本身,此时可以删除镜像tag直至镜像id对应的tag仅有一个,如下创建了多个镜像tag,我们根据镜像id删除镜像发现报如下错误:

[gamaxwin@srv-xjwy-dns-node01 ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              3fa822599e10        11 days ago         204MB
ubuntu              latest              20c44cd7596f        3 weeks ago         123MB
ubuntu              prod                20c44cd7596f        3 weeks ago         123MB
[gamaxwin@srv-xjwy-dns-node01 ~]$ docker rmi  20c44cd7596f
Error response from daemon: conflict: unable to delete 3fa822599e10 (must be forced) - image is being used by stopped container  20c44cd7596f
  此时我们使用 “-f” 强制删除,会发现镜像id20c44cd7596f对应的所有的tag以及镜像本身文件全部删除,结果如下:

[gamaxwin@srv-xjwy-dns-node01 ~]$ docker rmi -f 20c44cd7596f
Untagged: ubuntu:latest
Untagged: ubuntu:prod
Untagged: ubuntu@sha256:7c67a2206d3c04703e5c23518707bdd4916c057562dd51c74b99b2ba26af0f79
Deleted: sha256:20c44cd7596ff4807aef84273c99588d22749e2a7e15a7545ac96347baa65eda
Deleted: sha256:928cadf24454047a7a1b8e8d034a539e882ed904d6627b343e2abcd338ae0123
Deleted: sha256:1f7b04df09e72e9b94e923567a168b438d195c4c610a335ed7320cc6dea93c3f
Deleted: sha256:289566599b45e8e2a7264923d3481c6e0e7460232a4e0ed1512528272fb15c70
Deleted: sha256:2eb2bdc452f61ae4703cb67be52a4d595265cecb257f3210647ea1d0bf84a549
Deleted: sha256:788ce2310e2fdbbf81fe21cbcc8a44da4cf648b0339b09c221abacb4cd5fd136
[gamaxwin@srv-xjwy-dns-node01 ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              3fa822599e10        11 days ago         204MB

  • 当根据该镜像创建的容器存在时,镜像文件是不能被删除,如下根据cenots:latest运行一个容器:

[gamaxwin@srv-xjwy-dns-node01 ~]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
acdd2c49d9d8        centos              "/bin/bash"         47 hours ago        Exited (0) 47 hours ago                       quizzical_kalam
[gamaxwin@srv-xjwy-dns-node01 ~]$
  我们尝试去删除centos镜像,会发现报如下错误:

[gamaxwin@srv-xjwy-dns-node01 ~]$ docker rmi 3fa822599e10
Error response from daemon: conflict: unable to delete 3fa822599e10 (must be forced) - image is being used by stopped container acdd2c49d9d8
  接下来使用“-f”参数强制删除,此时看到centos镜像已经被删除,结果如下:

[gamaxwin@srv-xjwy-dns-node01 ~]$ docker rmi -f  3fa822599e10
Untagged: centos:latest
Untagged: centos@sha256:3b1a65e9a05f0a77b5e8a698d3359459904c2a354dc3b25ae2e2f5c95f0b3667
Deleted: sha256:3fa822599e10c5f2080dcf647068c72022b111d31bbec0c5adb8a96e7eb5379b
[gamaxwin@srv-xjwy-dns-node01 ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
  注意:这里不推介使用-f参数强制删除一个存在容器依赖的镜像,因为这样造成一些文件遗留问题,正确的方式是:先删除依赖该镜像所有的容器,再删根据该镜像id删除该镜像本身。
  2.5 镜像创建
创建镜像方法有三种:1.基于已有的镜像创建、2.基于本地模板导入,3.基于dockerfile创建;这里主要讲到前两种方法创建,基于dockerfile创建后面会讲到。


  • 基于已有的镜像的容器创建:
    主要是使用docker commit命令创建,其格式:docker commit  [options]  container  [pepository[:tag]],主要参数选项如下:
    -a, --author="" 提交者信息。
    -m,--message=“” 提交信息
    -p, --pause=“” 提交时暂停容器运行
  下面基于一个容器来创建一个新镜像,首先运行一个容器,以cetons为例,如下运行一个容器:

[gamaxwin@srv-xjwy-dns-node01 ~]$ docker run -it  centos:latest  /bin/bash
[root@e6aee7c0732e /]# touch test
[root@e6aee7c0732e /]# exit
exit
  关于修改内容可以使用docker diff查看:它可以列出容器内发生变化的文件和目录。这些变化包括添加(A-add)、删除(D-delete)、修改(C-change),如下所示:

[gamaxwin@srv-xjwy-dns-node01 ~]$ docker diff  e6aee7c0732e
C /root
A /root/.bash_history
A /test
  此时容器的id号为:e6aee7c0732e,下面使用docker commit 重新提交一个镜像,如下所示:

[gamaxwin@srv-xjwy-dns-node01 ~]$ docker commit -m "add a new file" -a "docker" e6aee7c0732e test
sha256:efb2aa048732df37f82edb1b4da7cd22a1024c34a3575cee792728bb33cd4ca3
[gamaxwin@srv-xjwy-dns-node01 ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                latest              efb2aa048732        8 seconds ago       204MB
centos              latest              3fa822599e10        11 days ago         204MB
  发现新产生了一个镜像id:efb2aa048732,并且仓库为test,仔细观察发现基于已有的容器创建的镜像,不管仓库名还是镜像id或者tag都是全新的,也就是说这个方式创建的镜像是基于AUFS层创建的


  • 基于本地模板导入:
    这种方式可以利用已有的操作系统文件模板导入一个镜像,可以使用openva提供的模板创建,比如,这里下载了一个名为 ubuntu-14.04 的镜像(镜像可以在http://openvz.org/Download/template/precreated)下载,之后使用下命令导入tar.gz的镜像

[root@centos7 ~]# cat ubuntu-14.04-x86_64-minimal.tar.gz  |docker import - ubuntu:zwx
23997a971195cdd826f16a50573e480e1be1679729636178146425cdd46d1b52
[root@centos7 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              zwx                 23997a971195        28 seconds ago      214.9 MB
  2.6 镜像存出和载入


  • 镜像存出:
    镜像存出可以使用docker save将本地镜像存到本地,例如将本地centos镜像导出为centos.tar文件:

[gamaxwin@srv-xjwy-dns-node01 ~]$ docker save -o  centos.tar centos:latest
[gamaxwin@srv-xjwy-dns-node01 ~]$ ls centos.tar
centos.tar

  • 镜像载入:
    镜像载入可以使用docker load将本地文件导入到本地镜像,例如将本地centos镜像文件导入到本地镜像:

[gamaxwin@srv-xjwy-dns-node01 ~]$ docker load --input  centos.tar

[gamaxwin@srv-xjwy-dns-node01 ~]$ docker load < centos.tar
  2.7 镜像上传
镜像上传可以使用docker push命令可以将镜像上传到仓库,如果不指定仓库地址默认为docker hub官方仓库(需要登录)命令格式:docker push name[:tag],列如:

docker push tag test:latest prod:latest
  前面一个 test:latest 是指本地镜像,后面prod:latest指的的是在远程仓库新添加的tag信息,然后是docker push 即可。
  总结:可以发现docker image管理以及相关命令操作docker pull/commit/push/tag 等命令操作和git 操作原理类似,包括其内容的修改,而镜像的导入与导出与linux输出重定向和输入重定向操作相似。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-481444-1-1.html 上篇帖子: docker镜像的使用方法 下篇帖子: 配置docker镜像仓库源
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表