Docker从理论到实践(四)------Dokcer镜像

镜像

它是Docker的三大核心之一。

Docker运行容器前需要本地存在对应的镜像,如果本地没有存在对应的镜像,Docker将会尝试从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),当然,我们也可以通过配置,使用自定义的镜像仓库,如DaoCloud、阿里云镜像、网易蜂巢。

本节将介绍围绕镜像这一核心的具体操作:

【1】如何使用pull命令从Docker公有仓库中下载镜像到本地

【2】如何查看本地已有的镜像信息

【3】如何在远端仓库使用serach命令进行搜索和过滤

【4】如何删除镜像标签和镜像文件

【5】如何创建用户定制的镜像并且保存为外部文件

【6】如何向Docker Hub仓库推送自己的镜像

...... .......


1、搜索镜像

使用docker search命令搜索镜像,命令格式如下:

docker search <images>

例如:搜索一个CentOS系统的镜像

docker search centos

搜索结果如下:

字段信息说明:

NAME:镜像的仓库名字
DESCRIPTION:仓库的描述信息
STARS:评价,受欢迎的程度
OFFICIAL:是否是官方镜像
AUTOMATED:是否是自动构建的

查看帮助:man docker-search


2、获取镜像

镜像是Docker容器运行的前提

下载镜像命令:docker pull NAME[:TAG]

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

如:下载centos镜像,实际上就是下载centos:latest镜像,即目前最新版本的镜像。

[root@master03 /]# 
[root@master03 /]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
8ba884070f61: Pull complete 
Digest: sha256:b40cee82d6f98a785b6ae35748c958804621dc0f2194759a2b8911744457337d
Status: Downloaded newer image for centos:latest
[root@master03 /]# docker images  
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              3556258649b2        13 days ago         64.2MB
centos              latest              9f38484d220f        4 months ago        202MB
[root@master03 /]# 

下载过程,镜像文件是由若干层组成的,行首类似于f476d66f5408这样的数字表示各层的ID。下载过程中会获取并输出镜像的各层信息。

层layer实际上是AUFS(Advanced Union File System,一种联合文件系统)中的重要概念,是实际增量保存与更新的基础。

当然,我们可以通过制定标签来下载特定版本的某一镜像:

$ docker pull centos:7.2

最后使用镜像创建一个容器,并进入容器查看下版本

[root@master03 /]# 
[root@master03 /]# docker run -it centos /bin/bash 
[root@39327f2deca5 /]# cat /etc/re
redhat-release  resolv.conf     
[root@39327f2deca5 /]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
[root@39327f2deca5 /]# exit
exit
[root@master03 /]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
[root@master03 /]# 

3、查看镜像

查看docker镜像:

docker images

 字段信息说明:

REPOSITORY:仓库,当前镜像来自于哪个仓库
TAG:镜像标签信息,版本
IMAGE ID:镜像ID,具有唯一性
CREATED:镜像创建的时间
SIZE:镜像大小

4、删除镜像

当一个镜像有多个标签的时候,docker rmi 命令只是删除该镜像多个标签中的指定标签,不会影响镜像文件。但当该镜像只剩下一个标签的时候,此时删除该标签的时候会彻底删除该镜像。使用docker rmi 镜像ID号命令时,必须确保该镜像没有被容器使用才能进行,删除时系统会先删除掉指向该镜像的所有标签,然后删除镜像本身。

注意:运行中的Docker容器是无法删除的!这个时候镜像创建的容器存在,而且镜像文件是无法被删除的,所以应该先删除依赖该镜像的所有容器,再删除镜像。

必须通过docker stop或者docker kill命令停止容器,才能将其删除。否则将出现以下报错:

[root@master03 /]# docker images    
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              3556258649b2        13 days ago         64.2MB
centos              latest              9f38484d220f        4 months ago        202MB
[root@master03 /]# 
[root@master03 /]# docker rmi 355625
Error response from daemon: conflict: unable to delete 3556258649b2 (must be forced) - image is being used by stopped container 08ea8b861134

可以看到,我们直接去删除一个docker镜像是不行的,这个镜像目前正在被某个容器使用。

删除docker镜像思路:

docker save保存容器
docker images
docker save REPOSITORY > XX.tar

【1】删除镜像容器:
docker ps -a:查看目前Docker镜像的详细信息,及容器ID
docker rm CONTAINER ID:删除Docker容器

我们可以发现ID为08ea8b861134的容器已经被删除掉了。这时,我们就可以进行下一步删除镜像操作了。

【2】删除镜像:
docker images:查看Docker镜像
docker rmi IMAGE ID:删除Docker镜像

可以看到,这一步操作后,我们已成功删除Docker镜像。

【3】多个镜像ID相同时,删除其中一个镜像

当我们复制出来多个镜像时,它们共用一个镜像ID,这个时候我们停止容器后,直接按镜像ID去删除镜像时,会把这个相同镜像ID的所有镜像删除,这种操作实际上是很危险的。

为了避免上边的问题,我们可以按镜像名称和TAG标签来删除指定镜像:

docker rmi [REPOSITORY:TAG]

 上述操作将删除我们指定的镜像文件,可以看到已经删除成功。


