搜索镜像

Docker官网:https://hub.docker.com/

  • 可以直接在Docker官网搜索镜像,然后点击下图所示位置复制命令

Docker镜像管理 - 图1

  • 命令行搜索镜像docker search [镜像名]
  1. [root@server ~]# docker search centos

Docker镜像管理 - 图2

  • NAME :镜像仓库的名字
  • DESCRIPTION:镜像仓库的描述
  • STARS:表明使用者对这个仓库的满意度
  • OFFICIAL:是否为软件作者官方提供的镜像
  • AUTOMATED:有些镜像并不是作者手动上传的,而是作者提供了这个镜像的制作步骤

下载镜像

使用docker pull命令直接下载镜像,语法为:

  1. docker pull NAME:TAG

其中,NAME是镜像名称,TAG是镜像的标签(往往用来是表示版本信息)

通常情况下,描述一个镜像需要包括名称:标签,如果不指定标签,标签的值默认为latest

下载nginx、centos7、hello-world镜像

  1. [root@server ~]# docker pull nginx
  2. [root@server ~]# docker pull centos:7
  3. [root@server ~]# docker pull hello-world

查看镜像信息

docker images

  • 列出本地的所有镜像
  1. [root@server ~]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. nginx latest c919045c4c2b 12 days ago 142MB
  4. hello-world latest feb5d9fea6a5 5 months ago 13.3kB
  5. centos 7 eeb6ee3f44bd 5 months ago 204MB
  6. centos latest 5d0da3dc9764 5 months ago 231MB
  • REPOSITORY:镜像仓库名称

  • TAG:镜像的标签信息

  • IMAGE ID:唯一用来标识镜像,如果两个镜像的ID相同,说明他们实际上指向了同一个镜像,只是具有不同标签名称而已

  • CREATED:创建时间,说明镜像的最后更新时间

  • SIZE:镜像大小,优秀的镜像往往体积都较小

docker tag

可以使用docker tag命令来为本地镜像任意添加新的标签,方便在后续工作中使用特定镜像

  1. [root@server ~]# docker tag centos:7 mycentos:7
  2. [root@server ~]# docker images
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. nginx latest c919045c4c2b 12 days ago 142MB
  5. hello-world latest feb5d9fea6a5 5 months ago 13.3kB
  6. centos 7 eeb6ee3f44bd 5 months ago 204MB
  7. mycentos 7 eeb6ee3f44bd 5 months ago 204MB
  8. centos latest 5d0da3dc9764 5 months ago 231MB

docker inspect

