docker 镜像标签镜像的几个常见标签分别表示什么

latest 标签在Docker 中的作用是什么?
导读本文介绍了Docker中的一个小知识:latest标签,由于它的字面意思是“最新的”,所以很多时候也容易被误解,其实latest就是个普通标签,不要期望它是最新或最稳定的版本。它只是个名字,没有其它附加作用,更不会自动更新。:)
在Docker中,最容易产生误解的部分应该是latest这个标签。困惑主要是由于这个名字造成的,因为字面意思并不能表达它的真正含义。在本文中,我们来学习下latest标签的真正作用和如何正确使用它。
通常有两种方式来对镜像打标签:使用docker tag命令或者是在执行docker build的时候用-t来传递参数。在这两种情况下,参数的形式通常是repository_name:tag_name,例如:docker tag myrepo:mytag。如果这个资源库被上传到了Docker Hub,资源库的名字会加上一个由Docker Hub用户名和斜线组成的前缀,例如:amouat/myrepo:mytag。如果没有添加tag部分的参数,例如:docker tag myrepo:1.0 myrepo,Docker会自动的给它latest标签。前面这些内容或许你已经熟知,其实它也就这点内容,并没有什么神奇的地方。
不能因为镜像的标签是latest就认为这是资源库中最新的镜像。只有这个资源库的拥有者约定这样,拥有latest标签的镜像才一定是最新的镜像。例如,我可以轻易地把一个过时的镜像变成带有latest标签的镜像,例如:
这里带latest标签的镜像与0.9版本的镜像是一样的,都是两周前的版本,然而1.0的镜像是一分钟以前的。
为什么这个标签让很多人迷惑,其实比较容易理解。‘just pull the latest image’ 这句话的意思是获取带有latest标签的镜像还是获取最新的镜像?这两者是否是一样呢?它们是不是资源库中最新的镜像呢?是不是最新的稳定版镜像或者是最新的开发版镜像呢?
更糟糕的是,很多人似乎认为latest标签会自动更新,也就是说如果我获取一个带有latest标签的镜像,Docker会在每次运行之前去检查它是不是最新的版本。这是绝对不会出现的情况,就像其它的标签一样,你需要去手工决定Docker获取最新版本的镜像。
困惑并不仅仅是这些。如果我从资源库docker pull一个镜像却没指定标签,会发生什么呢?如果你认为会获取下所有的镜像,那么就错了,它只会获取下来带有latest标签的那个。如果你需要获取全部镜像,需要加上-a标志。 如果你在资源库执行了pull操作,却没带latest标签,会发生什么呢?如下所示:
$ docker pull amouat/myrepoPulling repository amouat/myrepo 12:04:06 Tag latest not found in repository amouat/myrepo
意料之中的是Docker给出了错误信息。但是我认为你不知道这其中发生了什么。一个更令人讨厌的是latest标签隐藏了其它的标签,假设你要下载带latest标签的debian镜像。哪个是它的版本呢?
$ docker images debianREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEdebian latest 4d6ce913b130 4 days ago 84.98 MB
额,不知道。事实上是7.8 wheezy版本。
我认为Docker在下载镜像时应该把所有的标签都带上,但是我不知道为什么它没有这么做。现在的情况是用户可以拥有同一个镜像的不同版本因为服务器上用标签来标示。例如:如果wheezy和latest都在Hub上更新了,而我只获取了更新后的wheezy版本debian,那么尽管在Hub上他们可以被区分开,但是我的wheezy标签将会比本地的latest标签的版本新。
上述只是覆盖了latest的大部分语义以及它造成的常见误解。这种情况怎么能够改善呢?个人认为,可以取消latest标签并用一个更接近其字面意思的词来代替,例如default。我也希望可以看到一些改进标签原作方式的工作,例如同时更新一个镜像的全部标签。与此同时,我也强烈建议资源库管理员去警惕这个latest标签并彻底废弃它。
原文来自:http://www.linuxprobe.com/latest-ticket-docker.html
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点Posts - 97,
Articles - 4,
Comments - 30
记录和总结web开发技术的点点滴滴...
04:46 by wish123, ... 阅读,
本文从一种使用场景来引出docker,并讨论了什么是镜像,容器,仓库,以及docker的相关概念。
试想一种使用场景:
我的wordpress 博客网站现在部署在阿里云服务器上,但是在后期的使用中我有可能有这样一种需求,阿里云太贵,我可能实在付不起每月月租,想把我的服务迁到其他的云服务上,而又想完整的将我的wordpress服务和数据从阿里云迁出,并将其部署到另外的云服务上。那么我怎样解决这个问题?
第一种方案:在新主机上部署一套环境,然后将项目目录和mysql服务倒出,这种方法比较费力,而且由于相关依赖包比价复杂,容易出错。
第二种方案:在主机上安装一个KVM之类的虚拟机,可以将wordpress服务部署在KVM的虚拟机上,当我想迁出服务时我就将虚拟机的相关文件倒出,但是由于云服务主机的配置不是很高,才1核1G。这样就会耗费我很多的资源,我的wordpress明明可以跑在宿主机上,但是现在却要跑在虚拟机里。那么有没有什么方法可以解决我的问题?
方案四:使用Docker:Build, Ship and Run Any App, Anywhere!
什么是 Docker与Docker官方相关技术简介(可略读):
Docker是一套轻量级操作系统虚拟化解决方案,它由go语言编写。它基于Linux容器技术(LXC),Namespace,Cgroup,UnionFS(联合文件系统)等技术。
namespace(命名空间):命名空间是 Linux 内核一个强大的特性。每个容器都有自己单独的名字空间,运行在其中的应用都像是在独立的操作系统中运行一样。名字空间保证了容器之间彼此互不影响。docker实际上一个进程容器,它通过namespace实现了进程和进程所使用的资源的隔离。使不同的进程之间彼此不可见。我们可以把Docker容器想像成进程+操作系统除内核之外的一套软件。
cgroup(控制组):是 Linux 内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争。控制组技术最早是由 Google 的程序员 2006 年起提出,Linux 内核自 2.6.24 开始支持。控制组可以提供对容器的内存、CPU、磁盘 IO 等资源的限制和审计管理。
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对 文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。另外,不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。Docker 中使用的 AUFS(AnotherUnionFS)就是一种 Union FS。 AUFS 支持为每一个成员目录(类似 Git 的分支)设定只读(readonly)、读写(readwrite)和写出(whiteout-able)权限, 同时 AUFS 里有一个类似分层的概念, 对只读权限的分支可以逻辑上进行增量地修改(不影响只读部分的)。
Docker 目前支持的 Union 文件系统种类包括 AUFS, btrfs, vfs 和 DeviceMapper。
谈谈我的理解
1.Docker的生命周期:
Docker的生命周期包含三个部分,镜像,容器,仓库,我们可以把镜像,容器想像成java的类和对象,即容器是由镜像实例化而来的。也就是说我们想使用装有相关软件的镜像,首先要把镜像创建成容器。现在是不是对镜像,容器,仓库这些概念还存在一些困惑?那么让我们动手体验一下docker的神奇,然后慢慢理解这些概念。
2.Docker的安装:
对于docker的安装,docker官网已经给出了Linux各发行版所对应的安装方法,可以参照这里:& 下面我以mac为例讲一下docker的安装:
由于docker要使用LXC,namespace,cgroup等Linux内核相关技术,而mac又是基于unix的,所以要使用boot2docker来使用docker,boot2docker实际上是一个Linux的轻量级发行版,一共24M大小,完全运行于内存中。但有一个问题,那就是下载它需要FQ,so&已将其安装文件放到了百度云盘中,想下载的可以点击下载。另外boot2docker需要运行在virtual Box上,所以请先下载virtualBox。安装之后直接点击如下图标:
此时会出现一个终端,并进行一些初始化操作,待期完成后,运行如下命令:
bash&3.2$ boot2docker ssh
既可以登录到boot2docker,boot2docker已经为我们预安装好docker相关环境。我们可以运行如下命令查看docker相关版本信息:
docker@boot2docker:~$ docker version
Client version: 1.3.1
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): 4e9bbfa
OS/Arch (client): linux/amd64
Server version: 1.3.1
Server API version: 1.15
Go version (server): go1.3.3
Git commit (server): 4e9bbfa
下面让我们在boot2docker中下载第一个docker镜像:我们下载镜像可以从docker官方为我们提供的dockerHub上下载,但由于dockerHub的下载速度非常慢,所以这里推荐个不错的国内源:&。我们可以使用docker&&pull命令来从此源下载镜像:
docker pull docker.cn/docker/centos:centos6
3.理解Docker的生命周期中的镜像:
在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载,如下图:
docker@boot2docker:~$ docker pull docker.cn/docker/centos:centos6
Pulling repository docker.cn/docker/centos
70441cac1ed5: Download complete
c5a: Download complete
5b12ef8fd570: Download complete
Status: Image is up to date for docker.cn/docker/centos:centos6
那么docker的镜像到底是什么呢?我们来解释一下docker的镜像的概念。
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是上文说到的UnionFS。在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。Docker在bootfs之上的一层是rootfs(根文件系统)。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
docker镜像的层级结构图:
那么docker的rootfs与传统意义的rootfs不同之处到底是什么呢?
传统的Linux加载bootfs时会先将rootfs设为read-only,然后在系统自检之后将rootfs从read-only改为read-write。然后我们就可以在rootfs上进行写和读的操作了。但docker的镜像却不是这样,他在bootfs自检完毕之后并不会把rootfs的read-only改为read-write。而是利用union mount(UnionFS的一种挂载机制)将一个或多个read-only的rootfs加载到之前的read-only 的rootfs层之上。并在加载了这么多层的rootfs之后,仍然让它看起来只像一个文件系统,在docker的体系里把union mount的这些read-only层的rootfs叫做docker的镜像(image)。请注意,此时的每一层rootfs都是read-only的,也就是说我们此时还不能对其进行操作,那么我们怎样对其进行读写操作呢?
答案是将docker镜像进行实例化,就是上文说的从镜像(image)变成容器(container)的过程,当镜像被实例化为容器之后,系统会为在一层或是多层的read-only的rootfs之上分配一层空的read-write的rootfs。而这个分配的动作是由docker&&run命令发起的,我们可以用如下命令创建一个容器:
docker run &t &i docker.cn/docker/centos:centos6 /bin/bash
此时我们已经进入到容器,此处要说明一下,我们使用的&的镜像实际上是在dockerHub提供的镜像之上进行了一些修改,来使我们可以更轻松的使用镜像,比如&会把/etc/skel/.b* 文件拷贝到/root 目录之下等等,也就是说docker.cn是在空的那层rootfs(read-write)对底层的rootfs(read-only)进行了修改,那么问题来了,上文不是说底层的rootfs是read-only的吗?那为什么docker.cn可以对它进行修改?并且还能把修改后的镜像保存起来?这看起来好像非常的矛盾。
其实这并不矛盾,当我们将一个镜像实例化为一个容器之后,docker会在read-only 的rootfs之上分配一层空的read-write的rootfs,我们对文件系统的改变实际上是在空的这层rootfs(read-write)上发生的。打个比方,如果你想修改一个文件,系统实际上是将这个在read-only层的rootfs的文件拷贝到read-write层的rootfs之中,然后对它进行修改,但read-only层的文件并不会被修改,依然存在于read-only层之中,只不过是在read-write层下被隐藏了。这种模式被称为copy on write。这是unionFS的特性。也是docker的强大之处,为什么说强大呢?它允许镜像被继承,也就是说我们想生成一套虚拟环境不用从零开始了,而只要在一个相对完善的基础环境之上来创建我们的虚拟环境就可以了,比如我们想生成一个具有tomcat环境的镜像,只要在一个装有java环境的镜像之上来创建就可以了。这也是docker便捷性的体现。
4.何为容器
上文已经解释了什么是docker的镜像。那么什么又是容器呢?我们刚才使用docker run命令已经创建了一个docker容器,我们先来解释一下刚才那条命令:
docker run &t &i docker.cn/docker/centos:centos6 /bin/bash
docker run:将镜像实例化成一个容器,有点像java中的new。
docker run的两个参数:
& & & -i参数: 是以交互模式启动容器
& & & -t参数: 分配一个tty终端
后面还跟了一条命令 /bin/bash,指要在容器中运行的命令
我们现在在容器中运行top命令:
top & 20:16:27 up 16:38, 0 users, load average: 0.00, 0.01, 0.05
Tasks: 2 total, 1 running, 1 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 2056668k total, 336912k used, 1719756k free, 46280k buffers
Swap: 1438672k total, 0k used, 1438672k free, 234792k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 14784 3056 2704 S 0.0 0.1 0:00.06 bash
15 root 20 0 14952 1944 1744 R 0.0 0.1 0:00.14 top
然后我们会看到docker容器中只运行了两个进程:这与我们常看到的Linux系统进程貌似不一样,它并没有init进程,然后我们在保持原有终端不变的情况下,再开一个终端,然后登录到boot2docker中(使用命令:boot2docker ssh),然后运行如下命令:
docker@boot2docker:~$ ps &ef | grep top
2010 root top
2052 docker grep top
此时我们可能会比较奇怪,我们并没有在boot2docker中运行top,那么这个top进程是哪里来的呢?
这个top进程就是我们在容器中运行的top,这时你可能已经明白了,其实docker容器中运行的进程实际上就是宿主机上的进程。docker实际上使用了命名空间(namespace)来对进程进行隔离,使不同namespace的进程彼此不可见,同时使用cgroup来对彼此隔离的进程的资源进行限制,docker的容器(container)其实就是一个进程的容器,而并不是一个全虚拟化的操作系统,所以他不会有什么init进程。docker将进程、进程所需要的操作系统、运行环境称为容器。所以它比传统的基于hypervisor的虚拟机拥有更高的效率,并使用更低的资源。它实际上是一个内核级别的虚拟化技术,容器还是在使用宿主机的内核,为了证实上述内容,我们可以在容器中用如下命令查看docker的内核版本:
[root@5b3a /]# uname &a
Linux 5b3a 3.16.4&tinycore64 #1 SMP Thu Oct 23 16:14:24 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
&你会发现docker容器使用的内核版本与宿主机相同,然后运行如下命令:
[root@5b3a /]# cat /etc/redhat&release
CentOS release 6.6 (Final)
你会发现他的发行版是centos6.6。
&5.什么是镜像仓库
很简单:它就是一个存储和共享镜像文件的地方。
附录1.docker与传统虚拟机的对比:
& & & &特性
& & & & & & & & & & & &&容器
& & & & & & &&虚拟机
& & & &启动
& & & & & & & & & & & & & 秒级
& & & & & & & &分钟级
& & &硬盘使用
& & & & & & & & & &一般为MB
& & & & & &一般为GB
& & & 性能
& & & & & & & & & & &接近原生
& & & & & & & & &弱于
& &系统支持量
& & &单机支持上千个容器
& & & & 一般几十个
附录2.docker使用命名空间(namespace)详解:
名字空间是 Linux 内核一个强大的特性。每个容器都有自己单独的名字空间,运行在其中的应用都像是在独立的操作系统中运行一样。名字空间保证了容器之间彼此互不影响。
pid 名字空间
不同用户的进程就是通过 pid 名字空间隔离开的,且不同名字空间中可以有相同 pid。所有的 LXC 进程在 Docker 中的父进程为Docker进程,每个 LXC 进程具有不同的名字空间。同时由于允许嵌套,因此可以很方便的实现嵌套的 Docker 容器。
net 名字空间
有了 pid 名字空间, 每个名字空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net 名字空间实现的, 每个 net 名字空间有独立的 网络设备, IP 地址, 路由表, /proc/net 目录。这样每个容器的网络就能隔离开来。Docker 默认采用 veth 的方式,将容器中的虚拟网卡同 host 上的一 个Docker 网桥 docker0 连接在一起。
ipc 名字空间
容器中进程交互还是采用了 Linux 常见的进程间交互方法(interprocess communication & IPC), 包括信号量、消息队列和共享内存等。然而同 VM 不同的是,容器的进程间交互实际上还是 host 上具有相同 pid 名字空间中的进程间交互,因此需要在 IPC 资源申请时加入名字空间信息,每个 IPC 资源有一个唯一的 32 位 id。
mnt 名字空间
类似 chroot,将一个进程放到一个特定的目录执行。mnt 名字空间允许不同名字空间的进程看到的文件结构不同,这样每个名字空间 中的进程所看到的文件目录就被隔离开了。同 chroot 不同,每个名字空间中的容器在 /proc/mounts 的信息只包含所在名字空间的 mount point。
uts 名字空间
UTS(&UNIX Time-sharing System&) 名字空间允许每个容器拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非 主机上的一个进程。
user 名字空间
每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。Docker镜像详解(3) - 简书
Docker镜像详解(3)
镜像是Docker的三大核心概念之一。
Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认镜像
仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。
本篇文章要讲的是围绕镜像这一核心概念的具体操作,包含以下几个方面:
如何使用pull命令从Docker Hub仓库中下载镜像文件到本地
如何查看本地已有的镜像信息
如何在远端仓库使用search命令进行搜索和过滤
如何删除镜像标签和镜像文件
如何创建用户定制的镜像并且保存为外部文件,最后如何向Docker Hub仓库推送自己的镜像文件。
3.1 获取镜像
镜像是Docker容器运行的前提。
我们可以使用docker pull命令从网络上下载镜像。该命令的格式为docker pull NAME[:TAG]。对于Docker镜像来说,如果不显式地指定TAG,则默认会选择latest标签,即下载仓库中最新版本的镜像。
[root@private_vpn docker_test]# pwd
/docker_test
[root@private_vpn docker_test]# ls -l
[root@private_vpn docker_test]# docker pull ubuntu
Using default tag: latest
Trying to pull repository docker.io/library/ubuntu ...
latest: Pulling from docker.io/library/ubuntu
660c48dd555d: Pull complete
4c: Pull complete
421e436b5f80: Pull complete
e4ce6c3651b3: Pull complete
be588e74bd34: Pull complete
Digest: sha256:7c67a03e5cbdddd51c74b99b2ba26af0f79
[root@private_vpn docker_test]# ls -l
[root@private_vpn docker_test]# docker images
REPOSITORY
docker.io/ubuntu
20c44cd7596f
7 days ago
docker.io/centos
d123f4e55e12
3 weeks ago
根据上面的显示可以看出,pull完镜像后并没有在当前目前保存下一个文件,然后使用docker images命令可以看出刚才pull下的镜像。
参数释义:
REPOSITORY: 来自哪个仓库,比如ubuntu仓库、centos仓库
TAG: 镜像的标签信息,如 latest
IMAGE ID: 镜像的ID号(唯一)
CREATE: 镜像创建的时间
SIZE: 镜像的大小
为了更方便的在后续工作种使用某个镜像,还可以使用docker tag命令位本地镜像添加新的标签。
docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)
[root@private_vpn docker_test]# docker tag d123f4e55e12 docker.io/centos:CentOS7
[root@private_vpn docker_test]# docker images
REPOSITORY
docker.io/ubuntu
20c44cd7596f
7 days ago
docker.io/centos
d123f4e55e12
3 weeks ago
docker.io/centos
d123f4e55e12
3 weeks ago
查看镜像本地已有的镜像,比较简单,一条命令:
docker images
3.3 使用search命令进行搜索远端仓库镜像
使用docker search 命令可以搜索远端仓库中共享的镜像,默认搜索官方仓库中的镜像。用法为docker search TERM,支持的参数主要包括:
--automated=true|false: 仅显示自动创建的镜像,默认为否
--no-trunc=true|false: 输出信息不截断显示,默认为否
-s,--stars=X: 指定只显示评价为指定星级以上的镜像,默认为0,即输出所有镜像。
eg: 搜索所有自动创建的评价为3+的带nginx关键字的镜像,如下所示:
docker search --automated -s 3 nginx
3.4 删除镜像
使用镜像ID删除镜像
当使用docker rmi
命令后面跟上镜像ID(也可以是ID能进行区分的部分前缀串或镜像的标签)时,会尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。
[root@private_vpn docker_test]# docker tag d123f4e55e12 docker.io/centos:CentOS7
[root@private_vpn docker_test]# docker images
REPOSITORY
docker.io/ubuntu
20c44cd7596f
7 days ago
docker.io/centos
d123f4e55e12
3 weeks ago
docker.io/centos
d123f4e55e12
3 weeks ago
[root@private_vpn docker_test]# docker rmi d123f4e55e12
Error response from daemon: conflict: unable to delete d123f4e55e12 (must be forced) - image is referenced in one or more repositories
[root@private_vpn docker_test]#
[root@private_vpn docker_test]# docker rmi -f
d123f4e55e12
Untagged: docker.io/centos:CentOS7
Untagged: docker.io/centos:latest
Untagged: docker.io/centos@sha256:fbd9c761a81b26e49cc9e3c9631c58cfca
Deleted: sha256:d123f4e55ecbcf576e4f1ef022cfd0b1
Deleted: sha256:cf941ace87ed24c564fb3f
根据上面可以看出先删除了我新创建的tag,然后删除镜像文件本身,值得注意的是另外添加了标签的镜像在常规删除的时候会报错,只有强制删除才起作用。
注意:当有该镜像创建的容器存在时,镜像文件默认是无法被删除的,例如:
现在我来删除已经存在的ubuntu镜像:
[root@private_vpn docker_test]# docker ps -a
CONTAINER ID
ebc03d33db4e
20c44cd7596f
"/bin/bash"
9 minutes ago
Exited (1) 8 minutes ago
loving_mahavira
[root@private_vpn docker_test]# docker rmi 20c44cd7596f
Error response from daemon: conflict: unable to delete 20c44cd7596f (must be forced) - image is being used by stopped container ebc03d33db4e
看得出无法删除。那就试试强制删除,对于正在被容器使用的镜像慎用。
[root@private_vpn docker_test]# docker
rmi -f 20c44cd7596f
Untagged: docker.io/ubuntu:latest
Untagged: docker.io/ubuntu@sha256:7c67a03e5cbdddd51c74b99b2ba26af0f79
Deleted: sha256:20c44cdaefde15abaa65eda
[root@private_vpn docker_test]# docker ps -a
CONTAINER ID
ebc03d33db4e
20c44cd7596f
"/bin/bash"
11 minutes ago
Exited (1) 10 minutes ago
loving_mahavira
[root@private_vpn docker_test]# docker images
REPOSITORY
看的出来镜像已经被删除,容器还在运行。
进入容器:
[root@private_vpn docker_test]# docker attach ebc03d33db4e
You cannot attach to a stopped container, start it first
可以看出此时容器已经进不去了,所以对于被容器使用的镜像的删除要慎重。
对于以上的实验,很多命令暂时未涉及,后面会讲到。此篇文章的例子主要是说明容器和镜像的关系。
综上,如果我们要删除镜像正确的操作步骤应该是:
先确认机器上存在的容器。
docker ps -a
然后删除依赖镜像的容器
docker rm 容器ID
最后再删除相关镜像文件
docker rmi 镜像ID
[root@private_vpn docker_test]# cat /tmp/docker.txt
[root@private_vpn docker_test]# docker images
REPOSITORY
docker.io/centos
d123f4e55e12
3 weeks ago
[root@private_vpn docker_test]# docker run -t -i d123f4e55e12 /bin/bash
[root@ef6e /]# ls -l /tmp/
-rwx------ 1 root root 836 Sep 11 15:53 ks-script-q6TWGF
-rw------- 1 root root
0 Sep 11 15:51 yum.log
[root@ef6e /]#
上面看出我已经进入到新启动的容器内了。
exit退出容器
然后按照上面的步骤来正确的删除容器。
[root@private_vpn docker_test]# docker ps -a
CONTAINER ID
d123f4e55e12
"/bin/bash"
2 minutes ago
Exited (127) About a minute ago
infallible_boyd
[root@private_vpn docker_test]# docker rm ef6e
[root@private_vpn docker_test]# docker ps -a
CONTAINER ID
[root@private_vpn docker_test]# docker images
REPOSITORY
docker.io/centos
d123f4e55e12
3 weeks ago
[root@private_vpn docker_test]# docker rmi d123f4e55e12
Untagged: docker.io/centos:latest
Untagged: docker.io/centos@sha256:fbd9c761a81b26e49cc9e3c9631c58cfca
Deleted: sha256:d123f4e55ecbcf576e4f1ef022cfd0b1
Deleted: sha256:cf941ace87ed24c564fb3f
[root@private_vpn docker_test]#
[root@private_vpn docker_test]# docker images
REPOSITORY
测试成功。
3.5 创建镜像
创建镜像的方法主要有3种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。
此处先熟悉下前两种方式,而基于Dockerfile的创建方法会在后面详细说明。
1.基于已有镜像的容器创建
该方法主要是使用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=ture:
提交时暂停容器运行。
下面将演示如何使用该命令创建一个新镜像。首先,启动一个镜像,并在其中进行修改操作,可以创建一个test文件,之后退出:
基于centos镜像创建一个容器,并直接(-d参数)放入后台运行
[root@private_vpn ~]# docker images
REPOSITORY
docker.io/nginx
9e7424e5dbae
13 days ago
docker.io/nuagebec/ubuntu
7c2ea61fd57e
2 weeks ago
docker.io/ubuntu
20c44cd7596f
2 weeks ago
docker.io/centos
d123f4e55e12
4 weeks ago
[root@private_vpn ~]# docker run -itd d123 /bin/bash #直接放入后台运行
375fb5e3f2baa65c9ae1b7db0dddf2f43fd195dd38
[root@private_vpn ~]# docker ps -a
CONTAINER ID
375fb5e3f2ba
"/bin/bash"
5 seconds ago
Up 4 seconds
admiring_rosalind
7c2ea61fd57e
"/bin/bash"
5 days ago
cocky_blackwell
"nginx -g 'daemon off"
5 days ago
0.0.0.0:80-&80/tcp
6935f8fff19c
d123f4e55e12
"/bin/bash"
10 days ago
grave_pasteur
进入容器并在相关目录下创建一个test文件且写入一定的内容:
[root@private_vpn ~]# docker exec -it 375 /bin/bash
[root@375fb5e3f2ba /]# ls -l /tmp/
-rwx------ 1 root root 836 Sep 11 15:53 ks-script-q6TWGF
-rw------- 1 root root
0 Sep 11 15:51 yum.log
[root@375fb5e3f2ba /]# echo "test123" && /tmp/test
[root@375fb5e3f2ba /]# cat /tmp/test
此时该容器跟原centos(镜像ID: d123f4e55e12)镜像相比,已经发生了变化,可以使用docker commit命令来提交为一个新的镜像。提交时可以使用ID或名称来指定容器。
[root@private_vpn ~]# docker commit -m "Added a new file" -a "daquan" 375 test:0.1
sha256:56cb38d68ab4ed58abced0244dec53b1a9b
[root@private_vpn ~]# docker images
REPOSITORY
56cb38d68ab4
6 seconds ago
docker.io/nginx
9e7424e5dbae
13 days ago
docker.io/nuagebec/ubuntu
7c2ea61fd57e
2 weeks ago
docker.io/ubuntu
20c44cd7596f
2 weeks ago
docker.io/centos
d123f4e55e12
4 weeks ago
此时可以看到多了一个镜像,ID为56cb38d68ab4。且生成了一个test仓库,tag是0.1。符合上面的命令输入。
2. 基于本地模板导入
用户也可以直接从一个操作系统模板文件导入一个镜像,主要使用docker import命令。命令格式为docker import [options] file|URL|- [repository[:tag]]
要直接导入一个镜像,可以使用OpenVZ提供的模板来创建,或者用其他已导出的镜像模板来创建。OPENVZ模板的下载地址为
eg: 下载了ubuntu-14.04-x86_64-minimal.tar.gz的模板压缩包后,之后使用以下命令导入:
cat ubuntu-14.04-x86_64-minimal.tar.gz|docker import - ubuntu:14.04-x86_64
如下所示:
[root@private_vpn ~]# docker images
REPOSITORY
56cb38d68ab4
17 minutes ago
docker.io/nginx
9e7424e5dbae
13 days ago
docker.io/nuagebec/ubuntu
7c2ea61fd57e
2 weeks ago
docker.io/ubuntu
20c44cd7596f
2 weeks ago
docker.io/centos
d123f4e55e12
4 weeks ago
[root@private_vpn ~]#
[root@private_vpn ~]# cat ubuntu-14.04-x86_64-minimal.tar.gz|docker import - ubuntu:14.04-x86_64
sha256:f52ea2cf900c9adfeae7e3a89afede5b6279
[root@private_vpn ~]#
[root@private_vpn ~]# docker images
REPOSITORY
14.04-x86_64
f52ea2cf900c
9 seconds ago
56cb38d68ab4
17 minutes ago
docker.io/nginx
9e7424e5dbae
13 days ago
docker.io/nuagebec/ubuntu
7c2ea61fd57e
2 weeks ago
docker.io/ubuntu
20c44cd7596f
2 weeks ago
docker.io/centos
d123f4e55e12
4 weeks ago
可以看到我们刚才创建的镜像(f52ea2cf900c)已经有了,可以再以此镜像为基础创建一个容器并进入容器看看:
[root@private_vpn ~]# docker run -tid f52 /bin/bash
44eca6655edf539f4e1c313d109db114d8d1587f63
[root@private_vpn ~]# docker ps -a
CONTAINER ID
44eca7876e7c
"/bin/bash"
5 seconds ago
Up 4 seconds
ecstatic_babbage
375fb5e3f2ba
"/bin/bash"
29 minutes ago
Up 29 minutes
admiring_rosalind
7c2ea61fd57e
"/bin/bash"
5 days ago
cocky_blackwell
"nginx -g 'daemon off"
5 days ago
0.0.0.0:80-&80/tcp
6935f8fff19c
d123f4e55e12
"/bin/bash"
10 days ago
grave_pasteur
[root@private_vpn ~]#
[root@private_vpn ~]# docker exec -ti 44e /bin/bash
root@44eca7876e7c:/# ls
lost+found
root@44eca7876e7c:/#
root@44eca7876e7c:/# uname -r
3.10.0-327.10.1.el7.x86_64
至此,基于本地模板导入创建镜像的方式测试完了。
3.6 存出和载入镜像
用户可以使用docker save和docker load命令来存出和载入镜像。
1.存出镜像
如果要导出镜像到本地文件,可以使用docker save命令。例如,导出本地的ubuntu:14.04-x86_64镜像文件为Ubuntu_14.04.tar,如下所示:
[root@private_vpn ~]# docker images
REPOSITORY
14.04-x86_64
f52ea2cf900c
About an hour ago
56cb38d68ab4
About an hour ago
docker.io/nginx
9e7424e5dbae
13 days ago
docker.io/nuagebec/ubuntu
7c2ea61fd57e
2 weeks ago
docker.io/ubuntu
20c44cd7596f
2 weeks ago
docker.io/centos
d123f4e55e12
4 weeks ago
[root@private_vpn ~]#
[root@private_vpn ~]# docker save -o ubuntu_14.04.tar ubuntu:14.04-x86_64
[root@private_vpn ~]# ls -lh
total 291M
-rw-r--r-- 1 root root
2 19:08 1.txt
-rw-r--r-- 1 root root
6 00:48 test.txt
-rw------- 1 root root 216M Dec
6 16:11 ubuntu_14.04.tar
-rw-r--r-- 1 root root
75M Nov 27
2016 ubuntu-14.04-x86_64-minimal.tar.gz
之后,用户就可以通过复制"ubuntu_14.04.tar"文件将该镜像分享给其他人了。
那么,分享给别人后,别人又如何载入此镜像到自己的本地呢?
2. 载入镜像
可以使用docker load将导出的tar文件再导入到本地镜像库,例如从文件"ubuntu_14.04.tar"导入镜像到本地镜像列表,如下所示:
[root@private_vpn ~]# docker images
REPOSITORY
56cb38d68ab4
About an hour ago
docker.io/nginx
9e7424e5dbae
13 days ago
docker.io/nuagebec/ubuntu
7c2ea61fd57e
2 weeks ago
docker.io/ubuntu
20c44cd7596f
2 weeks ago
docker.io/centos
d123f4e55e12
4 weeks ago
[root@private_vpn ~]#
[root@private_vpn ~]#
[root@private_vpn ~]# docker load --input ubuntu_14.04.tar
fd58c1324b91: Loading layer [==================================================&] 225.8 MB/225.8 MB
Loaded image: ubuntu:14.04-x86_64
[root@private_vpn ~]# docker images
REPOSITORY
14.04-x86_64
f52ea2cf900c
About an hour ago
56cb38d68ab4
About an hour ago
docker.io/nginx
9e7424e5dbae
13 days ago
docker.io/nuagebec/ubuntu
7c2ea61fd57e
2 weeks ago
docker.io/ubuntu
20c44cd7596f
2 weeks ago
docker.io/centos
d123f4e55e12
4 weeks ago
如上所示,镜像已载入。因为我只有一台机器做测试,所以我就先把之前的"ubuntu:14.04-x86_64"镜像文件删除了,然后再次导入"ubuntu_14.04.tar"镜像文件,可以看到创建了镜像。
这将导入镜像及其相关的元数据信息(包括标签等)。导入成功后,可以使用docker images命令进行查看。
人生信条:舍我其谁 求同存异 心存敬畏
这篇文章是我学习 Docker 的记录,大部分内容摘抄自 &&Docker — 从入门到实践&& 一书,并非本人原创.学习过程中整理成适合我自己的笔记,其中也包含了我自己的实践记录. 最近工作中遇到项目部署的问题,因为原先旧项目还需要继续在线服役,所以生产环境的一整套东西一...
Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engine 的正式发布?Azure入华?还是AWS落地中国?留在每个人大脑中的印象可能各不相同,但要是让笔者来排名的话那么Docker绝对应该算是第一位的。如果你之前...
转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享、管理 Docker 容器的 Docker SaaS 平台 -- Do...
0. 前言 docker是什么?docker是用GO语言开发的应用容器引擎,基于容器化,沙箱机制的应用部署技术。可适用于自动化测试、打包,持续集成和发布应用程序等场景。 值得注意的是,docker现已改名为moby。 docker基于容器化,沙箱机制,可使你用较少的命令和脚...
0x01 核心概念 Docker镜像类似于虚拟机镜像,可以理解为一个面向Docker引擎的只读模板,包含了文件系统。镜像是创建Docker容器的基础。 Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例,可以将其启动...
前言 现在我们从零开始NDK开发,本篇博客将介绍如何创建一个native方法,并在Activity中调用。如果大家对于NDK开发的配置不了解的话,可以查看:Android Studio NDK开发(一):NDK开发准备工作(CMake方式) Welcome to JNI 1...
我不知道别人的家庭!到底是怎么样,可我,在这个家,守着一双父母,三天两头吵架,三天两头不说话,这样的家庭!我该如何坚持,物质生活丰富又能怎样,我的心真的死了,我真的不知道这个家,存在的意义了!我累了,我真的累了,再也不想看到这样这个气死沉沉的家庭了!每天在家,我一天二十四小...
帮助阅读地址http://redissrc.readthedocs.io/en/latest/init/server.htmlhttp://blog.csdn.net/androidlushangderen/article/details/.下载 git地...
静,40岁,长得美丽,无论身高还是容貌还是言谈举止,都透着高贵而盛气凌人的气场。离异十多年,至今未嫁。年轻时一直从商,生活过得很小资,待朋友也很大方。现在想转行做心理咨询。 蓉,32岁,一身休闲打扮,一个马尾辫,看起来总像个大学生。就职于事业单位,但从未安于现状,在外干过很...
怎么样向孩子解释生命的过程,我的建议是:养几条鱼。 小美就有一个小鱼缸。 最早,小美有两条鱼,那时候,她两岁多。鱼是在一个小的儿童乐园“钓”的,说是钓,其实就是用个小网,从一个大池子里捞到一个小盆里。虽然是个很简单的游戏,但对于两岁的小美来说还是一件充满挑战和乐趣的事情。规...

我要回帖

更多关于 docker查看镜像标签 的文章

 

随机推荐