• 本篇只针对命令以及效果进行学习,docker内部原理之类另开篇章
    • 搜索可用得docker镜像(image)
      1. docker search imagename
      2. ex docker search tutorial
    • 下载容器镜像

    下载镜像 docker pull 命令即可
    docker得镜像网站上,镜像是按照 用户名/镜像名 得方式来进行存储,
    特殊得镜像,比如ubuntu这中基础镜像,通过官方认证后,值得信任,可以直接用镜像名检索到
    ex docker pull learn/tutorial
    执行pull命令得时候要写玩证得名字

    • docker容器中运行hello world

    docker run 命令又两个参数,1是镜像名,2是要在镜像中运行得命令

    • 在容器中安装新程序

    在容器里面安装一个简单得程序 ping 之前下载得 tutorial 镜像是基于ubuntu ,所以可以使用ubuntu得apt-get命令来安装ping冲虚
    注意:apt-get命令执行完毕后,容器就会停止,但是对于容器得改动不会消失

    • 保存对容器的修改

    在对某一个容器做了修改之后,可以把容器的修改保存下来,这样之后可以从保存后的最新状态里运行该容器。
    docker中保存状态的过程称之为committing,保存的新旧状态之间的区别,从而产生一个新的版本

    首先使用 docker ps -l命令获得安装完平命令后容器的id,然后把镜像保存为 learn/ping
    ex docker commit 容器id learn/ping
    之后使用docker images进行查看改动是否成功。

    • 运行新的镜像

    在新的镜像中执行 ping baidu.com
    docker run learn/ping ping baidu.com

    • 检查运行中的镜像

    docker ps 命令 可一查看所有正在运行中的容器列表,
    docker inspect命令 可以查看更详细的关于某个容器的信息
    docker inspect + 容器id

    • 发布自己的镜像

    docker push iamgeName

    • 列出镜像

    docker image ls 列表包含了 仓库名标签镜像 ID创建时间 以及 所占用的空间
    其中仓库名、标签在之前的基础概念章节已经介绍过了。镜像 ID 则是镜像的唯一标识,一个镜像可以对应多个 标签。因此,在上面的例子中,我们可以看到 ubuntu:18.04ubuntu:latest 拥有相同的 ID,因为它们对应的是同一个镜像。

    • 列出部分镜像

      docker image ls imagename 
      docker image ls 支持强大的过滤参数 --filter 或者简写 -f
      docker image ls -f since=mongo:3.2  取 mongo3.2之后的版本
      docker image ls -f before=mongo:3.2  取 mongo3.2之前的版本
      另外,如果镜像构建时,定义了label ,还可以通过label来进行过滤
      $ docker image ls -f label=com.example.version=0.1
      
    • 以特定的格式显示

    docker image ls -q 把所有镜像的id显示出来

    • 删除本地镜像

      $ docker image rm [选项] <镜像1> [<镜像2> ...]
      docker image rm imageId 根据镜像id删除镜像,一般需要3位以上的id即可确认所指向的镜像
      docker image rm imagename 根据镜像名删除镜像
      docker image rm digests 
      显示摘要  docker image ls --digests
      
    • 利用commit理解镜像构成

    镜像是容器的基础,每次执行 docker run 的时候都会指定哪个镜像作为容器运行的基础。在之前的例子中,我们所使用的都是来自于 Docker Hub 的镜像。直接使用这些镜像是可以满足一定的需求,而当这些镜像无法直接满足需求时,我们就需要定制这些镜像。接下来的几节就将讲解如何定制镜像。

    docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
    ex
    $ docker commit \
        --author "Tao Wang <twang2218@gmail.com>" \
        --message "修改了默认网页" \
        webserver \
        nginx:v2
    sha256:07e33465974800ce65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa1795214
    还可以使用docker history 具体查看镜像内的历史记录
    docker history imangename
    
    • 慎重使用docker commit

    使用 docker commit 命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用。
    首先,如果仔细观察之前的 docker diff webserver 的结果,你会发现除了真正想要修改的 /usr/share/nginx/html/index.html 文件外,由于命令的执行,还有很多文件被改动或添加了。这还仅仅是最简单的操作,如果是安装软件包、编译构建,那会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像极为臃肿。
    此外,使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为 黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体的操作。这种黑箱镜像的维护工作是非常痛苦的。

    而且,回顾之前提及的镜像所使用的分层存储的概念,除当前层外,之前的每一层都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用 docker commit 制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。这会让镜像更加臃肿。

    • 镜像(image) 与 容器(container) 之间的关系

    镜像相当于面向对象中的类,容器相当于由类实例化生成的对象。
    仓库
    镜像构建完成后,可以很轻松的在当前宿主机上运行,但是如果要在其他服务器上进行使用,就需要一个集中的存储,分发镜像的服务,docker registry 应运而生
    一个 Docker Registry 中可以包含多个 仓库(Repository);每个仓库可以包含多个 标签(Tag);每个标签对应一个镜像。
    通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
    以 Ubuntu 镜像 为例,ubuntu 是仓库的名字,其内包含有不同的版本标签,如,16.04, 18.04。我们可以通过 ubuntu:16.04,或者 ubuntu:18.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest。
    仓库名经常以 两段式路径 形式出现,比如 jwilder/nginx-proxy,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。
    docker registry 公开服务
    docker hub
    私有 dokcer registry 私有仓库服务
    docker 的个人仓库服务