Docker学习笔记(1)-Docker镜像

获取镜像

$docker pull NAME[:TAG]
如果不加TAG则表示下载最新的镜像,一个镜像由“名称”+“标签决定”
使用不同镜像仓库服务器情况下,可能会出现镜像重名:
严格的将,镜像的仓库名称中还应该添加仓库地址(即registry,注册服务器)作为前缀,如果使用Docker Hub服务,该前缀可以忽略。
即:$docker pull ubuntu:14.04相当于$docker pull registry.hub.docker.com/ubuntu:14.04

image

pull子命令:

  • -a, --all-tags=true|false:是否获取仓库中的所有镜像,默认为否。
    使用镜像:例如利用该镜像创建一个容器,在其中运行bash应用,执行ping localhost:
    $docker run -it unbuntu[:TAG] bash
    root@f46310567509:/# ping localhost

如果提示command not found,则
$apt-get update
$apt-get install iputils-ping
详细见:http://blog.csdn.net/silentwolfyh/article/details/52336007

image

image

image


查看镜像信息

docker images [OPTIONS][REPOSITORY[:TAG]]
OPTIONS说明:

  • -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
  • —digests :显示镜像的摘要信息;
  • -f :显示满足条件的镜像;
  • —format :指定返回值的模板文件;
  • --no-trunc :显示完整的镜像信息;
  • -q :只显示镜像ID。
    使用docker images命令列出镜像
    image
  • 镜像的仓库:ubuntu的系列镜像由ubuntu仓库保存
  • 标签
  • 镜像ID,镜像的唯一标识
  • 创建的时间,说明镜像最后跟新时间
  • 镜像大小

镜像标签

使用tag命令添加镜像标签,可以发现多了一个myubuntu:latest标签,其id和ubuntu:latest是一样的,其实他们都指向同一个镜像,只是别名不同,标签相当于起到了链接的作用。


image

查看镜像详细信息

使用docker inspect命令查看详细信息,包括制作者、适应架构、各层的数字摘要等:

image

输出一个json文件