5、创建镜像

创建镜像的方法有三种:【1】基于已有镜像的容器创建;【2】基于本地模板导入;【3】基于DockerFile创建;

这里我们重点介绍前两种方法,最后一种将在后面单独列一节内容详解。

【1】基于已有镜像的容器创建

主要使用docker commit命令,在提交一个容器的时候就指定镜像的名称和tag标签。

格式:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

主要选项包括:

  • -a:--author=" "作者信息;
  • -m:--message=" "提交信息
  • -p:--pause=true提交时暂停容器运行

下面将使用该docker run命令。首先,启动一个镜像,并在其中进行修改操作:

[root@master03 /]# docker run -it ubuntu:14.04 /bin/bash
Unable to find image 'ubuntu:14.04' locally
14.04: Pulling from library/ubuntu
a7344f52cb74: Pull complete 
515c9bb51536: Pull complete 
e1eabe0537eb: Pull complete 
4701f1215c13: Pull complete 
Digest: sha256:2f7c79927b346e436cc14c92bd4e5bd778c3bd7037f35bc639ac1589a7acfa90
Status: Downloaded newer image for ubuntu:14.04
root@05ae2239bb06:/# touch test
root@05ae2239bb06:/# exit
exit

容器ID为:05ae2239bb06

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

[root@master03 /]# docker commit -m "Added a new file" -a "Docker Newbee" 05ae2239bb06 test
sha256:d71e541c77aede47d409e33facdb514d428bf8ae871daa98b56578702e2b9aa3
[root@master03 /]# 

返回了新创建的镜像的ID信息:

d71e541c77aede47d409e33facdb514d428bf8ae871daa98b56578702e2b9aa3

查看本地镜像列表,即可看到新创建的镜像信息:

【2】基于本地模板导入

可以直接从一个操作系统模板文件导入一个镜像。这里我们先使用docker export导出一个容器。

[root@master03 /]# docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                    PORTS               NAMES
05ae2239bb06        ubuntu:14.04               "/bin/bash"              10 minutes ago      Up 2 seconds                                  zealous_elion
5517d6d70a09        microsoft/dotnet-samples   "dotnet dotnetapp.dl…"   45 hours ago        Exited (0) 45 hours ago                       romantic_goodall
39327f2deca5        centos                     "/bin/bash"              2 days ago          Exited (1) 44 hours ago                       gifted_elbakyan
[root@master03 /]# 
[root@master03 /]# docker export 05ae2239bb06 >test_export.tar
[root@master03 /]# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test_export.tar  test_for_run.tar  test_for_stop.tar  tmp  usr  var
[root@master03 /]# 

 然后,执行导入容器模板操作:

[root@master03 /]# cat test_export.tar | docker import - test/ubuntu:v1.0
sha256:9e06207a54143ade6761d07c7394bbbdad1bd8d66dd6b15373531852407ac578
[root@master03 /]# docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
test/ubuntu                v1.0                9e06207a5414        4 seconds ago       64.2MB
centos                     latest              9f38484d220f        4 months ago        202MB
microsoft/dotnet-samples   latest              70e25069fca7        5 months ago        181MB
[root@master03 /]# 

可以看到,新导入的镜像已经在本地存在了。 


6、导出/载入、上传镜像

导出镜像也就是将镜像保存到本地文件,可以使用docker save命令,会保存该镜像的所有历史记录和元数据信息。

docker save [IMAGE ID] > [SAVE_FILE.tar]
或者
docker save [IMAGE ID] [SAVE_FILE.tar]

或者:
docker save -o 存储文件名 存储的镜像

 


导入镜像

#可以用docker load命令将导出的tar文件导入到镜像库中
docker load < NAME.tar
#导入后会发现,该镜像的所有历史记录和元数据信息,全部都在。

例如,将ubuntu-latest.tart文件导入到本地镜像仓库中


 设置镜像标签

本地存储的镜像越来越多,我们就需要制定一个专门的仓库来存放这些镜像文件,也就是镜像仓库。

我们可以使用docker tag命令,为镜像打上一个新的标签。

docker tag [IMAGE ID/NAME] [IMAGE ID/NAME:TAG]
docker tag 3556258649b2 ubuntu-targ-test:dev
docker tag 镜像ID,这里是 3556258649b2 ,用户名称、镜像源名(repository name)和新的标签名(tag)。

docker images命令可以看到,ID为3556258649b2的镜像多了一个标签dev。

然后用docker push命令上传镜像。

docker push [IMAGE TAG]
如:docker push test/ubuntu:v1.0

基于DockerFile创建镜像------【此处省略,后边我们在Dockerfile文件方式创建镜像时详解】

当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  • 1.从已经创建的容器中更新镜像,并且提交这个镜像
  • 2.使用 Dockerfile 指令来创建一个新的镜像

构建镜像,我们使用docker build,从零开始创建一个新的镜像。为此,我们需要创建一个Dockerfile文件,其中包含指令来告诉我们Docker如何构建我们的镜像。


愿你就像早晨八九点钟的太阳,活力十足,永远年轻。

原创文章 104 获赞 154 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_27706119/article/details/89646005