从今年 3 月份实习接触 golang 起,Docker 就时不时出现, 也曾看过几篇简介博文,但都没有后续。本文就对于 docker 进行一次简单的探究。

Docker是什么?

Wiki 定义

Wiki: Docker is a set of platform-as-a-service (PaaS) products that use operating-system-level virtualization to deliver software in packages called containers.[5] Containers are isolated from one another and bundle their own software, libraries and configuration files; they can communicate with each other through well-defined channels.[6] All containers are run by a single operating-system kernel and are thus more lightweight than virtual machines.[7]

简单翻译: Docker 是一个 Paas 产品可以用来以系统级的虚拟化, 用于在称为 容器(containers) 的包中交付产品。容器之间彼此隔离,彼此之间可以通过定义通道(channels)进行通信。 所有的容器都由一个操作系统内核线程(守护进程)。

同类技术有哪些以及简单对比

Docker 主要组成成分

docker 与 虚拟机

  1. images 镜像 Docker 镜像是用于创建 Docker 容器的模板,类似与面向对象中的类(ps: docker 镜像不同与我们熟知的操作系统镜像文件,它更像一个 静态文件 + git 版本控制)
  2. container 容器 容器是独立运行的一个或一组实例, 类似与面向对象中的对象实例
  3. daemon docker 守护进程 执行镜像编译,容器启停以及分发,数据卷管理等,一个client可以与多个docker daemon通信。

类比 Docker 与 面向对象 | Docker | 面向对象 | | ---- | ---- | | image 镜像 | class 类 | | container 容器 | object 对象 | | daemon 守护进程 | JVM 实例 |

  1. client 客户端 与 Docker Deamon 交互。
  2. registry 镜像库 用于存储 Docker 镜像,类似于 github,现有公共的 Registry DockerCloud.
  3. services 服务 服务是docker swarm引入的概念,可以用于在多宿主机之间伸缩容器数目,支持负载均衡已经服务路由功能

容器 Docker & 虚拟机

  1. 虚拟机 虚拟化 先模拟出硬件再在其基础上虚拟出操作系统 Guest OS

  2. container 虚拟化 是一种轻量级的虚拟化技术,它不需要模拟硬件创建虚拟机。在Linux系统里面,使用到Linux kernel的cgroups,namespace(ipc,network, user,pid,mount),capability等用于隔离运行环境和资源限制的技术,我们称之为容器。容器技术早就出现。例如Solaris Zones 和 BSD jails 就是非 Linux 操作系统上的容器,而用于 Linux 的容器技术也有很多如 Linux-Vserver、OpenVZ 和 FreeVPS。虽然这些技术都已经成熟,但是这些解决方案还没有将它们的容器支持集成到主流 Linux 内核。

  3. Docker 虚拟化

总的来说,容器不等同于Docker,容器更不是虚拟机。

Quick Start 快速开始

Docker 下载与安装

Docker 官网 根据自己的操作系统类型进行选择下载安装。

Hello World

Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。

1
2
root:$ docker run ubuntu:15.10 /bin/echo "Hello World"
Hello World

解释: docker + run 指定运行一个容器 ubuntu:15.10 指定要运行的进行,Docker 会主机寻找是否存在,不存在,将 docker pull 镜像仓库 Docker Hub 下载公共镜像 "/bin/echo "Hello World"" 在启动的容器内执行的命令

简单使用

对于 docker client 其命令与 git 类似,可以使用 docker --help 查看具体使用,下面举几个实用实例

  1. 交互式容器 -i -t 参数,让docker 运行的容器实现“对话”的能力

    1
    
    root: docker run -i -t ubuntu:15.10 /bin/bash
  2. 后台运行容器 -d

    1
    2
    
    docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
    2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63

    返回的容器 ID 而非预期的 Hello World,可以通过 docker ps 查看正在运行的容器

  3. 停止容器 docker stop (指定容器名或 ID)

总的来说 docker client 与 git 命令很类似。 后续将在后续详解中示范。