[
  {
    "Id":"sha256:8b72bba4485f1004e8378bc6bc42775f8d4fb851c750c6c0329d3770b3a09086",
    "RepoTags":[
      "myubuntu:latest",
      "ubuntu:latest"
    ],
    "RepoDigests":[
      "ubuntu@sha256:2b9285d3e340ae9d4297f83fed6a9563493945935fc787e98cc32a69f5687641"
    ],
    "Parent":"",
    "Comment":"",
    "Created":"2017-09-13T03:58:50.383839319Z",
    "Container":"ee87d884293ece0d9fa040a43ffb75097264185f94437a0d1fc2ddfd3c82ca4b",
    "ContainerConfig":{
      "Hostname":"ee87d884293e",
      "Domainname":"",
      "User":"",
      "AttachStdin":false,
      "AttachStdout":false,
      "AttachStderr":false,
      "Tty":false,
      "OpenStdin":false,
      "StdinOnce":false,
      "Env":[
        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
      ],
      "Cmd":[
        "/bin/sh",
        "-c",
        "#(nop) ",
        "CMD ["/bin/bash"]"
      ],
      "ArgsEscaped":true,
      "Image":"sha256:5bf9c8f025cb9bdfec431fbf2a39e1d25117a94ce2b10db01db9630addfc5e37",
      "Volumes":null,
      "WorkingDir":"",
      "Entrypoint":null,
      "OnBuild":null,
      "Labels":{
​
      }
    },
    "DockerVersion":"17.06.2-ce",
    "Author":"",
    "Config":{
      "Hostname":"",
      "Domainname":"",
      "User":"",
      "AttachStdin":false,
      "AttachStdout":false,
      "AttachStderr":false,
      "Tty":false,
      "OpenStdin":false,
      "StdinOnce":false,
      "Env":[
        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
      ],
      "Cmd":[
        "/bin/bash"
      ],
      "ArgsEscaped":true,
      "Image":"sha256:5bf9c8f025cb9bdfec431fbf2a39e1d25117a94ce2b10db01db9630addfc5e37",
      "Volumes":null,
      "WorkingDir":"",
      "Entrypoint":null,
      "OnBuild":null,
      "Labels":null
    },
    "Architecture":"amd64",
    "Os":"linux",
    "Size":120102168,
    "VirtualSize":120102168,
    "GraphDriver":{
      "Data":{
        "LowerDir":"/var/lib/docker/overlay2/579119ec0ba94ba9c2b510b75228f366c14fc1a29302f29a7c915946f9038c54/diff:/var/lib/docker/overlay2/2286560d99b26f3e25b0cb65f100915b2bf3848ff483b2b46f036a782fe92e87/diff:/var/lib/docker/overlay2/90c4f96886f317dfc958dededefa77f9a648011b7002e42c458b61022e950ab9/diff:/var/lib/docker/overlay2/fba0d170b11c979215b1fe227f86b3499427f1908f3f70dbddde2f94d433ee77/diff",
        "MergedDir":"/var/lib/docker/overlay2/95395204f6fdd03d04da60ee7d1c1e7ff4bf7e96eb789eca0cdeedf58125aecb/merged",
        "UpperDir":"/var/lib/docker/overlay2/95395204f6fdd03d04da60ee7d1c1e7ff4bf7e96eb789eca0cdeedf58125aecb/diff",
        "WorkDir":"/var/lib/docker/overlay2/95395204f6fdd03d04da60ee7d1c1e7ff4bf7e96eb789eca0cdeedf58125aecb/work"
      },
      "Name":"overlay2"
    },
    "RootFS":{
      "Type":"layers",
      "Layers":[
        "sha256:8aa4fcad5eeb286fe9696898d988dc85503c6392d1a2bd9023911fb0d6d27081",
        "sha256:ebf3d6975c708f538b14a5267afd2c4c64e8243d195aa11d878e566a7e64c727",
        "sha256:a76db6d8fac422acd5fb6c28166c906c202639e4e833cf88c7d4965b806c5437",
        "sha256:cd1d6655b4e44bb95df75bd2ecde4ad6799dd23337a9dedadf6e0b7f0efdc27e",
        "sha256:3996d0debc49f9a96c25d4ab7a5c9e824229c09976551b80ab0da70fa993a10d"
      ]
    }
  }
]

可以使用-f参数来指定获取某一项参数:

image

参考http://www.cnblogs.com/boshen-hzb/p/6376674.html


镜像历史

使用history命令查看镜像历史。
镜像文件由多个层组成,可以用history命令,显示各层的创建信息。

image


搜寻镜像

使用docker search命令可以搜索远端仓库中共享的镜像,默认搜索官方仓库总的镜像。用法为docker search TERM,支持的主要参数包括:

  • --automated=true|false:仅显示自动创建的镜像,默认为否
  • --no-trunc=true|false:输出信息不截断显示,默认为否
  • -s, --stars=X:指定仅显示评价为指定星级以上的镜像,默认为0,即输出所有镜像。
    例如,搜索所有自动创建的3星级以上的带 nginx关键字的镜像:
    image

删除镜像

使用docker rmi命令可以删除镜像,命令格式为docker rmi IMAGE [IMAGE],其中IMAGE可以为标签或ID。
例如,要删除掉myubuntu:latest镜像,可以使用如下命令

image

可以看出,如果一个镜像有多个标签,只会删除多个标签中指定的标签而已,镜像不会受影响。
如果某个镜像只有一个标签时,则要注意,删除标签就会删除镜像。
现在只有一个标签,然后尝试删除镜像:
image

删除失败,因为有容器还在镜像上面运行
可以使用docker ps -a命令查看本机上的所有容器:
image

可以看出有容器在镜像上运行,所以不能直接删除,当然可以使用命令
$docker rmi -f ubuntu:latest来强制删除,但是不建议这样做,建议先删除容器,然后删除镜像:
我们先使用-f参数来删除httpd镜像:
image

但是发现镜像依然存在
image

再次使用$docker ps -a命令来查看容器,发现仍然有容器运行
image

