镜像的基本操作 :
前提: 配置镜像加速器,提高镜像的拉取速度。
因为镜像是分层系统的模式,所以在拉取镜像的时候也是分层的拉取的,所以会看到一层一层的pull过程,如图:
在线搜索镜像 :
-
语法 : docker search [OPTIONS] TERM
-
OPTIONS说明:
–automated :只列出 automated build(自动化构建)类型的镜像;默认值false
–no-trunc :显示完整的镜像描述;默认值false
-s :列出收藏数(stars)不小于指定值的镜像;
–-filter,添加过滤条件,如-filter=stars=3 代表:starts的值>=3 而不是直接等于3(注意) -
实例:
-
通过过滤条件进行镜像在线搜索,如图:
-
从Docker Hub查找所有镜像名包含java,并且收藏数大于10的镜像
拉取镜像:
-
语法 : docker pull [OPTIONS] NAME[:TAG|@DIGEST]
-
说明:从镜像仓库Docker Hub中拉取或者更新指定镜像
-
OPTIONS说明:
-a :拉取所有 tag 镜像; 对应得是 –all-tags=false 默认值false
–disable-content-trust :忽略镜像的校验,默认开启 -
实例:
-
拉取指定版本的镜像,如图:
-
拉取最新版本的镜像,这里写latest或者不写tag对应的都是一样的效果,因为默认拉取的就是latest最新版本的,如图:
-
不写tag的最新镜像的拉取命令:
docker pull ubuntu
-
从Docker Hub下载REPOSITORY为java的所有镜像的命令如下:
docker pull -a java
PS:
- latest是一个标签(tag),表示是当前最新版本;
- 输入的命令实际上相当于docker pull registry.hub.docker.com/ubuntu:latest 命令,即从注册服务器 registry.hub.docker.com中的名为ubuntu的仓库中下载标签为latest的镜像;
- 只要对应的选项如-a 写出来,就代表true,不管默认值是什么,如果想改为false非默认值,那么显示指定 -a=false这样
查看你本地的镜像仓库:
- 语法 :docker images [OPTIONS] [REPOSITORY]
- OPTIONS说明:
-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)默认值false;
–digests :显示镜像的摘要信息;
-f :显示满足条件的镜像,对应–filter;
–format :指定返回值的模板文件;
–no-trunc :显示完整的镜像信息 默认值false;
-q :只显示镜像ID。 - 实例:
基本查询如下:
列出本地镜像中REPOSITORY为ubuntu的镜像列表,如图:
对于查询结果的标题字段的解释,如下:
查看镜像详情 (镜像的元数据) :
- 语法 : docker inspect [OPTIONS] NAME|ID [NAME|ID…]
- OPTIONS说明:
-f :指定返回值的模板文件,对应–format=“” ;
实例:
PS:
- 这里NAMW指定的是repository或者容器container的值
删除镜像 :
-
语法 :docker rmi [OPTIONS] IMAGE [IMAGE]
-
OPTIONS说明:
-f,–force=false:强制删除镜像
–no-prune, 默认值–no-prune=false :不移除该镜像的过程镜像,默认移除; -
实例:
强制删除本地镜像runoob/ubuntu:v4,如图:
PS:
- 删除镜像前必须先删除以此镜像为基础的容器(哪怕是已经停止的容器),否则无法删除该镜像,会报错Failed to remove image(e4415b714b62): Error response from daemon: conflict: unable to delete e4415b714b62 (cannot be forced) - image has dependent child images类似这种;
- 特殊镜像的删除(同id不同标签或者名称的镜像的删除)可以使用repository:tag的组合来删除特殊的镜像。
如:docker rmi docker.io/redis:3.2
自定义构建镜像 :
构建Docker镜像,可以保存对容器的修改,并且再次使用。构建镜像提供了自定义镜像的能力,以软件的形式打包并分发服务及其运行环境。Docker中提供了两种方式来构建镜像:
-
通过容器构建镜像:docker commit
-
通过Dockerfile:docker build
实例之通过容器构建:docker commit
-
语法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a –author=“” :提交的镜像作者;
-m –message=“”:提交时的说明文字;
-p –pause=true :在commit时,将容器暂停;
实例:
解释:-m指定说明信息;-a指定用户信息;aa97ba3292ce代表容器的id;sgy/ubuntu:vim指定目标镜像的用户名、仓库名和 tag 信息,运行命令的时候使用自己注册Docker hub时的用户名;
PS:- 构建完成后,就可以在本地通过命令 docker images查看了,注意是在本地,还没有推送到 Docker hub上去;
总结:
- 先有基础镜像,然后创建容器,之后通过容器创建镜像;
**使用Dockerfile文件构建镜像 **
Docker允许我们利用一个类似配置文件的形式来进行构建自定义镜像,在文件中可以指定原始的镜像,自定义镜像的维护人信息,对原始镜像采取的操作以及暴露的端口等信息。比如:
# Sample Dockerfile
FROM ubuntu:16.04
MAINTAINER mrw "mrw@163.com"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
- 语法 :docker build [OPTIONS] PATH | URL | -
- 说明 :docker build 命令用于使用 Dockerfile 创建镜像;
- OPTIONS说明:
–quiet, -q :安静模式,成功后只输出镜像 ID;
–tag, -t: 指定输出的镜像的名字及标签,通常 name:tag 或者 name 格式,可以在一次构建中为一个镜像设置多个标签; - 实例:
- 使用当前目录的 Dockerfile 创建镜像,镜像名:runoob/ubuntu 标签:v1
docker build -t runoob/ubuntu:v1 .
- 也可以通过 -f 指定 Dockerfile 文件的位置:
docker build -f /path/to/a/Dockerfile .
或者
docker build -f Dockerfile-dev.yaml -t my_container . 一般用后者,同时指定了生成的镜像名字
注意: 这里可以指定容器中的路径,也可以指定宿主机上的实际路径(绝对路径);
- 在 Docker 守护进程执行 Dockerfile 中的指令前,首先会对 Dockerfile 进行语法检查,有语法错误时会返回:
docker build -t test/myapp .
Sending build context to Docker daemon 2.048 kB
Error response from daemon: Unknown instruction: RUNCMD
PS:
- 如果引用Dockerfile失败,可能是Dockerfile文件的后缀名的问题,去掉后缀名.txt就可以了。
- 当看到类似 Successfully built 01a82bc1cf37 (镜像ID )的字样时,说明镜像构建成功了,这时通过 docker images 命令可以看到刚才制作的镜像;
镜像迁移 :
我们制作好的镜像,一般会迁移或分享给其他需要的人。Docker提供了几种将我们的镜像迁移、分享给其他人的方式。推荐镜像迁移应该直接使用Docker Registry,无论是直接使用Docker Hub还是使用内网私有Registry都可以。使用镜像频率不高,镜像数量不多的情况下,我们可以选择以下两种方式。
-
上传Docker Hub;
-
导出文件互传;
上传Docker Hub :
首先,需要在Docker Hub上申请注册一个帐号。然后我们需要创建仓库,并指定仓库名称。
在终端中登录你的Docker Hub账户,输入docker login,接着输入用户名密码即可登录成功。
需要先给镜像打上标签:
给镜像打标签的命令:
docker tag <existing-image> <hub-user>/<repo-name>[:<tag>]
说明:其中existing-image
代表本地待上传的镜像名加tag,后面<hub-user>/<repo-name>[:<tag>]
则是为上传更改的标签名,tag不指定则为latest 这里<repo-name>
要和Docker hub上你创建的仓库名相同。
可以看到,我们重新为ubuntu:16.04的镜像打上标签,观察IMAGE ID可知,同一镜像可以拥有不同的标签名。接下来,我们利用push命令直接上传镜像:
docker push <hub-user>/<repo-name>:<tag>
如图,我们已经上传成功。由于之前上传过,所以我们这里是直接对已有的ubuntu镜像进行上传,只是重新打了标签,所以真正上传的只是变化的部分:
导出文件互传的方式 :
Docker 还提供了 docker load 和 docker save 命令,用以将镜像保存为一个tar文件。比如这次我们将ubuntu:latest这个镜像保存为tar文件。
查看本地磁盘,即可看见名为ubuntu18.04的tar包。我们可以将其拷贝给其他PC,利用load命令重新导入。
总结:
- 镜像的删除,删除镜像前必须先删除以此镜像为基础的容器(哪怕是已经停止的容器);
- 镜像的 ID 唯一标识了镜像,具有相同的镜像 ID ,就说明它们实际上是同一镜像,同一镜像可以指定不同的标签名;
- docker的仓库是公共的,拉取镜像:指定注册服务器,指定注册服务器中的仓库,然后指定仓库中对应的镜像标签tag;
- 拉取“基础”镜像,分层的方式一层一层的拉取;
- 镜像一旦生成,其包含的数据就是静态数据,不允许修改,只能通过容器的动态数据来操作(再重新生成一个镜像);
引用:
Docker——入门实战
从 0 开始了解 Docker
使用 Docker 搭建前端 Java 开发环境
如何把 Java Web 应用放在 docker 容器中运行
镜像和容器的基础讲解