[Docker]Docker镜像

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。

Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。

1. 获取镜像

镜像是Docker运行容器的前提。

可以使用docker pull命令从网络上下载镜像。该命令的格式为:

 
 
  1. docker pull NAME[:TAG]

备注:

NAME 下载镜像的名称

TAG 标签 通过指定标签来下载特定版本的某一镜像

对于Docker镜像来说,如果不显式地指定TAG,则默认会选择latest标签,即下载仓库中最新版本的镜像。


演示一下如何从Ubuntu仓库下载一个最新的Ubuntu操作系统的镜像:

 
 
  1. xiaosi@xiaosi:~$ sudo docker pull ubuntu
  2. Using default tag: latest
  3. latest: Pulling from library/ubuntu
  4. 5ba4f30e5bea: Pull complete
  5. 9d7d19c9dc56: Pull complete
  6. ac6ad7efd0f9: Pull complete
  7. e7491a747824: Pull complete
  8. a3ed95caeb02: Pull complete
  9. Digest: sha256:46fb5d001b88ad904c5c732b086b596b92cfb4a4840a3abd0e35dbb6870585e4
  10. Status: Downloaded newer image for ubuntu:latest

从上可以看出我们没有显示指定TAG,则会默认选择latest标签,下载最新的版本的ubuntu镜像。


下载过程中可以看出,镜像文件一般由若干层组成,行首的5ba4f30e5bea这样的字串代表了各层的ID。下载过程中会获取并输出镜像的各层信息。层(Layer)其实是AUFS(Advanced Union File System,一种联合文件系统)中的重要概念,是实现增量保存与更新的基础。


还可以通过指定标签来下载特定版本的某一个镜像,例如14.04标签的镜像:

 
 
  1. sudo docker pull ubuntu14.04

下载镜像到本地后,即可随时使用该镜像了,例如利用该镜像创建一个容器,在其中运行bash应用:

 
 
  1. sudo docker run -t -i ubuntu /bin/bash
  2. root@fe7fc4bd8fc9:/#


2. 查看镜像信息
2.1 查看所有镜像

可以使用如下命令列出本地主机上已有的镜像:

 
 
  1. xiaosi@Qunar:~$ docker images
  2. REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
  3. ubuntu              latest              2fa927b5cdd3        3 weeks ago         122 MB
  4. xiaosi@Qunar:~$

说明:

字段 描述
REPOSITORY 来自于哪个仓库,比如ubuntu仓库
TAG 镜像的标签信息,比如latest,用于标记同一仓库的不同镜像。
IMAGE ID 镜像的ID(唯一)
CREATED 创建时间
SIZE 镜像大小


2.2 查看具体镜像详细信息