所以并不推荐使用-f参数来强制删除,下面是正确的步骤,先删除运行在镜像上面的容器,然后再删除镜像。
现在先使用$docker rm CONTAINER_ID删除容器,有一个错误,
image

可以看出id为a420...的容器还在运行,所以不能删除,使用$docker ps -a查看删除情况,
状态为未运行的容器已经删除,然而运行状态的并没有删除
所以现在需要先使用$docker stop CONTAINER_ID停止运行的容器
image

可以看出id为a420...的容器状态已经改变,现在可以删除了
image

可以看出,容器已经被删除了,现在就可以去删除httpd镜像了:
image

使用$docker rmi IMAGE_ID删除镜像,然后使用$docker images查看删除情况,可以看出httpd镜像已经全部删除完了。
一次性删除所有容器
image


创建镜像

创建镜像的方法主要有三种:

  1. 基于已有镜像的容器创建
  2. 基于本地模板导入
  3. 基于Dockerfile创建
    这里主要介绍前两种方法,第三种方法后续学习笔记介绍。

基于已有镜像的容器创建

主要使用docker commit命令。命令格式为
docker commit [OPTIONS] CONTAINER [REPOSITORY [:TAG]]
​ 所基于的容器 创建的镜像的标签
主要的选项包括:

  • -a, author="":作者信息
  • -c, --change=[]:提交的时候执行Dockerfile命令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|USER|VOLUME|WORKDIR
  • -m, --message="":提交消息
  • -p, --pause=true:提交时暂停容器运行
    下面演示怎么根据已有镜像的容器创建一个新的镜像。
    首先启动一个镜像,然后进行进行一些操作,例如创建一个test文件,然后退出:
    $docker run -it ubuntu:latest /bin/bash
    root@3548583db1bb:/# touch test
    root@3548583db1bb:/# exit
    记住容器的ID为3548583db1bb。
    image

    然后使用docker images命令查看刚才创建的镜像,也可以使用docker ps -a来查看容器。
    接下来使用·docker commit·命令根据容器3548583db1bb来创建一个新的镜像。
  • 提交信为:Added a new file
  • 作者信息为:Docker Newbee
  • 源容器:3548583db1bb
  • 被创建的容器的标签:test:0.1


    image

    使用docker image命令查看刚才创建的test:0.1镜像

基于本地模板导入

用户可以直接从一个操作系统模板文件导入一个镜像文件,主要使用docker import命令。命令格式为
docker import [OPTIONS] file |URL| -[REPOSITORY[:TAG]]
OPTIONS说明:

  • -c:应用docker指令创建镜像文件
  • -m:提交信息
    要直接导入一个镜像,可以使用OpenVZ提供的模板来创建,或者用其他已导出的镜像模板来创建。OPENVZ模板的下载地址为http://openvz.org/Dowload/templates/precreated
    image

存出和载入镜像

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

存出镜像

docker save:将指定镜像保存成tar归档文件。
语法:docker save [OPTIONS] IMAGE [IMAGE…]
OPTIONS说明:

  • -o:输出到文件
    image

    得到了my_ubuntu.tar归档

载入镜像

可以使用docker load将导出的tar文件再导入到本地文件镜像库,例如从文件my_ubuntu.tar
docker load:从一个在stdin上的tar归档文件中装载镜像
OPTIONS说明:

  • -i, --input="" 从一个tar归档文件中读入,而不是从stdin中
    $docker load --input my_ubuntu.tar

    $docker load < my_ubuntu.tar

上传镜像

可以使用docker push命令上传镜像到仓库,默认上传到Docker Hub官方仓库(需要登录)。
命令格式为:
docker push NAME[:TAG] | REGISTRY_HOST[:REGISTRY_PORT] /]NAME [:TAG]
先给需要push的镜像打上标签,因为的我用户名叫kylinxiang,所以改为kylinxiang/push_test:1.0
默认是Push到Docker Hub,所以可以看到最后push到的仓库为docker.io/kylinxiang

image

之后就可以在Docker Hub上面就可以查看Push的镜像

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

推荐阅读更多精彩内容