use Docker to deploy Hadoop on a cluster/cloud

Docker 是一个轻量级的镜像,对于Hadoop,Spark在集群上的维护有比较重要的意义。

Docker 相当于一个轻量级的虚拟机。

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。Docker能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件。
Docker包括三个基本概念: image, container, and repository.

  • 镜像(Image)是一个特殊的文件系统
    操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(Image),就相当于是一个root文件系统。
    Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
  • 容器(Container)是image的实例化
    容器可以被创建、启动、停止、删除、暂停等 。
    容器的实质是宿主上的特殊进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。
    容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,初学时常常会混淆容器和虚拟机。
    容器具有一个临时的存储层,容器注销(进程终止),存储层也注销,其中的存储信息也消失。
    想要存储的信息,最好跳过容器的存储层,直接对宿主发生读写。
  • 仓库(Repository)是集中存放image的地方

Ref:
可能是把Docker的概念讲的最清楚的一篇文章
一小时Docker教程
什么是Docker?

容器的操作逻辑是用户可以在容器中进行各种操作。然后保存对容器的修改,就可以得到一个新的镜像。然后部署到其他地方也可以快速部署,并且是隔离的。
Ref:
Docker入门教程

安装Docker
使用镜像:获取,列出,删除等
操作容器:启动,进入
访问仓库
数据管理
Ref:
Docker技术入门与实战

1. 安装 Docker

1.1 ubuntu查看系统位数,版本号

1
2
3
4
5
uname -a
or
lsb_release -a
or
cat /proc/version

1.2. 卸载旧版本

1
2
3
sudo apt-get remove docker \
docker-engine \
docker.io

1.3. install Docker
1.3.1. 使用 APT 安装
由于 apt 源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用HTTPS 传输的软件包以及 CA 证书。

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
# 为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 然后,向 source.list 中添加 Docker 软件源
sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"

1.3.2. 安装 Docker

1
2
3
4
5
6
sudo apt-get update
sudo apt-get install docker-ce
# 查看 Docker 版本
docker --version
or
docker -v

1.4. 启动 Docker

1
2
sudo systemctl enable docker
sudo systemctl start docker

1.5. 建立 docker 用户组, 将当前用户加入 docker 组:

1
2
sudo groupadd docker
sudo usermod -aG docker $USER

退出当前终端并重新登录,进行如下测试。
1.6. 测试 Docker 是否安装正确

1
2
3
4
5
6
7
8
9
docker run hello-world
输出如下信息
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9db2ca6ccae0: Pull complete
Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
......

2. 下载、使用 Docker 镜像

镜像是 Docker 的三大组件之一。

2.1 下载镜像

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

1
2
3
4
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
docker pull --help
docker pull ubuntu:16.04
#将会获取官方镜像 library/ubuntu 仓库中标签为 16.04 的镜像。

2.2 启动

启动就是实例化一个镜像,生成一个容器。有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。以上面的 ubuntu:16.04 为例,如果我们打算启动里面的 bash 并且进行交互式操作的话,可以执行下面的命令。

1
2
3
docker run -it --rm \
ubuntu:16.04 \
bash

2.3 列出image

要想列出已经下载下来的镜像,可以使用 docker image ls 命令。
列表包含了 仓库名 、 标签 、 镜像 ID 、 创建时间 以及 所占用的空间 。
镜像 ID 则是镜像的唯一标识,一个镜像可以对应多个标签。

1
docker image ls

2.4 删除本地镜像

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

2.5 利用 commit 理解镜像构成

docker commit是用于一些特殊场合,比如比如被入侵后保存现场等。不要用来定制镜像。
镜像是容器的基础,每次执行 docker run 的时候都会指定哪个镜像作为容器运行的基础。在之前的例子中,我们所使用的都是来自于 Docker Hub 的镜像。直接使用这些镜像是可以满足一定的需求,而当这些镜像无法直接满足需求时,我们就需要定制这些镜像。接下来的几节就将讲解如何定制镜像。
当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

2.6 使用 Dockerfile 定制镜像

3 操作容器

容器的操作可以大致分为:启动,守护,终止;进入,导入,导出;删除;