使用docker inspect命令获取该镜像的详细信息

  1. [root@server ~]# docker inspect centos:7
  2. [
  3. {
  4. "Id": "sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9",
  5. "RepoTags": [
  6. "centos:7",
  7. "mycentos:7"
  8. ],
  9. "RepoDigests": [
  10. "centos@sha256:c73f515d06b0fa07bb18d8202035e739a494ce760aa73129f60f4bf2bd22b407"
  11. ],
  12. "Parent": "",
  13. "Comment": "",
  14. "Created": "2021-09-15T18:20:23.99863383Z",
  15. "Container": "5e4c7bfd35862166e9efd7532208300600114f0acff8f82fd537a57bdd523fe2",
  16. "ContainerConfig": {
  17. "Hostname": "5e4c7bfd3586",
  18. "Domainname": "",
  19. "User": "",
  20. "AttachStdin": false,
  21. "AttachStdout": false,
  22. "AttachStderr": false,
  23. "Tty": false,
  24. "OpenStdin": false,
  25. "StdinOnce": false,
  26. "Env": [
  27. "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
  28. ],
  29. "Cmd": [
  30. "/bin/sh",
  31. "-c",
  32. "#(nop) ",
  33. "CMD [\"/bin/bash\"]"
  34. ],
  35. "Image": "sha256:ba35a4b787c8f11e3b6ed9248c7663b4f27459e9715a1ace09f966259d5ebc3a",
  36. "Volumes": null,
  37. "WorkingDir": "",
  38. "Entrypoint": null,
  39. "OnBuild": null,
  40. "Labels": {
  41. "org.label-schema.build-date": "20201113",
  42. "org.label-schema.license": "GPLv2",
  43. "org.label-schema.name": "CentOS Base Image",
  44. "org.label-schema.schema-version": "1.0",
  45. "org.label-schema.vendor": "CentOS",
  46. "org.opencontainers.image.created": "2020-11-13 00:00:00+00:00",
  47. "org.opencontainers.image.licenses": "GPL-2.0-only",
  48. "org.opencontainers.image.title": "CentOS Base Image",
  49. "org.opencontainers.image.vendor": "CentOS"
  50. }
  51. },
  52. "DockerVersion": "20.10.7",
  53. "Author": "",
  54. "Config": {
  55. "Hostname": "",
  56. "Domainname": "",
  57. "User": "",
  58. "AttachStdin": false,
  59. "AttachStdout": false,
  60. "AttachStderr": false,
  61. "Tty": false,
  62. "OpenStdin": false,
  63. "StdinOnce": false,
  64. "Env": [
  65. "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
  66. ],
  67. "Cmd": [
  68. "/bin/bash"
  69. ],
  70. "Image": "sha256:ba35a4b787c8f11e3b6ed9248c7663b4f27459e9715a1ace09f966259d5ebc3a",
  71. "Volumes": null,
  72. "WorkingDir": "",
  73. "Entrypoint": null,
  74. "OnBuild": null,
  75. "Labels": {
  76. "org.label-schema.build-date": "20201113",
  77. "org.label-schema.license": "GPLv2",
  78. "org.label-schema.name": "CentOS Base Image",
  79. "org.label-schema.schema-version": "1.0",
  80. "org.label-schema.vendor": "CentOS",
  81. "org.opencontainers.image.created": "2020-11-13 00:00:00+00:00",
  82. "org.opencontainers.image.licenses": "GPL-2.0-only",
  83. "org.opencontainers.image.title": "CentOS Base Image",
  84. "org.opencontainers.image.vendor": "CentOS"
  85. }
  86. },
  87. "Architecture": "amd64",
  88. "Os": "linux",
  89. "Size": 203936249,
  90. "VirtualSize": 203936249,
  91. "GraphDriver": {
  92. "Data": {
  93. "MergedDir": "/var/lib/docker/overlay2/121b6feb2e1cf2c859a7e34b36d26a067d040ab8170d362eba9a727f7d21d689/merged",
  94. "UpperDir": "/var/lib/docker/overlay2/121b6feb2e1cf2c859a7e34b36d26a067d040ab8170d362eba9a727f7d21d689/diff",
  95. "WorkDir": "/var/lib/docker/overlay2/121b6feb2e1cf2c859a7e34b36d26a067d040ab8170d362eba9a727f7d21d689/work"
  96. },
  97. "Name": "overlay2"
  98. },
  99. "RootFS": {
  100. "Type": "layers",
  101. "Layers": [
  102. "sha256:174f5685490326fc0a1c0f5570b8663732189b327007e47ff13d2ca59673db02"
  103. ]
  104. },
  105. "Metadata": {
  106. "LastTagTime": "2022-03-13T23:12:19.870984587+08:00"
  107. }
  108. }
  109. ]

docker history

docker里的镜像绝大部分都是在别的镜像的基础上去进行创建的,也就是使用镜像的分层结构

一个docker镜像由多个可读的镜像层组成,然后运行的容器会在这个docker的镜像上面多加一层可写的容器层,任何的对文件的更改都只存在此容器层,因此任何对容器的操作均不会影响到镜像

Docker镜像管理 - 图3

可以使用docker history命令,该命令将列出各层创建信息

[root@server ~]# docker history centos:7
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
eeb6ee3f44bd   5 months ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      5 months ago   /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      5 months ago   /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4…   204MB

镜像导入导出

镜像导出

可以将镜像从本地导出为一个压缩文件,然后复制到其他服务器进行导入使用

  • 导出方法一:docker save 镜像 -o 导出后目录