可以使用如下命令查看具体某个镜像的详细信息:

 
 
  1. xiaosi@Qunar:~$ docker inspect 2fa927b5cdd3
  2. [
  3.    {
  4.        "Id": "sha256:2fa927b5cdd31cdec0027ff4f45ef4343795c7a2d19a9af4f32425132a222330",
  5.        "RepoTags": [
  6.            "ubuntu:latest"
  7.        ],
  8.        "RepoDigests": [],
  9.        "Parent": "",
  10.        "Comment": "",
  11.        "Created": "2016-05-27T14:15:02.359284074Z",
  12.        "Container": "b8bd6a8e8874a87f626871ce370f4775bdf598865637082da2949ee0f4786432",
  13.        "ContainerConfig": {
  14.            "Hostname": "914cf42a3e15",
  15.            "Domainname": "",
  16.            "User": "",
  17.            "AttachStdin": false,
  18.            "AttachStdout": false,
  19.            "AttachStderr": false,
  20.            "Tty": false,
  21.            "OpenStdin": false,
  22.            "StdinOnce": false,
  23.            "Env": [],
  24.            "Cmd": [
  25.                "/bin/sh",
  26.                "-c",
  27.                "#(nop) CMD [\"/bin/bash\"]"
  28.            ],
  29.            "Image": "b873f334fa5259acb24cf0e2cd2639d3a9fb3eb9bafbca06ed4f702c289b31c0",
  30.            "Volumes": null,
  31.            "WorkingDir": "",
  32.            "Entrypoint": null,
  33.            "OnBuild": null,
  34.            "Labels": {}
  35.        },
  36.        "DockerVersion": "1.9.1",
  37.        "Author": "",
  38.        "Config": {
  39.            "Hostname": "914cf42a3e15",
  40.            "Domainname": "",
  41.            "User": "",
  42.            "AttachStdin": false,
  43.            "AttachStdout": false,
  44.            "AttachStderr": false,
  45.            "Tty": false,
  46.            "OpenStdin": false,
  47.            "StdinOnce": false,
  48.            "Env": [],
  49.            "Cmd": [
  50.                "/bin/bash"
  51.            ],
  52.            "Image": "b873f334fa5259acb24cf0e2cd2639d3a9fb3eb9bafbca06ed4f702c289b31c0",
  53.            "Volumes": null,
  54.            "WorkingDir": "",
  55.            "Entrypoint": null,
  56.            "OnBuild": null,
  57.            "Labels": {}
  58.        },
  59.        "Architecture": "amd64",
  60.        "Os": "linux",
  61.        "Size": 121989688,
  62.        "VirtualSize": 121989688,
  63.        "GraphDriver": {
  64.            "Name": "aufs",
  65.            "Data": null
  66.        },
  67.        "RootFS": {
  68.            "Type": "layers",
  69.            "Layers": [
  70.                "sha256:9436069b92a3ec23351313d6decc5fba2ce1cd52aac77dd8da3b03b3dfcb5382",
  71.                "sha256:19429b698a2283bfaece7f590e438662e2078351a9ad077c6d1f7fb12f8cd08d",
  72.                "sha256:82b57dbc5385a2a0edd94dfc86f9e4d75487cce30250fec94147abab0397f2b8",
  73.                "sha256:737f40e80b7ff641f24b759d64f7ec489be0ef4e0c16a9780b795dbe972b38d2",
  74.                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef"
  75.            ]
  76.        }
  77.    }
  78. ]

docker inspect命令返回的是一个JSON格式的消息,如果我们只要其中一项内容时,可以使用-f参数来指定:

 
 
  1. xiaosi@Qunar:~$ docker inspect -f {{".Architecture"}} 2fa927b5cdd3
  2. amd64
  3. xiaosi@Qunar:~$ docker inspect -f {{".RootFS"}} 2fa927b5cdd3
  4. {layers [sha256:9436069b92a3ec23351313d6decc5fba2ce1cd52aac77dd8da3b03b3dfcb5382 sha256:19429b698a2283bfaece7f590e438662e2078351a9ad077c6d1f7fb12f8cd08d sha256:82b57dbc5385a2a0edd94dfc86f9e4d75487cce30250fec94147abab0397f2b8 sha256:737f40e80b7ff641f24b759d64f7ec489be0ef4e0c16a9780b795dbe972b38d2 sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef] }
  5. xiaosi@Qunar:~$ docker inspect -f {{".RootFS.Type"}} 2fa927b5cdd3
  6. layers
  7. xiaosi@Qunar:~$ docker inspect -f {{".RootFS.Layers"}} 2fa927b5cdd3
  8. [sha256:9436069b92a3ec23351313d6decc5fba2ce1cd52aac77dd8da3b03b3dfcb5382 sha256:19429b698a2283bfaece7f590e438662e2078351a9ad077c6d1f7fb12f8cd08d sha256:82b57dbc5385a2a0edd94dfc86f9e4d75487cce30250fec94147abab0397f2b8 sha256:737f40e80b7ff641f24b759d64f7ec489be0ef4e0c16a9780b795dbe972b38d2 sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef]

备注:

命令后的2fa927b5cdd3表示镜像ID


在指定镜像ID的时候,通常使用该ID的前若干个字符组成的可区分字串来替代完整的ID:

 
 
  1. xiaosi@Qunar:~$ docker inspect -f {{".Architecture"}} 2fa9
  2. amd64


2.3 搜索镜像

