在一个新的Docker环境中是没有镜像的存在的,我们需要从镜像仓库拉取需要的镜像。常见的镜像仓库服务是 Docker Hub,但是也存在其他镜像仓库服务。
Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像。
下面介绍Docker关于净镜像的命令操作:
1、查找远程仓库镜像
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search 命令来搜索镜像。
docker search [NAME]
“NAME”字段是仓库名称。简单模式下,该命令会搜索所有“NAME”字段中包含特定字符串的仓库。
列表头说明:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。
上面返回的镜像中既有官方的也有非官方的,可以使用 –filter “is-official=true”,使命令返回内容只显示官方镜像;使用 –filter “is-automated=true”,只显示自动创建的仓库。
$ docker search [NAME] –filter “is-official=true”
$ docker search [NAME] –filter “is-automated=true”
关于 docker search 需要注意的最后一点是,默认情况下,Docker 只返回 25 行结果。但是,可以通过指定 –limit 参数来增加返回内容行数,最多为 100 行。
1、获取镜像
从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
具体的选项可以通过 docker pull –help 命令看到,这里我们说一下镜像名称的格式。
-
Docker 镜像仓库地址:地址的格式一般是
<域名/IP>[:端口号]
。默认地址是 Docker Hub。 -
仓库名:如之前所说,这里的仓库名是两段式名称,即
<用户名>/<软件名>
。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。
Linux Docker 主机本地镜像仓库通常位于 /var/lib/docker/<storage-driver>,Windows Docker 主机则是 C:\ProgramData\docker\windowsfilter。
下面以拉取 centos 镜像为例:
[root@Roker ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
6910e5a164f7: Pull complete
Digest: sha256:4062bbdd1bb0801b0aa38e0f83dece70fb7a5e9bce223423a68de2d8b784b43b
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。而镜像名称是 centos,因为这里没有设置标签,所以便会获取官方镜像 library/centos仓库中标签为 latest 的镜像。(Using default tag: latest)
从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的 sha256
的摘要,以确保下载一致性。
在使用上面命令的时候,你可能会发现,你所看到的层 ID 以及 sha256
的摘要和这里的不一样。这是因为官方镜像是一直在维护的,有任何新的 bug,或者版本更新,都会进行修复再以原来的标签发布,这样可以确保任何使用这个标签的用户可以获得更安全、更稳定的镜像。
3、列出本地镜像列表
通过命令
docker image ls
或
docker images
[root@Roker ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 5f515359c7f8 5 days ago 183 MB
nginx latest 05a60462f8ba 5 days ago 181 MB
mongo 3.2 fe9198c04d62 5 days ago 342 MB
<none> <none> 00285df0df87 5 days ago 342 MB
ubuntu 18.04 f753707788c5 4 weeks ago 127 MB
ubuntu latest fRoker753707788c5 4 weeks ago 127 MB
列表头说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本。
查看中间层镜像:
docker images -a
前面有提到,Docker 镜像由一些松耦合的只读镜像层组成,所以镜像是构建是层层构建,很多镜像依赖这些中间层。后面再学习dockerfile的时候会有更直观的感受。如果不同镜像之间有复用的中间层,这里就会看见一些没有镜像名和标签的镜像。
4、删除镜像
在我们不需要一些镜像的时候,就可以通过下面的命令将其删除:
docker rmi [OPTIONS] IMAGE [IMAGE…]
强制删除镜像
如果环境中有基于该镜像的容器运行着的时候,执行上述命令的时候会出现这样的错误
Error response from daemon: conflict: unable to delete e9d3f7300f03 (must be forced) - image is referenced in one or more repositories
那么需要先删除tag 再rm 由此tag 启动过的container,最后删除image。
或者直接强制删除:
docker rmi -f <image name>
清除所有虚悬镜像
在使用docker images查看本地镜像时(不加-a参数时),我们也可能会发现一些没有镜像名和标签的镜像:
不同于上面提到的中间层镜像,我们称这种镜像为虚悬镜像(dangling image),
这个镜像原本是有镜像名和标签的,原来为 mongo:3.2,随着官方镜像维护,发布了新版本后,重新 docker pull mongo:3.2 时,mongo:3.2 这个镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了 <none>。除了 docker pull 可能导致这种情况,docker build 也同样可以导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 <none> 的镜像。这类无标签镜像也被称为 虚悬镜像(dangling image) ,可以用下面的命令专门显示这类镜像
[root@Roker ~]# docker image ls -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 00285df0df87 5 days ago 342 MB
一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除。
另外,在使用docker build构建镜像的时候,如果构建失败也会产生虚悬镜像。一般来说虚悬镜像已经没有实际用处,可以随意删除,一条命令就能清除所有虚悬镜像:
docker image prune
5、创建镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 1、从已经创建的容器中更新镜像,并且提交这个镜像
- 2、使用 Dockerfile 指令来创建一个新的镜像
6、更新镜像
更新镜像之前,我们需要使用镜像来创建一个容器。
[root@Roker ~]# docker run -t -i ubuntu:15.10 /bin/bash
root@e218edb10161:/#
在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit 命令来退出这个容器。
此时 ID 为 e218edb10161 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。
[root@Roker ~]# docker commit -m="has update" -a="runoob" e218edb10161 roker/ubuntu:v2
sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8
各个参数说明:
-
-m: 提交的描述信息
-
-a: 指定镜像作者
-
e218edb10161:容器 ID
-
roker/ubuntu:v2: 指定要创建的目标镜像名
7、构建镜像
我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
[root@VM_0_12_centos ~]# cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源。
RUN 指令告诉 docker 在镜像内执行命令,安装了什么。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
[root@Roker ~]# docker build -t runoob/centos:6.7 .
Sending build context to Docker daemon 17.92 kB
Step 1 : FROM centos:6.7
---> d95b5ca17cc3
Step 2 : MAINTAINER Fisher "fisher@sudops.com"
---> Using cache
---> 0c92299c6f03
Step 3 : RUN /bin/echo 'root:123456' |chpasswd
---> Using cache
---> 0397ce2fbd0a
Step 4 : RUN useradd runoob
......
参数说明:
-
-t :指定要创建的目标镜像名
-
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
使用docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec
[root@Roker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
roker/centos latest 860c279d2fec About a minute ago 190.6 MB
roker/ubuntu v2 70bf1840fd7c 17 hours ago 158.5 MB
ubuntu 14.04 90d5884b1ee0 6 days ago 188 MB
php 5.6 f40e9e0f10c8 10 days ago 444.8 MB
nginx latest 6f8d099c3adc 12 days ago 182.7 MB
mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB
httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB
ubuntu 15.10 4e3b13c8a266 5 weeks ago 136.3 MB
hello-world latest 690ed74de00f 6 months ago 960 B
centos 6.7 d95b5ca17cc3 6 months ago 190.6 MB
training/webapp latest 6fae60ef3446 12 months ago 348.8 MB
我们可以使用新的镜像来创建容器
[root@Roker~]# docker run -t -i roker/centos:6.7 /bin/bash
[root@41c28d18b5fb /]# id roker
uid=500(roker) gid=500(runoob) groups=500(roker)
从上面看到新镜像已经包含我们创建的用户 roker。
8、设置镜像标签
我们可以使用 docker tag 命令,为镜像添加一个新的标签。
[root@Roker ~]# docker tag 860c279d2fec roker/centos:dev
docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。
使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。
[root@Roker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
roker/centos latest 860c279d2fec 5 hours ago 190.6 MB
roker/centos dev 860c279d2fec 5 hours ago 190.6 MB
roker/ubuntu v2 70bf1840fd7c 22 hours ago 158.5 MB
ubuntu 14.04 90d5884b1ee0 6 days ago 188 MB
php 5.6 f40e9e0f10c8 10 days ago 444.8 MB
nginx latest 6f8d099c3adc 13 days ago 182.7 MB
mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB
httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB
ubuntu 15.10 4e3b13c8a266 5 weeks ago 136.3 MB
hello-world latest 690ed74de00f 6 months ago 960 B
centos 6.7 d95b5ca17cc3 6 months ago 190.6 MB
training/webapp latest 6fae60ef3446 12 months ago 348.8 MB
今天的文章docker镜像操作命令有哪些,并介绍它们的用法_从入门到实战[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/89492.html