[root@server ~]# docker save centos:latest -o /opt/centos.tar.gz
[root@server ~]# ll /opt/centos.tar.gz -h
-rw------- 1 root root 228M 3月  13 23:22 /opt/centos.tar.gz
  • 导出方法二:docker save 镜像 > 导出后目录
[root@server ~]# docker save centos:latest > /opt/centos-1.tar.gz
[root@server ~]# ll /opt/centos-1.tar.gz -h
-rw-r--r-- 1 root root 228M 3月  13 23:23 /opt/centos-1.tar.gz

镜像导入

先将导出的镜像发到需要导入的docker服务器中,然后进行导入

  • 导入方法一:docker load -i 镜像压缩包目录
[root@server ~]# docker load -i /opt/centos.tar.gz
74ddd0ec08fa: Loading layer [==================================================>]  238.6MB/238.6MB
Loaded image: centos:latest
  • 导入方法二:docker load < 镜像压缩包目录
[root@server ~]# docker load < /opt/centos.tar.gz 
Loaded image: centos:latest

镜像删除

  • 镜像的删除可以使用命令docker rmi [镜像名/镜像ID]
[root@server ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
nginx         latest    c919045c4c2b   12 days ago    142MB
hello-world   latest    feb5d9fea6a5   5 months ago   13.3kB
centos        7         eeb6ee3f44bd   5 months ago   204MB
mycentos      7         eeb6ee3f44bd   5 months ago   204MB
centos        latest    5d0da3dc9764   5 months ago   231MB

[root@server ~]# docker rmi hello-world:latest 
Untagged: hello-world:latest
Untagged: hello-world@sha256:4c5f3db4f8a54eb1e017c385f683a2de6e06f75be442dc32698c9bbe6c861edd
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359

[root@server ~]# docker rmi 5d0d
Untagged: centos:latest
Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59
  • 对于一些无法删除的镜像,可以使用命令docker rmi -f [镜像名/镜像ID]
# 情况一:镜像ID指向了多个REPOSITORY(镜像仓库)
[root@server ~]# docker rmi eeb6
Error response from daemon: conflict: unable to delete eeb6ee3f44bd (must be forced) - image is referenced in multiple repositories
[root@server ~]# docker rmi -f eeb6
Untagged: centos:7
Untagged: centos@sha256:c73f515d06b0fa07bb18d8202035e739a494ce760aa73129f60f4bf2bd22b407
Untagged: mycentos:7
Deleted: sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9

# 情况二:有容器在使用这个镜像,最好不要采取这种方式
[root@server ~]# docker rmi nginx:latest 
Error response from daemon: conflict: unable to remove repository reference "nginx:latest" (must force) - container f0e9083b87e6 is using its referenced image c919045c4c2b
[root@server ~]# docker rmi -f nginx:latest 
Untagged: nginx:latest
Untagged: nginx@sha256:1c13bc6de5dfca749c377974146ac05256791ca2fe1979fc8e8278bf0121d285

当有容器在使用镜像时,如果将这个镜像强行删除,那么镜像会变成none,但是容器却在正常运行

[root@server ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
<none>       <none>    c919045c4c2b   12 days ago   142MB
[root@server ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS     NAMES
f0e9083b87e6   c919045c4c2b   "/docker-entrypoint.…"   48 minutes ago   Up 48 minutes               80/tcp    nginx-1

一定要在对应的镜像的容器退出运行时,才可以删除这个镜像,否则会有BUG出现!!!

镜像上传

上传至官方Docker仓库

  • 首先需要有一个账户

Docker镜像管理 - 图4

  • 登录到仓库
[root@server ~]# docker login docker.io
Username: moodye
Password:
[root@server ~]# cat .docker/config.json 
{
    "auths": {
        "https://index.docker.io/v1/": {
            "auth": "bW9vZHllOnN1eXVhbjgyMnpseTUyMA=="
        }
    }
}
  • 给镜像打上标签并上传
[root@server ~]# docker tag nginx:v1 docker.io/moodye/nginx:v1
[root@server ~]# docker push docker.io/moodye/nginx:v1

Docker镜像管理 - 图5

其次,还可以上传到阿里云仓库或者Docker Harbor等仓库