使用docker search命令可以搜索远端仓库中共享的镜像

 
 
  1. xiaosi@Qunar:~$ sudo docker search mysql
  2. NAME                       DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
  3. mysql                      MySQL is a widely used, open-source relati...   2533      [OK]      
  4. mysql/mysql-server         Optimized MySQL Server Docker images. Crea...   161                  [OK]
  5. centurylink/mysql          Image containing mysql. Optimized to be li...   45                   [OK]
  6. sameersbn/mysql                                                            36                   [OK]
  7. google/mysql               MySQL server for Google Compute Engine          16                   [OK]
  8. appcontainers/mysql        Centos/Debian Based Customizable MySQL Con...   8                    [OK]
  9. marvambass/mysql           MySQL Server based on Ubuntu 14.04              6                    [OK]
  10. drupaldocker/mysql         MySQL for Drupal                                2                    [OK]
  11. alterway/mysql             Docker Mysql                                    2                    [OK]
  12. yfix/mysql                 Yfix docker built mysql                         2                    [OK]
  13. azukiapp/mysql             Docker image to run MySQL by Azuki - http:...   2                    [OK]
  14. kaluzki/mysql              mysql                                           1                    [OK]
  15. sin30/mysql                MySQL images with my own config files.          1                    [OK]
  16. phpmentors/mysql           MySQL server image                              1                    [OK]
  17. tetraweb/mysql                                                             1                    [OK]
  18. lancehudson/docker-mysql   MySQL is a widely used, open-source relati...   0                    [OK]
  19. akilli/mysql               akilli/base based MySQL image                   0                    [OK]
  20. projectomakase/mysql       Docker image for MySQL                          0                    [OK]
  21. dockerizedrupal/mysql      docker-mysql                                    0                    [OK]
  22. ahmet2mir/mysql            This is a Debian based image with MySQL se...   0                    [OK]
  23. nanobox/mysql              MySQL service for nanobox.io                    0                    [OK]
  24. vukor/mysql                Build for MySQL. Project available on http...   0                    [OK]
  25. tozd/mysql                 MySQL (MariaDB fork) Docker image.              0                    [OK]
  26. cloudposse/mysql           Improved `mysql` service with support for ...   0                    [OK]
  27. livingobjects/mysql        MySQL                                           0                    [OK]

