所有操作默认非root用户,本文中用 lz 用户。

核心概念

  • 镜像(image)

    Docker 镜像(Image)就是一个只读的模板。例如:一个镜像可以包含一个完整的操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
    镜像(Image)就是一堆只读层(read-only layer)的统一视角。

  • 仓库(repo)

    库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器(register)上往往存放着多个仓库(repo),每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)
    仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括 时速云 、网易云 等,可以提供大陆用户更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库。
    当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
    Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。

  • 容器(container)

    Docker 利用容器(Container)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
    容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的
    一个运行态容器被定义为一个可读写的统一文件系统加上隔离的进程空间和包含在其中的进程。

demo

安装docker:

$ sudo wget -qO- https://get.docker.com/ | sh

启动docker服务:

$ sudo service docker start

由于docker默认属主为root,权限为rw,可读可写;其属组为docker,权限为rw,可读可写。普通用户要用 sudo 才能成功调用docker命令,除非将其添加到docker属组:

$ sudo groupadd docker  # 其实默认已经有这个group
$ sudo gpasswd -a <用户名> docker
$ sudo service docker restart  # 重启docker服务
$ newgrp - docker  # 如果不重启Ubuntu则要刷新会话group缓存

从阿里云的仓库拉取一个具有jdk和hadoop环境的一个基础镜像:

$ docker pull registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop
$ # registry.cn-hangzhou.aliyuncs.com为仓库注册服务器(Registry)
$ # kaibb为仓库(Repo)
$ # hadoop为tag

查看获取到的image:

$ docker images

显示:

REPOSITORY                                       TAG                 IMAGE ID            CREATED             SIZE
registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop   latest              44c31aee79de        3 years ago         927MB

通过 docker run 命令可以由镜像 创建&启动&进入 容器:

$ docker run -it --name <容器名> -h <主机名> <镜像名> /bin/bash
  • -i : 以交互模式运行容器,通常与 -t 同时使用;
  • -t : 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • –name : 为容器指定一个名称;
  • -h : 指定容器的主机名。

新建3个终端窗口,分别 创建&启动&进入 hadoop0,hadoop1和hadoop2这3个容器:

$ docker run -it --name hadoop0 -h hadoop0 registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop /bin/bash
$ docker run -it --name hadoop1 -h hadoop1 registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop /bin/bash
$ docker run -it --name hadoop2 -h hadoop2 registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop /bin/bash

以hadoop0为例,运行 docker run 命令后会进入该“主机”的shell,且默认为root用户,工作目录为 /

$ docker run -it --name hadoop0 -h hadoop3 registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop /bin/bash
root@hadoop0:/#

可以像操作一个真正的Ubuntu节点一样操作hadoop0容器,因而可以用docker构建高效的Hadoop集群。

更多docker命令

开启docker服务:

$ sudo service docker start

关闭docker服务:

$ sudo service docker stop

创建容器:

$ docker create --name <容器名> <镜像名称>  # 只创建 未启动
$ # docker create 命令为指定的镜像(image)添加了一个可读写层,构成了一个新的容器。

创建容器并挂载本地目录:

$ docker create --name <容器名> -v <本地绝对路径> <镜像名称>
$ # 这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。
$ # 本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它。

启动容器:

$ docker start <容器名>

关闭容器:

$ docker stop <容器名>

重启容器:

$ docker restart <容器名>

进入容器交互界面(前提是容器已启动):

$ docker exec -it <容器名> /bin/bash

退出容器交互界面回到shell :

ctrl + D

查看容器:

$ docker ps  # 查看正在运行的容器
$ docker ps -a  # 查看所有容器
$ docker ps -n 3  # 查看最近运行(过)的3个容器

删除容器:

$ docker rm <容器名>  # 如果容器已关闭
$ docker rm -f <容器名>  # 如果容器正在运行

删除镜像:

$ docker rmi <image-id>
$ # 删除构成镜像的一个只读层。你只能够使用docker rmi来移除最顶层(top level layer)(也可以说是镜像)
$ # 你也可以使用-f参数来强制删除中间的只读层。

commit容器:

$ docker commit [-m="描述"] [--author="作者"] <container-id> [<用户名>/<镜像名>[:<tag>]]
$ # 将容器的可读写层转换为一个只读层,这样就把一个容器转换成了不可变的镜像。
$ # 省略tag默认为'latest'

Build Dockerfile:

$ docker build -t <用户名>/<镜像名>[:<tag>] <Dockerfile路径>

查看json格式镜像详细信息:

docker inspect <用户名>/<镜像名>:[<tag>]

镜像保存:

$ docker save <image-id>
$ # 创建一个镜像的压缩文件,这个文件能够在另外一个主机的Docker上使用。
$ # 和export命令不同,这个命令为每一个层都保存了它们的元数据。这个命令只能对镜像生效。

查看本地缓存镜像:

$ docker images