1.Docker入门之使用Docker镜像

获取镜像

可以使用 docker [image] pull 命令直接从 Docker Hub 镜像源来下载镜像。 该 命 令的格式为 docker [image] pull NAME [:TAG] 。

其中,NAME是镜像仓库名称(用来区分镜像),TAG 是镜像的标签(往往用来表示版本信息)。通常情况下,描述一个镜像需要包括"名称+标签"信息。

一例
获取Ubuntu18.04系统的基础镜像

$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
423ae2b273f4: Pull complete
de83a2304fa1: Pull complete
f9a83bce3af0: Pull complete
b6b53be908de: Pull complete
Digest: sha256:04d48df82c938587820d7b6006f5071dbbffceb7ca01d2814f81857c631d44df
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04`

对于Docker镜像来说,如果不显示指定TAG,则默认选择latest标签

Digest为一个唯一的id,256个比特,64个十六进制字符组成。

镜像的仓库中应该有添加仓库的地址作为前缀,只是使用默认的DockerHub服务可以忽略前缀。

如例如docker pull ubuntu:18.04命令相当千docker pull registry.hub.docker.com/ubuntu:18.04命令,即从默认的注册服务器DocekrHub Registry中的 ubuntu 仓库来下载标记为18.04的镜像。

如果从非官方的仓库下载,需要指定全完整的厂库地址。如从网易蜂巢下载镜像

docker pull hub.c.163.com/public/ubuntu:18.04

pull子命令支持的选项主要包括

  • -a,-all-tag=true|false:是否获取远程仓库中的所有镜像,默认为否
  • --disable-content-trust:取消镜像的内容校验,more为真

另外,我们可以使用镜像代理服务来加速Docker镜像获取过程,可以在Docker服务启动配置中增加 registy-mirror=proxy_url来指定镜像代理服务

镜像下载到本地之后,即可以使用该镜像了,例如创建一个容器并运行bash应用,执行打印Hello World的命令:

# hukai @ hukaideMacBook-Pro in ~ [22:12:02]
$ docker run -it ubuntu:18.04 bash
root@c8aa5f15bb6b:/# echo 'Hello World!'
Hello World!
root@c8aa5f15bb6b:/# exit
exit

查看镜像信息

使用images命令列出镜像

docker images / docker images ls命令可以列出本地主机上已有的镜像的基本信息。

例如

hukai @ hukaideMacBook-Pro in ~ [22:31:53]
$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
ubuntu                18.04               72300a873c2c        4 days ago          64.2MB
mysql                 5.7                 d5cea958d330        5 days ago          440MB
nginx                 latest              2073e0bcb60e        3 weeks ago         127MB
openresty/openresty   latest              3c9e8cc37fa4        4 weeks ago         84.8MB
  • REPOSITORY 来自于哪个仓库
  • TAG 表示镜像的版本
  • IMAGE ID 唯一镜像标识 如果两个镜像相同,说明他实际上指向了同一个镜像,只是标签名称略有不同
  • CREATED 镜像最后的修改时间
  • SIZE 镜像的大小

images子命令主要支出以下选项

  • -a,--all=true|false:列出所有(包括临时文件)镜像文件,默认为否
  • --digests=true|false:列出镜像的数字摘要,默认为否
  • -f, --filter=[]:过滤列出的镜像,如dangling=true只显示没有被使用的镜像;也可指定带有特定标注的镜像等;
  • --formate="TEMPLATE":控制输出格式,如ID代表ID信息,Repository代表仓库信息等
  • --no-trunc=true|false:对输出结果中太长的部分是否进行截断,如镜像信息
  • -q --quite=true|false:仅输出ID信息,默认为否

其中, 还支持对输出结果进行控制的选项,如 -f,--filter=[]、--no-trunc=true |false、-q、--quiet=true|false等。

更多子命令选项还可以通过mandocker-images来查看。

使用tag命令添加镜像标签

为了方便在后续的工作中使用特定的镜像,还可以使用docker tag命令为本地镜像添加新的标签,如给ubuntu添加
docker tag ubuntu:18.04 myubuntu:latest

$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
myubuntu              latest              72300a873c2c        4 days ago          64.2MB
ubuntu                18.04               72300a873c2c        4 days ago          64.2MB
mysql                 5.7                 d5cea958d330        5 days ago          440MB
nginx                 latest              2073e0bcb60e        3 weeks ago         127MB
openresty/openresty   latest              3c9e8cc37fa4        4 weeks ago         84.8MB

可见增加了一个镜像标签,IMAGEID还是一致的,所以docker tag起到了类似链接的作用

使用inspect命令来查询详细信息

使用 docker inspect [image] ubuntu:18.04
当只要使用其中的一项的时候
docker inspect -f {{".Architecture"}} ubuntu:18.04

使用history命令来查看历史镜像

镜像文件由很多成构成,如何知道各个层的内容具体是什么呢?这个时候可以使用history子命令
docker history ubuntu:18.04

搜寻镜像

使用docker search可以搜索Docker Hub官方仓库中的镜像。语法为docker search [option] keyword。支持的命令有

  • -f,--filter filter:过滤输出的内容
  • --format string:格式化输出内容
  • --limit int 限制输出个数,默认为25个
  • --no-trunc:不截断输出。

例如搜索官方带nginx关键字的镜像
docker search --filter=is-official=true nginx
再如搜索收藏超过4的包含TensorFlow关键字的镜像
docker search --filter=stars=4 tensorflow

删除和清理镜像

使用标签删除镜像

使用docker rmi或者docker image rm命令可以删除镜像,命令格式为docker rmi IMAGE [IMAGE...]其中IMAGE可以为标签或者ID

支持的选项包括

  • -f,-force:强制删除镜像,即使有容器依赖它;
  • -no-prune:不要清理未带父标签的镜像。

如,要删除myubuntu:latest 镜像可以使用如下命令
docker rmi myubuntu:latest
此时只删除掉了一个TAG副本,原来的ubuntu:18.04镜像还在。当然,如果删掉一个没有副本的image,整个镜像将会被全部删除。

使用镜像ID来删除镜像

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

注意,当该进行创建的容器存在的时候,镜像文件默认是无法被删除的。如先使用ubuntu:18.04镜像创建一个简单的容器并输出一段话:
docker run ubuntu:18.04 echo 'hello docker!'

使用docker ps -a可以看到本机存在的所有容器
可以看到,后台存在一个退出状态的容器,是基于ubuntu镜像创建的,如果试图删除该镜像,Docker会提示有容器正在运行,无法删除。如果需要删除的话需要加上-f参数。但是通常不建议使用该方式。正确的做法是,先删除依赖该镜像的所有容器,然后再来删除镜像。

首先删除容器docker rm [CONTAINER ID],删除完之后使用docker rmi IMAGEID删除镜像。

清理镜像

使用Docker一段时间之后,系统会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以使用docker image prune命令来处理

支持选项包括:

  • -a,-all:删除所有无用的镜像,不光是临时镜像
  • -filter filter:只清理符合给定过滤器的镜像;
  • -f,-force:强制删除镜像,而不进行提示确认。
    例如,如下命令会自动清理临时的遗留镜像文件层,最后会提示释放空间:
    docker image prune -f

创建镜像

创建镜像主要有3种方式:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建

基于已有容器创建

该方法主要是使用docker [container] commit命令。

命令格式docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]],主要选项包括:

  • -a,--author=""作者信息
  • -c,--change=[]:提交的时候执行Dockerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等;
  • -m,--message=""提交信息;
  • -p,--pause=true:提交时候暂停容器运行

下面介绍如何使用命令创建一个新的镜像。

首先启动一个镜像,并在其中进行修改。例如创建一个test文件,之后推出。

# hukai @ hukaideMacBook-Pro in ~ [10:21:35]
$ docker run -it ubuntu:latest /bin/bash
root@15b1129203d6:/# touch test
root@15b1129203d6:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var
root@15b1129203d6:/# exit
exit

如下创建一个新的镜像

# hukai @ hukaideMacBook-Pro in ~ [10:22:31]
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS               NAMES
15b1129203d6        ubuntu:latest       "/bin/bash"              About a minute ago   Exited (0) 46 seconds ago                       hungry_brattain
c4a53b2a7970        nginx               "nginx -g 'daemon of…"   5 days ago           Exited (0) 5 days ago                           webserver

# hukai @ hukaideMacBook-Pro in ~ [10:23:17]
$ docker commit -m 'Add a new file' -a 'hukai' 15b11 ubuntubash:0.1
sha256:925cf7380c958dc5b9d709f37d3b290d455da7818562fb98af9e348888370e51

# hukai @ hukaideMacBook-Pro in ~ [10:26:46]
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntubash          0.1                 925cf7380c95        8 seconds ago       64.2MB
ubuntu              latest              72300a873c2c        5 days ago          64.2MB
mysql               5.7                 d5cea958d330        5 days ago          440MB
nginx               latest              2073e0bcb60e        3 weeks ago         127MB

# hukai @ hukaideMacBook-Pro in ~ [10:26:54]

基于Dockerfile创建

基于Dockerfile创建是最常见的方式,Dockefile是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。

下面给出一个Dockerfile的简单示例,基于debian:stretch-slim镜像安装Python3环境的镜像

FROM debian:stretch-slim

LABEL version="1.0" maintainer="docker user <docker_user@github>"

RUN apt-get update && apt-get install -y python3 && apt-get clean && rm -rf /var/lib/apt/list/*

使用docker build -f xxxx来创建

存出和载入镜像

存出镜像

如果需要将镜像导出到本地的话可以使用docker [image] save命令。该命令支持-o、-output string参数,导出镜像到指定的文件中

如导出nginx镜像到本地

# hukai @ hukaideMacBook-Pro in ~ [11:03:23]
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              72300a873c2c        5 days ago          64.2MB
mysql               5.7                 d5cea958d330        6 days ago          440MB
nginx               latest              2073e0bcb60e        3 weeks ago         127MB

# hukai @ hukaideMacBook-Pro in ~ [11:03:32]
$ docker save -o nginx_back.tar nginx:latest

载入镜像

使用docker [image] load将导出的文件再导入到本地镜像库中,支持-i、-input string选项,从指定文件中读入镜像内容

# hukai @ hukaideMacBook-Pro in ~ [11:06:28]
$ docker load -i nginx_back.tar
Loaded image: nginx:latest

上传镜像

用户可以使用docker push命令上传到镜像库中,默认上传到Docker Hub官方仓库中

一例

# hukai @ hukaideMacBook-Pro in ~ [11:22:20] C:1
$ docker tag  nginx:latest iceco1a/mytest:v0.1

# hukai @ hukaideMacBook-Pro in ~ [11:22:44]
$ docker push iceco1a/mytest:v0.1
The push refers to repository [docker.io/iceco1a/mytest]
22439467ad99: Pushed
b4a29beac87c: Pushed
488dfecc21b1: Pushed
v0.1: digest: sha256:62f787b94e5faddb79f96c84ac0877aaf28fb325bfc3601b9c0934d4c107ba94 size: 948
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容

  • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
    R_X阅读 4,382评论 0 27
  • 在前面两节我们学习了如何安装以及简单的运行管理docker容器,在本节我们将会更多的探讨关于docker镜像的知识...
    井底蛙蛙呱呱呱阅读 4,085评论 0 5
  • 原文在此 获取镜像 之前提到过,Docker Hub 上有大量的高质量的镜像可以用,这里我们就说一下怎么获取这些镜...
    若与阅读 1,866评论 1 5
  • 0x01 核心概念 Docker镜像类似于虚拟机镜像,可以理解为一个面向Docker引擎的只读模板,包含了文件系统...
    闲云逸心阅读 4,708评论 0 9
  • “月亮河公园邀请了最受欢迎的第五马戏团前来演出!身高一米以下小朋友免费!”玛格丽莎举着喇叭喊道:“月亮河公园邀请了...
    森纪阅读 2,538评论 15 28