可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、星级(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。

默认的输出结果将按照星级评价进行排序。官方的镜像说明是官方项目组创建和维护的,automated资源则允许用户验证镜像的来源和内容。

2.4 删除镜像

(1)使用镜像的标签删除镜像

使用docker rmi命令可以删除镜像,命令格式为

 
 
  1. docker rmi IMAGE[IMAGE...]

其中IMAGE可以为标签或ID。

但当镜像只剩下一个标签的时候就要小心了,此时再使用docker rmi命令会彻底删除该镜像。

(2)使用镜像ID删除镜像

当使用docker rmi命令后面跟上镜像的ID(也可以是ID能进行区分的部分前缀串)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。

注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的

先利用ubuntu镜像创建一个简单的容器,输出一句话“hello!I am here!”:

 
 
  1. xiaosi@Qunar:~$ docker run ubuntu echo 'hello! I am here!'
  2. hello! I am here!
使用docker ps-a命令可以看到本机上存在的所有容器:
 
 
  1. xiaosi@Qunar:~$ docker ps -a
  2. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
  3. 65db087a3d0f        ubuntu              "echo 'hello! I am he"   56 seconds ago      Exited (0) 55 seconds ago                       happy_brown
  4. 29590df260fb        ubuntu              "/bin/bash"              9 hours ago         Exited (127) 9 hours ago                        romantic_williams
  5. af5eda44bc58        ubuntu              "/bin/echo hello worl"   8 days ago          Exited (0) 8 days ago                           sad_bhaskara

以看到,后台存在退出状态的容器,是基于ubuntu:latest镜像创建的。

试图删除该镜像,Docker会提示有容器正在运行,无法删除:

 
 
  1. xiaosi@Qunar:~$ docker rmi ubuntu
  2. Error response from daemon: conflict: unable to remove repository reference "ubuntu" (must force) - container af5eda44bc58 is using its referenced image 2fa927b5cdd3

如果要想强行删除镜像,可以使用-f参数:
 
 
  1. docker rmi -f ubuntu

不推荐使用-f参数来强制删除一个存在容器依赖的镜像,因为这样往往会造成一些遗留问题。

正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。

2.5 创建镜像

创建镜像的方法有三种:基于已有镜像的容器创建基于本地模板导入基于Dockerfile创建

在这说一下基于已有镜像的容器创建:

该方法主要是使用docker commit命令,其命令格式为:

 
 
  1. docker commit[OPTIONS]CONTAINER[REPOSITORY[:TAG]]

OPTIONS参数: -a (--author) 作者信息 ; -m(--message) 提交信息 ; -p(--pause=true) 提交时暂停容器运行;


下面将演示如何使用该命令创建一个新镜像。首先,启动一个镜像,并在其中进行修改操作,例如创建一个test文件,之后退出

 
 
  1. xiaosi@Qunar:~$ docker run -t -i ubuntu /bin/bash
  2. root@8b9353e12fae:/# touch test
  3. root@8b9353e12fae:/# exit
  4. exit

容器的ID为8b9353e12fae。此时该容器跟原ubuntu:latest镜像相比,已经发生了改变,可以使用docker commit命令来提交为一个新的镜像。提交时可以使用ID或名称来指定容器:

 
 
  1. xiaosi@Qunar:~$ docker commit -m "ubuntu latest new images" -a "jifeng.si" 8b9353e12fae ubuntu:test
  2. sha256:e74cfd9cf8086321a302dd54a4964de749fde1211915efc8d4c64514654a607e

可以看到命令返回新创建的镜像的ID信息:sha256:e74cfd9cf8086321a302dd54a4964de749fde1211915efc8d4c64514654a607e

我们再看看本地的镜像列表,即可看到新创建的镜像:

 
 
  1. xiaosi@Qunar:~$ docker images
  2. REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
  3. ubuntu              test                e74cfd9cf808        40 seconds ago      122 MB
  4. ubuntu              latest              2fa927b5cdd3        3 weeks ago         122 MB
2.6 存出和载入镜像

可以使用docker savedocker load命令来存出和载入镜像。

(1)存出镜像

如果要存出镜像到本地文件,可以使用docker save命令。例如,存出本地的ubuntu:latest镜像为文件ubuntu_latest.tar:

 
  
  1. xiaosi@Qunar:~$ docker save -o ubuntu_latest.tar ubuntu:latest

(2)载入镜像

可以使用docker load从存出的本地文件中再导入到本地镜像库,例如从文件ubuntu_latest.tar导入镜像到本地镜像列表

 
  
  1. xiaosi@Qunar:~$ docker load --input ubuntu_latest.tar




来源于:《docker技术入门与实战》




相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
前端开发 关系型数据库 MySQL
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
|
2月前
|
网络协议 数据安全/隐私保护 Docker
Docker 镜像库国内加速的几种方法
Docker 镜像库国内加速的几种方法
|
10天前
|
应用服务中间件 Docker 容器
docker 镜像常用命令
docker 镜像常用命令
30 0
|
10天前
|
Linux Shell 虚拟化
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
15 0
|
17天前
|
存储 Kubernetes API
Docker拉取镜像或者kubectl出现的这个解决方案x509: certificate signed by unknown authority
Docker拉取镜像或者kubectl出现的这个解决方案x509: certificate signed by unknown authority
48 2
|
18天前
|
Linux Docker 容器
Linux彻底卸载Docker包括运行拉取的镜像
Linux彻底卸载Docker包括运行拉取的镜像
22 1
|
22天前
|
NoSQL 关系型数据库 MySQL
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
101 1
|
23天前
|
Docker 容器
docker删除镜像
docker删除镜像
51 0
|
1月前
|
网络安全 Docker 容器
docker 拷贝本地镜像
【2月更文挑战第27天】
|
1月前
|
SQL 关系型数据库 数据库
docker如何进入镜像其他的SQL
【2月更文挑战第25天】