总体概述

  • docker是什么

    • 是什么?

      • 开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化
      • 完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),且容器性能开销极低
      • 基于 Go 语言开源的应用容器引擎,遵从 Apache2.0 协议开源
    • 为什么?

      • 一次构建,随处运行
        • 更快速的应用交付和部署
        • 更便捷的升级和扩缩容
        • 更简单的系统运维;
    • Docker与虚拟机对比

      • Docker的镜像层一般很小,只有几十KB,而虚拟机则通常以GB为单位。

        • 性能方面,Docker依附于宿主机,所以性能接近宿主机,而虚拟机相对于原主机来说性能较差。资源利用率方面,Docker的资源利用率较高,而虚拟机的资源利用率较低。

        • 隔离性方面,Docker和虚拟机都具有安全隔离的特性。

        • Docker直接在宿主机内核上运行,而虚拟机运行在隔离层Hypervisor上。

        • Docker可同时运行上千个容器,而虚拟机相对厚重,最多只能启动几十个。

        • 在运行速度方面,Docker优于虚拟机,Docker容器的启动和停止可以在秒级实现,而传统的虚拟机方式要慢得多

    • 架构

      • 三个基础概念

        • 镜像(image):Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器

          • 镜像唯一标识是其 ID 和摘要,而一个镜像可以有多个标签
          • 并非是像一个 ISO 那样的打包文件,是一个虚拟的概念。是由一组文件系统组成,或者说,由多层文件系统联合组成
        • 容器(container): Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。 可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

          可把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写

        • 仓库(repository):仓库(Repository)是集中存放镜像文件的场所

          仓库注册服务器上存放着多个仓库,每个仓库中包含多个镜像,每个镜像有不同的标签(tag)

  • 使用镜像

    Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像

    • 获取镜像

      • Docker 镜像仓库获取镜像的命令是 docker pull

        $ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
        

        对Docker Hub,如果不给出用户名,则默认为 library,就是官方镜像

        $ docker pull ubuntu:18.04
        18.04: Pulling from library/ubuntu
        92dc2a97ff99: Pull complete
        be13a9d27eb8: Pull complete
        c8299583700a: Pull complete
        Digest: sha256:4bc3ae6596938cb0d9e5ac51a1152ec9dcac2a1c50829c74abd9c4361e321b26
        Status: Downloaded newer image for ubuntu:18.04
        docker.io/library/ubuntu:18.04
        
    • 运行镜像

      • ubuntu:18.04为例,如果打算启动里面的 bash 并且进行交互式操作的话

        $ docker run -it --rm ubuntu:18.04 bash
        
        root@e7009c6ce357:/# cat /etc/os-release
        NAME="Ubuntu"
        VERSION="18.04.1 LTS (Bionic Beaver)"
        ID=ubuntu
        ID_LIKE=debian
        PRETTY_NAME="Ubuntu 18.04.1 LTS"
        VERSION_ID="18.04"
        HOME_URL="https://www.ubuntu.com/"
        SUPPORT_URL="https://help.ubuntu.com/"
        BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
        PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
        VERSION_CODENAME=bionic
        UBUNTU_CODENAME=bionic
        

        docker run 就是运行容器的命令,通过 exit 退出了这个容器

        --rm:这个参数是说容器退出后随之将其删除。

        默认情况,为排障需求,退出的容器并不会立即删除,除非手动 docker rm。这里随便执行命令,看结果,不需要排障和保留结果,使用 --rm 避免浪费空间

    • 列出镜像

      • 要想列出已经下载下来的镜像,可以使用 docker image ls

        $ docker image ls
        REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
        redis                latest              5f515359c7f8        5 days ago          183 MB
        nginx                latest              05a60462f8ba        5 days ago          181 MB
        
      • 列出部分镜像

        $ docker image ls ubuntu
        REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
        ubuntu              18.04               329ed837d508        3 days ago          63.3MB
        ubuntu              bionic              329ed837d508        3 days ago   
        
    • 镜像体积

      • Docker Hub 所显示的大小是网络传输中更关心的流量大小。而 docker image ls 显示的是镜像下载到本地后,展开的大小
      • docker image ls 列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用
    • 删除镜像

      • 可使用 docker image rm 命令

        $ docker image rm [选项] <镜像1> [<镜像2> ...]
        

        <镜像> 可以是 镜像短 ID镜像长 ID镜像名 或者 镜像摘要

        镜像的完整 ID,称为 长 ID 短 ID一般取前3个字符以上,只要足够区分别的镜像

      • 删除行为分为两类

        • Untagged信息:是将满足我们要求的所有镜像标签都删除
        • Delete 信息:一个镜像对应多个标签,当我们删除了所指定的标签后,可能别的标签指向了这个镜像,那么就不删

        并非所有 docker image rm 都产生删除镜像行为,有可能是取消了某个标签