Docker-镜像
镜像是Docker三大核心概念中最为重要的
Docker运行容器前需要本地存在对应的镜像,如果镜像没保存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库
获取镜像
镜像是运行容器的前提,官方的Docker Hub网站已经提供了数十万个镜像供大家开放下载。
可以使用docker pull命令直接从Docker Hub镜像源来下载镜像。该命令的格式为docker pull NAME[:TAG],其中NAME是镜像仓库的名称(用来区分镜像),TAG是镜像的标签(往往用来表示版本信息)。通常情况下,描述一个镜像需要包括“名称+标签”信息
例如,获取一个Ubuntu 14.04系统的基础镜像可以使用如下命令
1 2 3 4 5 6 7 8 9 | 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标签,这会下载仓库中最新版本的镜像
注意:一般来说,镜像的latest标签意味着该镜像的内容会跟踪最新的非稳定版本而发布,内容是不稳定的,从稳定性上考虑,不要再生产环境中忽略镜像的标签信息或使用默认的latest标记的镜像。
下载过程中可以看出,镜像文件一般由若干层(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.04
pull子命令支持的选项主要包括:
-a, --all-tags=true|false:是否获取仓库中的所有镜像,默认为否
下载镜像到本地后,即可随时使用该镜像了,例如利用该镜像创建一个容器,在其中运行bash应用
如下
1 2 3 4 | 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的环境了
查看镜像信息
使用images命令列出镜像
1 2 3 4 5 | 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.04、latest用来标注不同的版本信息。标签只是标记,并不能标识镜像内容
IMAGE ID:镜像的ID(唯一标识镜像),如ubuntu:lastest和ubutu:16.04镜像的ID都是2fa927b5cdd3,说明他们目前实际上指向同一个镜像
CREATED:创建时间,说明镜像最后的更新时间
SIZE:镜像大小,优秀的镜像往往体积都较小
其中镜像ID信息十分重要,它唯一标识了镜像。在使用镜像ID的时候,一般可以使用该ID的前若干个字符组成的可区分串来替代完整的ID
使用tag命令添加镜像标签
为了方便在后续工作中使用特定镜像,还可以使用docker tag命令来为本地镜像添加新的标签。例如添加一个新的newubuntutag:14.04标签
1 2 3 4 5 6 7 8 9 | 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命令添加的标签实际上起到了类似链接的作用
使用inspect命令查看镜像详细信息
使用docker inspect命令可以获取该镜像的详细信息,包括制作者、适应架构,各层的数字摘要等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | 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
1 2 | FengZhendeMacBook-Pro:java FengZhen$ docker inspect -f {{ ".Architecture" }} ubuntu:14.04 amd64 |
使用history命令查看镜像历史
使用history子命令,可以列出各层的创建信息
1 2 3 4 5 6 7 8 | 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选项来输出完整信息
1 2 3 4 5 6 7 8 | 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关键字的镜像,如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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] |
可看到提示
1 2 | 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代替
如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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] |
可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、星级(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等,默认的输出结果将按照星级评价进行排序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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镜像,可以使用如下命令
1 2 | FengZhendeMacBook-Pro:java FengZhen$ docker rmi newubuntutag:14.04 Untagged: newubuntutag:14.04 |
当同一个镜像拥有多个标签的时候,docker rmi命令只是删除该镜像多个标签中的指定标签而已,并不影响镜像文件。因此上述操作相当于只是删除了镜像578c3e61a98c的一个标签而已。
再次查看本地镜像,发现ubuntu:14.04的镜像还是存在的
1 2 3 4 5 | 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命令,可以看出它会删除这个镜像文件的所有层
1 2 3 4 5 6 7 8 9 | 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 命令可以看到本机上存在的所有容器
1 2 3 | 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会提示有容器正在运行,无法删除
1 2 | 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参数
1 2 3 4 | FengZhendeMacBook-Pro:java FengZhen$ docker rmi -f ubuntu:14.04 Untagged: ubuntu:14.04 Untagged: ubuntu@sha256:885bb6705b01d99544ddb98cbe4e4555d1efe1d052cef90832e72a0688ac6b37 Deleted: sha256:578c3e61a98cb5720e7c8fc152017be1dff373ebd72a32bbe6e328234efc8d1a |
注意,通常并不推荐使用-f参数来强制删除一个存在容器依赖的镜像。正确的做法是先删除依赖该镜像的所有容器,再来删除镜像。
先删除容器ID为71ec56c543c4
1 2 | FengZhendeMacBook-Pro:java FengZhen$ docker rm 71ec56c543c4 71ec56c543c4 |
再使用ID来删除镜像,此时会正常打印出删除的各层信息
1 2 3 4 5 6 7 8 9 | 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文件,之后退出
1 2 3 4 5 6 | 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
此时查看镜像列表,会发现新创建的镜像已经存在了。
1 2 3 4 5 | 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文件。
1 2 3 | 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的模板压缩包,之后使用一下命令导入
1 2 3 4 5 6 7 8 9 | 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覆盖掉
修改下,先将新导入的镜像删除
1 2 | FengZhendeMacBook-Pro:java FengZhen$ docker rmi ubuntu:14.04 Untagged: ubuntu:14.04 |
重命名
docker tag 578c3e61a98c ubuntu:14.04
重新导入
1 2 | FengZhendeMacBook-Pro:java FengZhen$ cat /Users/FengZhen/Downloads/ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu-mini:14.04 sha256:93d765cbffc3270af003f3d192a3b53833acd53bf4063a4a57c670c2e774cd6e |
也可以直接将新导入的重命名
如果本地镜像存在多个镜像标签,比如
1 2 3 4 5 6 7 | 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 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,如下
1 | 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的镜像标签删除
1 2 3 | FengZhendeMacBook-Pro:java FengZhen$ docker rmi ubuntu:14.04 Untagged: ubuntu:14.04 Untagged: ubuntu@sha256:885bb6705b01d99544ddb98cbe4e4555d1efe1d052cef90832e72a0688ac6b37 |
载入
1 2 | FengZhendeMacBook-Pro:java FengZhen$ docker load --input ubuntu_14.04.tar Loaded image: ubuntu:14.04 |
查看本地镜像
1 2 3 4 5 6 7 8 | 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 命令上传镜像
1 2 3 4 5 6 7 8 | 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 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示