镜像是Docker三大核心概念中最为重要的
Docker运行容器前须要本地存在对应的镜像,若是镜像没保存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也能够经过配置,使用自定义的镜像仓库php
镜像是运行容器的前提,官方的Docker Hub网站已经提供了数十万个镜像供你们开放下载。
可使用docker pull命令直接从Docker Hub镜像源来下载镜像。该命令的格式为docker pull NAME[:TAG],其中NAME是镜像仓库的名称(用来区分镜像),TAG是镜像的标签(每每用来表示版本信息)。一般状况下,描述一个镜像须要包括“名称+标签”信息
例如,获取一个Ubuntu 14.04系统的基础镜像可使用以下命令java
FengZhendeMacBook-Pro:java FengZhen$ docker pull ubuntu:14.04 14.04: Pulling from library/ubuntu 28bfaceaff9b: Pull complete ac540055f2f8: Pull complete 2965585ef8b8: Pull complete 2416bb9f3ad2: Pull complete 93b55a6a6807: Pull complete Digest: sha256:885bb6705b01d99544ddb98cbe4e4555d1efe1d052cef90832e72a0688ac6b37 Status: Downloaded newer image for ubuntu:14.04
对于Docker镜像来讲,若是不显式指定TAG,则默认会选择latest标签,这会下载仓库中最新版本的镜像mysql
注意:通常来讲,镜像的latest标签意味着该镜像的内容会跟踪最新的非稳定版本而发布,内容是不稳定的,从稳定性上考虑,不要再生产环境中忽略镜像的标签信息或使用默认的latest标记的镜像。linux
下载过程当中能够看出,镜像文件通常由若干层(layer)组成,28bfaceaff9b这样的串是层的惟一ID,使用docker pull命令下载时会获取并输出镜像的各层信息。当不一样的镜像包括相同的层时,本地仅存储一分内容,减少了须要的存储空间
在使用不一样的镜像仓库服务器的状况下,可能会出现镜像重名的状况。
严格地讲,镜像的仓库名称中还应该添加仓库地址(即registry,注册服务器)做为前缀,咱们默认使用的时Docker Hub服务,该前缀能够省略
例如 docker pull Ubuntu:14.04至关于docker pull registry.hub.docker.com/Ubuntu:14.04
若是从非官方仓库下载,则须要在仓库名称前指定完整的仓库地址。例如从网易蜂巢的镜像源来下载ubuntu:14.04镜像,可使用以下命令
docker pull hub.c.163.com/public/Ubuntu:14.04nginx
pull子命令支持的选项主要包括:
-a, --all-tags=true|false:是否获取仓库中的全部镜像,默认为否
下载镜像到本地后,便可随时使用该镜像了,例如利用该镜像建立一个容器,在其中运行bash应用
以下web
docker run -it ubuntu:14.04 bash FengZhendeMacBook-Pro:java FengZhen$ docker run -it ubuntu:14.04 bash root@3697728743e8:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
已是ubuntu的环境了sql
使用images命令列出镜像docker
FengZhendeMacBook-Pro:java FengZhen$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 14.04 578c3e61a98c 42 hours ago 223MB ubuntu latest 113a43faa138 42 hours ago 81.2MB nginx latest cd5239a0906a 45 hours ago 109MB
在列出的信息中,能够看到如下几个字段信息
REPOSITORY:来自于哪一个仓库,好比ubuntu仓库用来保存ubuntu系列的基础镜像
TAG:镜像的标签信息,好比14.0四、latest用来标注不一样的版本信息。标签只是标记,并不能标识镜像内容
IMAGE ID:镜像的ID(惟一标识镜像),如ubuntu:lastest和ubutu:16.04镜像的ID都是2fa927b5cdd3,说明他们目前实际上指向同一个镜像
CREATED:建立时间,说明镜像最后的更新时间
SIZE:镜像大小,优秀的镜像每每体积都较小
其中镜像ID信息十分重要,它惟一标识了镜像。在使用镜像ID的时候,通常可使用该ID的前若干个字符组成的可区分串来替代完整的IDjson
为了方便在后续工做中使用特定镜像,还可使用docker tag命令来为本地镜像添加新的标签。例如添加一个新的newubuntutag:14.04标签ubuntu
FengZhendeMacBook-Pro:java FengZhen$ docker tag ubuntu:14.04 newUbuntuTag:14.04 Error parsing reference: "newUbuntuTag:14.04" is not a valid repository/tag: invalid reference format: repository name must be lowercase FengZhendeMacBook-Pro:java FengZhen$ docker tag ubuntu:14.04 newubuntutag:14.04 FengZhendeMacBook-Pro:java FengZhen$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE newubuntutag 14.04 578c3e61a98c 42 hours ago 223MB ubuntu 14.04 578c3e61a98c 42 hours ago 223MB nginx latest cd5239a0906a 45 hours ago 109MB
能够看到多了一个newubuntutag:14.04标签的镜像,以后就能够直接使用newubuntutag:14.04来表示这个镜像了。能够看到newubuntutag:14.04镜像的ID跟ubuntu:14.04的彻底一致。他们实际上指向同一个镜像文件,只是别名不一样而已。docker tag命令添加的标签实际上起到了相似连接的做用
使用docker inspect命令能够获取该镜像的详细信息,包括制做者、适应架构,各层的数字摘要等。
FengZhendeMacBook-Pro:java FengZhen$ docker inspect ubuntu:14.04 [ { "Id": "sha256:578c3e61a98cb5720e7c8fc152017be1dff373ebd72a32bbe6e328234efc8d1a", "RepoTags": [ "newubuntutag:14.04", "ubuntu:14.04" ], "RepoDigests": [ "ubuntu@sha256:885bb6705b01d99544ddb98cbe4e4555d1efe1d052cef90832e72a0688ac6b37" ], "Parent": "", "Comment": "", "Created": "2018-06-05T21:21:36.655541773Z", "Container": "c7400e9771375b0166af4a1aa294cc20d73147497224b62978d353713aa5262b", "ContainerConfig": { "Hostname": "c7400e977137", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/sh", "-c", "#(nop) ", "CMD [\"/bin/bash\"]" ], "ArgsEscaped": true, "Image": "sha256:d0cda387c3c3171ae6b7fdb9c6e14e54b43c938dd41fc1877b6ad1feac1f4bc3", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "DockerVersion": "17.06.2-ce", "Author": "", "Config": { "Hostname": "", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "ArgsEscaped": true, "Image": "sha256:d0cda387c3c3171ae6b7fdb9c6e14e54b43c938dd41fc1877b6ad1feac1f4bc3", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": null }, "Architecture": "amd64", "Os": "linux", "Size": 223367926, "VirtualSize": 223367926, "GraphDriver": { "Data": { "LowerDir": "/var/lib/docker/overlay2/95cf58ea97eb479f7942aeeb6a620cf4b1bd1019dfb5d17b0aaa20d5a398d34f/diff:/var/lib/docker/overlay2/90dec2408941a6d7cc4aadb0774510121cf927f07dfa81c3e3f187b8f80c4c6a/diff:/var/lib/docker/overlay2/e6041ed1c1580124e891f0928f5cad622d62f21748c4fb1332aad03ec8bcdaab/diff:/var/lib/docker/overlay2/6076cfa18569a9e4520e9b7881eb3af355223058af3fad8a6fdb6c4cab2b067b/diff", "MergedDir": "/var/lib/docker/overlay2/a00109e35bee4e450a0fcfff9e656ae6d2a1ab7d29d8d3afd3e27c11792e3376/merged", "UpperDir": "/var/lib/docker/overlay2/a00109e35bee4e450a0fcfff9e656ae6d2a1ab7d29d8d3afd3e27c11792e3376/diff", "WorkDir": "/var/lib/docker/overlay2/a00109e35bee4e450a0fcfff9e656ae6d2a1ab7d29d8d3afd3e27c11792e3376/work" }, "Name": "overlay2" }, "RootFS": { "Type": "layers", "Layers": [ "sha256:04964fddc9461e6657e6fb372f96ca77e671871829ed453d933a03c491e70803", "sha256:a4aaef726d022d0d7e49c09bebf4a619d6db41bb05cc21d2f6b86d510e2cf3b3", "sha256:705419d10b1391753cc659618c6c76deae49e55513714025007440a65d4ed3fd", "sha256:6ec525dfd0603634b8e0e7eec752e43f9ab72460f0e3cf29beeba822d708851b", "sha256:70d93396f87f34c5b8fa4080bbf22d06cce8c05341a6b11c2e03c6d4d3959747" ] }, "Metadata": { "LastTagTime": "2018-06-07T14:52:11.7728708Z" } } ]
返回的是一个json格式的消息,若是咱们只要其中一项内容时,可使用参数-f来指定,好比,获取镜像的Architecture
FengZhendeMacBook-Pro:java FengZhen$ docker inspect -f {{".Architecture"}} ubuntu:14.04 amd64
使用history命令查看镜像历史
使用history子命令,能够列出各层的建立信息
FengZhendeMacBook-Pro:java FengZhen$ docker history ubuntu:14.04 IMAGE CREATED CREATED BY SIZE COMMENT 578c3e61a98c 42 hours ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 42 hours ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B <missing> 42 hours ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$… 2.76kB <missing> 42 hours ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B <missing> 42 hours ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 195kB <missing> 42 hours ago /bin/sh -c #(nop) ADD file:3c65bdbcf1318520e… 223MB
过长的命令会被自动截断,可使用--no-trunc选项来输出完整信息
FengZhendeMacBook-Pro:java FengZhen$ docker history --no-trunc=true ubuntu:14.04 IMAGE CREATED CREATED BY SIZE COMMENT sha256:578c3e61a98cb5720e7c8fc152017be1dff373ebd72a32bbe6e328234efc8d1a 42 hours ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 42 hours ago /bin/sh -c mkdir -p /run/systemd && echo 'docker' > /run/systemd/container 7B <missing> 42 hours ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list 2.76kB <missing> 42 hours ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B <missing> 42 hours ago /bin/sh -c set -xe && echo '#!/bin/sh' > /usr/sbin/policy-rc.d && echo 'exit 101' >> /usr/sbin/policy-rc.d && chmod +x /usr/sbin/policy-rc.d && dpkg-divert --local --rename --add /sbin/initctl && cp -a /usr/sbin/policy-rc.d /sbin/initctl && sed -i 's/^exit.*/exit 0/' /sbin/initctl && echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup && echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean && echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean && echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean && echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages && echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes && echo 'Apt::AutoRemove::SuggestsImportant "false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests 195kB <missing> 42 hours ago /bin/sh -c #(nop) ADD file:3c65bdbcf1318520e7af157cb00317c8312ec16bcaf181d0db919c45f0d7a85e in / 223MB
使用docker search 命令能够搜索远程仓库中共享的镜像,默认搜索官方仓库中的镜像。用法为docker search TERM,支持的参数主要包括
--automated=true|false:仅显示自动建立的镜像,默认为否
--no-trunc=true|false:输出信息不截断显示,默认为否
-s, --stars=X:指定仅显示评价为指定星级以上的镜像,默认为0,即输出全部镜像
例如,搜索全部自动建立的评价为3+的带nginx关键字的镜像,以下
FengZhendeMacBook-Pro:java FengZhen$ docker search --automated -s 3 nginx Flag --automated has been deprecated, use --filter=is-automated=true instead Flag --stars has been deprecated, use --filter=stars=3 instead NAME DESCRIPTION STARS OFFICIAL AUTOMATED jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1343 [OK] richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 547 [OK] jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as p… 375 [OK] webdevops/php-nginx Nginx with PHP-FPM 104 [OK] bitnami/nginx Bitnami nginx Docker Image 53 [OK] zabbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server wi… 52 [OK] 1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 35 [OK] tobi312/rpi-nginx NGINX on Raspberry Pi / armhf 19 [OK] blacklabelops/nginx Dockerized Nginx Reverse Proxy Server. 9 [OK] wodby/drupal-nginx Nginx for Drupal container image 9 [OK] webdevops/nginx Nginx container 8 [OK] nginxdemos/hello NGINX webserver that serves a simple page co… 6 [OK] 1science/nginx Nginx Docker images that include Consul Temp… 4 [OK]
可看到提示
Flag --automated has been deprecated, use --filter=is-automated=true instead Flag --stars has been deprecated, use --filter=stars=3 instead
--automated不提倡使用,建议使用--filter=is-automated=true代替
-s建议使用--filter=stars=3代替
以下
FengZhendeMacBook-Pro:java FengZhen$ docker search nginx --filter=stars=3 --filter=is-automated=true NAME DESCRIPTION STARS OFFICIAL AUTOMATED jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1344 [OK] richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 547 [OK] jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as p… 375 [OK] webdevops/php-nginx Nginx with PHP-FPM 105 [OK] bitnami/nginx Bitnami nginx Docker Image 53 [OK] zabbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server wi… 52 [OK] 1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 35 [OK] tobi312/rpi-nginx NGINX on Raspberry Pi / armhf 19 [OK] wodby/drupal-nginx Nginx for Drupal container image 9 [OK] blacklabelops/nginx Dockerized Nginx Reverse Proxy Server. 9 [OK] webdevops/nginx Nginx container 8 [OK] 1science/nginx Nginx Docker images that include Consul Temp… 4 [OK]
能够看到返回了不少包含关键字的镜像,其中包括镜像名字、描述、星级(表示该镜像的受欢迎程度)、是否官方建立、是否自动建立等,默认的输出结果将按照星级评价进行排序。
FengZhendeMacBook-Pro:java FengZhen$ docker search nginx --filter=stars=3 NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 8745 [OK] jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1344 [OK] richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 547 [OK] jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as p… 375 [OK] kong Open-source Microservice & API Management la… 192 [OK] webdevops/php-nginx Nginx with PHP-FPM 105 [OK] kitematic/hello-world-nginx A light-weight nginx container that demonstr… 99 bitnami/nginx Bitnami nginx Docker Image 53 [OK] zabbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server wi… 52 [OK] linuxserver/nginx An Nginx container, brought to you by LinuxS… 35 1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 35 [OK] tobi312/rpi-nginx NGINX on Raspberry Pi / armhf 19 [OK] nginxdemos/nginx-ingress NGINX Ingress Controller for Kubernetes . Th… 11 wodby/drupal-nginx Nginx for Drupal container image 9 [OK] blacklabelops/nginx Dockerized Nginx Reverse Proxy Server. 9 [OK] webdevops/nginx Nginx container 8 [OK] centos/nginx-18-centos7 Platform for running nginx 1.8 or building n… 6 1science/nginx Nginx Docker images that include Consul Temp… 4 [OK] centos/nginx-112-centos7 Platform for running nginx 1.12 or building … 3
使用标签删除镜像
使用docker rmi命令能够删除镜像,命令格式为docker rmi IMAGE [IMAGE..],其中IMAGE能够为标签或ID
例如,要删除掉newubuntutag:14.04镜像,可使用以下命令
FengZhendeMacBook-Pro:java FengZhen$ docker rmi newubuntutag:14.04 Untagged: newubuntutag:14.04
当同一个镜像拥有多个标签的时候,docker rmi命令只是删除该镜像多个标签中的指定标签而已,并不影响镜像文件。所以上述操做至关于只是删除了镜像578c3e61a98c的一个标签而已。
再次查看本地镜像,发现ubuntu:14.04的镜像仍是存在的
FengZhendeMacBook-Pro:java FengZhen$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 14.04 578c3e61a98c 3 days ago 223MB ubuntu latest 113a43faa138 3 days ago 81.2MB nginx latest cd5239a0906a 3 days ago 109MB
但当镜像只剩下一个标签的时候,使用docker rmi命令就会完全删除镜像
例如删除ubuntu:latest的镜像,因为该镜像没有额外的标签指向它,执行docker rmi命令,能够看出它会删除这个镜像文件的全部层
FengZhendeMacBook-Pro:java FengZhen$ docker rmi ubuntu:latest Untagged: ubuntu:latest Untagged: ubuntu@sha256:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6d Deleted: sha256:113a43faa1382a7404681f1b9af2f0d70b182c569aab71db497e33fa59ed87e6 Deleted: sha256:a9fa410a3f1704cd9061a802b6ca6e50a0df183cb10644a3ec4cac9f6421677a Deleted: sha256:b21f75f60422609fa79f241bf80044e6e133dd0662851afb12dacd22d199233a Deleted: sha256:038d2d2aa4fb988c06f04e3af208cc0c1dbd9703aa04905ade206d783e7bc06a Deleted: sha256:b904d425ea85240d6af5a6c6f145e05d5e0127f547f8eb4f68552962df846e81 Deleted: sha256:db9476e6d963ed2b6042abef1c354223148cdcdbd6c7416c71a019ebcaea0edb
使用镜像ID删除镜像
当使用docker rmi命令,而且后面跟上镜像ID(也能够是能进行区分部分ID串前缀)时,会先尝试删除全部指向该镜像的标签,而后删除该镜像文件自己。
注意,当有该镜像建立的容器存在时,镜像文件默认是没法被删除的,例如,先利用ubuntu:14.04镜像建立一个简单的容器来输出一段话
FengZhendeMacBook-Pro:java FengZhen$ docker run ubuntu:14.04 echo 'hello! docker,i am here'
hello! docker,i am here
使用docker ps –a 命令能够看到本机上存在的全部容器
FengZhendeMacBook-Pro:java FengZhen$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 71ec56c543c4 ubuntu:14.04 "echo 'hello! docker…" About a minute ago Exited (0) About a minute ago ecstatic_gates
能够看到后台存在一个退出状态的容器,是刚基于ubuntu:14.04镜像建立的,试图删除该镜像,Docker会提示有容器正在运行,没法删除
FengZhendeMacBook-Pro:java FengZhen$ docker rmi ubuntu:14.04 Error response from daemon: conflict: unable to remove repository reference "ubuntu:14.04" (must force) - container 3697728743e8 is using its referenced image 578c3e61a98c
若是想强行删除镜像,可使用-f参数
FengZhendeMacBook-Pro:java FengZhen$ docker rmi -f ubuntu:14.04 Untagged: ubuntu:14.04 Untagged: ubuntu@sha256:885bb6705b01d99544ddb98cbe4e4555d1efe1d052cef90832e72a0688ac6b37 Deleted: sha256:578c3e61a98cb5720e7c8fc152017be1dff373ebd72a32bbe6e328234efc8d1a
注意,一般并不推荐使用-f参数来强制删除一个存在容器依赖的镜像。正确的作法是先删除依赖该镜像的全部容器,再来删除镜像。
先删除容器ID为71ec56c543c4
FengZhendeMacBook-Pro:java FengZhen$ docker rm 71ec56c543c4 71ec56c543c4
再使用ID来删除镜像,此时会正常打印出删除的各层信息
FengZhendeMacBook-Pro:java FengZhen$ docker rmi 578c3e61a98c Untagged: ubuntu:14.04 Untagged: ubuntu@sha256:885bb6705b01d99544ddb98cbe4e4555d1efe1d052cef90832e72a0688ac6b37 Deleted: sha256:578c3e61a98cb5720e7c8fc152017be1dff373ebd72a32bbe6e328234efc8d1a Deleted: sha256:520e4d96640a482cd5c5be5f42e2941d2d6001262be2e5916420639ed1d4e288 Deleted: sha256:603f8df1d8f7ccc2850f6147923eeb147f5bf5990382955aa19ce9d4fdc7faae Deleted: sha256:701ca6996674b5523da7961585844506ff4eaa30efe40a5421b41473fa190aa1 Deleted: sha256:2278559b727b2777bc71de91abe6f78a330b402cd0c07f77fe9751745ba28ec1 Deleted: sha256:04964fddc9461e6657e6fb372f96ca77e671871829ed453d933a03c491e70803
建立镜像的方法主要有三种
1. 基于已有镜像的容器建立
2. 基于本地模板导入
3. 基于Dockerfile建立
基于已有镜像的容器建立
该方法主要是使用docker commit命令,命令格式为
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
主要选项包括:
-a, --author=””: 做者信息
-c, --change=[] : 提交的时候执行Dockerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等
-m, --message=””: 提交消息
-p, --pause=true: 提交时暂停容器运行
演示如何使用该命令建立一个新镜像。首先启动一个镜像,并在其中进行修改操做,例如建立一个test文件,以后退出
FengZhendeMacBook-Pro:java FengZhen$ docker run -it ubuntu:14.04 /bin/bash root@de56c2499e0f:/# touch test root@de56c2499e0f:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var root@de56c2499e0f:/# exit exit
此容器ID为de56c2499e0f
此时该容器跟原ubuntu14.04镜像相比,已经发生了改变,可使用docker commit命令来提交为一个新的镜像。提交时可使用ID或名称来指定容器
FengZhendeMacBook-Pro:java FengZhen$ docker commit -m "Added a new file" -a "Docker FengZhen" de56c2499e0f test:0.1
sha256:3f520588bfe80d30c5964c07bba702bf67b2cc3cd9db1464992b7f474a2c558e
顺利的话,会返回新建立的镜像的ID,例如3f520588bfe80d30c5964c07bba702bf67b2cc3cd9db1464992b7f474a2c558e
此时查看镜像列表,会发现新建立的镜像已经存在了。
FengZhendeMacBook-Pro:java FengZhen$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE test 0.1 3f520588bfe8 59 seconds ago 223MB ubuntu 14.04 578c3e61a98c 3 days ago 223MB nginx latest cd5239a0906a 3 days ago 109MB
启动新镜像,会发现存在该test文件。
FengZhendeMacBook-Pro:java FengZhen$ docker run -it test:0.1 /bin/bash root@932e7ddfe656:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var
基于本地模板导入
用户能够直接从一个操做系统模板文件导入一个镜像,主要使用docker import命令,命令格式为
docker import [OPTIONS] file|URL|-[REPOSITORY[;TAG]]
要直接导入一个镜像,可使用OpenVZ提供的模板来建立,或者用其它已导出的镜像模板来建立。OPENVZ模板的下载地址为
https://openvz.org/Download/template/precreated
例如,下载了ubuntu-14.04的模板压缩包,以后使用一下命令导入
FengZhendeMacBook-Pro:java FengZhen$ cat /Users/FengZhen/Downloads/ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04 sha256:9b485381ee643d26cc1bd53f47d75feb60740a57edb1b91a6f1cd2a89b7c12ec FengZhendeMacBook-Pro:java FengZhen$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 14.04 9b485381ee64 6 seconds ago 215MB test 0.1 3f520588bfe8 17 minutes ago 223MB ubuntu <none> 578c3e61a98c 3 days ago 223MB nginx latest cd5239a0906a 3 days ago 109MB
发现会把以前的版本TAG覆盖掉
修改下,先将新导入的镜像删除
FengZhendeMacBook-Pro:java FengZhen$ docker rmi ubuntu:14.04 Untagged: ubuntu:14.04
重命名
docker tag 578c3e61a98c ubuntu:14.04
从新导入
FengZhendeMacBook-Pro:java FengZhen$ cat /Users/FengZhen/Downloads/ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu-mini:14.04 sha256:93d765cbffc3270af003f3d192a3b53833acd53bf4063a4a57c670c2e774cd6e
也能够直接将新导入的重命名
若是本地镜像存在多个镜像标签,好比
FengZhendeMacBook-Pro:java FengZhen$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu-mini 14.04 93d765cbffc3 About a minute ago 215MB test 0.1 3f520588bfe8 22 minutes ago 223MB ubuntu-new 14.04 578c3e61a98c 3 days ago 223MB ubuntu 14.04 578c3e61a98c 3 days ago 223MB nginx latest cd5239a0906a 3 days ago 109MB
存在ubuntu:14.04和ubuntu-new:14.04,ubuntu-new:14.04是经过tag命令新建的镜像标签docker tag ubuntu:14.04 ubuntu-new:14.04
此时若是使用tag对指定的镜像ID进行仓库:TAG重命名,会再新建一个镜像标签
FengZhendeMacBook-Pro:java FengZhen$ docker tag 578c3e61a98c ubuntu-edit:14.04
FengZhendeMacBook-Pro:java FengZhen$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu-mini 14.04 93d765cbffc3 2 minutes ago 215MB
test 0.1 3f520588bfe8 23 minutes ago 223MB
ubuntu-edit 14.04 578c3e61a98c 3 days ago 223MB
ubuntu-new 14.04 578c3e61a98c 3 days ago 223MB
ubuntu 14.04 578c3e61a98c 3 days ago 223MB
nginx latest cd5239a0906a 3 days ago 109MB
会发现多了一个ubuntu-edit:14.04镜像标签
用户可使用docker save 和 docker load命令来存出和载入镜像
存出镜像
若是要导出镜像到本地文件,可使用docker save命令。例如,导出本地的ubuntu:14.04镜像为文件ubuntu_14.04.tar,以下
FengZhendeMacBook-Pro:java FengZhen$ docker save -o ubuntu_14.04.tar ubuntu:14.04
以后就能够经过复制ubuntu_14.04.tar文件将镜像分享给他人
载入镜像
可使用docker load将导出的tar文件再导入到本地镜像库,例如从文件ubuntu_14.04.tar导入镜像到本地镜像列表,以下
先将本地标签为ubuntu:14.04的镜像标签删除
FengZhendeMacBook-Pro:java FengZhen$ docker rmi ubuntu:14.04 Untagged: ubuntu:14.04 Untagged: ubuntu@sha256:885bb6705b01d99544ddb98cbe4e4555d1efe1d052cef90832e72a0688ac6b37
载入
FengZhendeMacBook-Pro:java FengZhen$ docker load --input ubuntu_14.04.tar Loaded image: ubuntu:14.04
查看本地镜像
FengZhendeMacBook-Pro:java FengZhen$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu-mini 14.04 93d765cbffc3 16 minutes ago 215MB test 0.1 3f520588bfe8 37 minutes ago 223MB ubuntu-edit 14.04 578c3e61a98c 3 days ago 223MB ubuntu-new 14.04 578c3e61a98c 3 days ago 223MB ubuntu 14.04 578c3e61a98c 3 days ago 223MB nginx latest cd5239a0906a 3 days ago 109MB
发现已经导入成功。
导入也可使用
docker load < ubuntu_14.04.tar
可使用docker push命令上传镜像到仓库,默认上传到Docker Hub官方仓库(须要登陆)。命令格式以下
docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
用户在Docker Hub网站注册后能够上传自制的镜像。例如用户user上传本地的test:latest镜像,能够先添加新的标签user/test:latest,而后用docker push 命令上传镜像
docker tag test:latest user/test:latest docker push user/test:latest FengZhendeMacBook-Pro:java FengZhen$ docker tag nginx:latest fengzhen/nginx:latest FengZhendeMacBook-Pro:java FengZhen$ docker push fengzhen/nginx:latest The push refers to repository [docker.io/fengzhen/nginx] 3ff93588120e: Preparing 24ee0a3fd4b9: Preparing d626a8ad97a1: Preparing