容器和虚拟机具有相似的资源隔离和分配优势,但功能不同,因为容器虚拟化的是操作系统而不是硬件。多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为独立进程运行。一次打包,到处运行。打的包就是容器镜像。
容器镜像是一个不可变的只读文件,基于相同镜像文件创建启动的容器,都将获得完全相同的Docker容器。容器是镜像的实例。
Docker Registry可以理解为仓库,用来统一存储所有创建好的镜像images。分为私有仓和公共仓。Docker Hub是Docker Inc.管理的公共仓,不过国内连接它比较慢。我们一般会使用国内的其它一些平台镜像仓库。这里管理了开发者上传的庞大的镜像集合。启动容器时,docker daemon会先尝试从本地获取镜像,如果本地不存在,则将从配置的Registry下载并保存到本地。相同的镜像会有不同的迭代版本,用tag区分。比如使用Docker部署openGauss中,openGauss的镜像就有很多迭代版本,从1.0.1 到3.0.0。所有迭代版本组成的镜像仓库又组成了Repository,比如恩墨创建的openGauss镜像enmotech/opengauss。
基础的几个命令就是正常的使用镜像,学会后就可以进行最基本的镜像操作,广泛应用于安装、运维。进阶的几个命令介绍镜像制作的相关命令,开发必备。
1.查找镜像docker search
这个命令是从公共仓比如Docker hub搜索指定的image。语法:
docker search [OPTIONS] TERM
OPTIONS 里是可选项:
–filter,-f 根据提供的条件过滤输出
–limit 搜索返回的最大结果数。该值可以在 1 到 100 之间。默认值为–limit25。
–no-trunc不要截断输出
显示名称包含“java”、至少 30 星且是官方构建的镜像示例:
docker search --filter is-official=true --filter stars=30 java
2.拉取镜像docker pull
这个命令是将镜像包从远程仓库下载到本地。例如,下面的例子就是获取ubantu的镜像。如果不指定版本,就是默认使用最新的版本,即tag是latest。
[root@pekphisprb70593 software]# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
405f018f9d1d: Pull complete
Digest: sha256:b6b83d3c331794420340093eb706a6f152d9c1fa51b262d9bf34594887c2c7ac
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
也可以指定具体版本,如《【云原生】使用Docker部署openGauss》中指定了opengauss的3.0.0版本。
3.列出镜像docker images
这个命令是列出本地存储的所有镜像,不管你用没用。
[root@pekphisprb70593 software]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
enmotech/opengauss latest e1ef1f097765 9 days ago 480MB
ubuntu latest 27941809078c 7 weeks ago 77.8MB
它会显示REPOSITORY,TAG , IMAGE ID , CREATED , SIZE
信息。
4.删除镜像docker rmi
这个命令是将不需要的镜像包删除,rm是remove,i表示image。使用的IMAGE ID即为上面docker images查出来的镜像ID,也可以使用镜像名称enmotech/opengauss:latest。
docker rmi IMAGE ID
注意,使用该命令删除的时候需要确保容器已经停止且删除。否则会提示报错“Error response from daemon: conflict: unable to delete xxx (cannot be forced) - image is being used by running container xxx”。正确的步骤就是删除停止的容器>删除未被使用的网络>删除镜像。也提供一种粗暴的参数 -f 表示force强制删除。
docker rmi -f IMAGE ID
5.查看镜像docker inspect
这个命令会以 json 格式得到 docker 镜像/容器的元数据。除了镜像ID也可以使用镜像名称。
docker inspect IMAGE ID
这时就可以和grep 联合使用,方便的获取想到的信息。grep会获取到其他的数据,不够完整或者有冗余,还得进一步处理,但是 -f 可以解决这个问题。例如 获取RootFS.Layers 节点的数据:
docker inspect -f ‘{{.RootFS.Layers}}’ e1ef1f09765
1.制作镜像docker build
语法:docker build [OPTIONS] PATH |URL
docker build
命令从一个Dockerfile
和context创建镜像。[OPTIONS]里是些可选参考,PATH 本地文件系统上的目录,URL是Git仓库的位置,构建时都包括他们的子目录。
示例:
docker build --force-rm=true --no-cache=true -t wxx/opengauss:3.0.0 -f /path/to/a/Dockerfile .
–force-rm :设置镜像过程中删除中间容器;
–no-cache:创建镜像过程中不使用缓存
-t:设置镜像名字及标签
-f:指定要使用的Dockerfile路径
注意,最后还有个 英文的点号.
,表示使用当前目录。
当然这个命令还支持许多其他参数,死记无益,可以实际使用时再行确认。新上手用户制作Dockerfile 以参考其他已有的,比如openGauss的。
2.推送镜像docker push
镜像制作完成后,如果希望不止在本地,可以使用docker push
推送到远程仓库,可以是公共仓dockerhub也可以是私有仓。注意,推送前需要先注册。
使用时,先登录再推送。
docker login
--根据提示输入用户名和密码
docker push repository:tag
然后可以去dockerhub查看下是否推送成功了。
3.镜像打包docker image save
和镜像加载docker image load
这俩成对使用,save是将一个或多个image保存为tar,load是将tar 文件恢复为image。这样从一个主机save,另一个主机load就完成了镜像的传输。
docker image save enmotech/opengauss:latest -o /path/to/save/myimage.tar
docker image load -i /path/myimage.tar
4.给镜像打新标记docker tag
这个命令就是基于本地的已有镜像重新建一个tag。在《【云原生】使用Docker快速部署openGauss主备环境》中我们就可以使用这个命令修改本地镜像的名字来匹配原有的安装脚本。
[root@pekphisprb70594 ~]# docker tag enmotech/opengauss:latest opengauss:latest
[root@pekphisprb70594 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
enmotech/opengauss latest e6b31cb4b7b9 3 months ago 245MB
opengauss latest e6b31cb4b7b9 3 months ago 245MB
这样就在不改变原有镜像enmotech/opengauss:latest的情况下,在本地新产生了个opengauss:latest的镜像。
5.清理无用镜像docker image prune
如果本地镜像有一些各种原因不再被容器使用或者未被tag标记的镜像,可以使用该命令一把清除。
docker image prune -a
prune 是英文修剪的意思,在docker中,不止可以清理镜像。还可以删除其他不再使用的docker对象。比如容器实例,网络、卷等。
docker container prune
docker network prune
docker volume prune
如果您觉得博主的文章还不错或者有帮助的话,请关注一下博主,如果三连点赞评论收藏就更好啦!谢谢各位大佬给予的支持!