Docker


什么是Docker?

  Docker是一个开源的应用容器引擎,基于Go语言开发。

  Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。

  Docker容器完全使用沙箱机制,相互之间不会有任何接口,更重要的容器性能开销极低。

Docker的架构:

  Docker包括三个基本概念:

  镜像(Image):Docker镜像(Image),就相当于是一个root文件系统。比如官方镜像ubuntu:16.04就包含了完整的一套Ubuntu16.04最小系统的root文件系统

  容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行的实体。容器可以被创建、启动、停止、删除、暂停等。

  仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

  Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

  Docker 容器通过 Docker 镜像来创建。

  容器与镜像的关系类似于面向对象编程中的对象与类

概念说明

Docker 镜像(Images)

Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。

Docker 容器(Container)

容器是独立运行的一个或一组应用,是镜像运行时的实体。

Docker 客户端(Client)

Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。

Docker 主机(Host)

一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

Docker Registry

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。

Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。

一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

Docker Machine

Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

Docker的应用场景:

  ①:Web应用的自动化打包和发布

  ②:自动化测试和持续继承、发布

  ③:在服务型环境中部署和调整数据库或其他的后台应用

  ④:从头编译或者扩展现有的OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

 Docker容器使用:

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

  如:docker run ubuntu:15.10 /bin/echo "Hello world"

    docker:Docker的二进制执行文件

    run:与docker组合来运行一个容器

    ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像    

    /bin/echo "Hello world": 在启动的容器里执行的命令

    即:Docker以ubuntu15.10镜像创建一个新容器,然后在容器里执行『/bin/echo "Hello world"』,然后输出结果。

  运行交互式的容器

    通过 docker 的两个参数 -i -t,让 docker 运行的容器可以与我们进行交互

    如:docker run -i -t ubuntu:15.10 /bin/bash

      -t: 在新容器内指定一个伪终端或终端。

      -i: 允许你对容器内的标准输入 (STDIN) 进行交互。

    退出终端:

      exit命令或ctrl+d

  后台运行容器:在大部分场景下,我们希望docker服务是在后台运行的,可以通过 -d 指定容器的运行模式

    docker run -itd --name ubuntu-test ubuntu /bin/bash

    注:加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec

  进入容器:

    在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:

    docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。 docker exec -it 243c32535da7 /bin/bash

  停止容器:docker ps -a 查看容器信息, docker stop <容器 ID>

  启动已停止运行的容器:docker start 容器id

  重启容器:docker restart <容器 ID>

  删除容器:docker rm -f <容器 ID>

    docker container prune:清理掉所有处于终止状态的容器。

  复制文件或目录到镜像:docker cp 源目录 [docker_image_id]:目标目录

  提交修改后的镜像:docker commit -a "你的小米邮箱前缀" -m "本次提交的简要信息" 43c1e670aedc  cr.d.xiaomi.net/deploy/镜像名:标签

  推送镜像到仓库中:docker push  cr.d.xiaomi.net/deploy/镜像名:标签

Docker镜像使用:

  当运行容器时,使用的镜像如果在本地中不存在,docker就会自动从 docker 镜像仓库中下载,默认是从Docker Hub公共镜像源下载。

  获取镜像:docker pull 镜像名:TAG

  列出镜像列表:docker images

  查找镜像:docker seach 镜像名

  删除镜像:docker rmi 镜像名

  创建镜像:

    当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过一下两种方式对镜像进行更改

    1、从已经创建的镜像中更新镜像,并且提交这个镜像

    2、使用Dockerfile指令来创建一个新的镜像

   更新镜像:

    ①:更新镜像之前,需要先使用镜像来运行一个容器,如:docker run -t -i ubuntu:15.10 /bin/bash

    ②:然后在运行的容器内使用 apt-get update 命令进行更新,更新之后,exit指令退出

    ③:docker commit来提交容器副本

   构建镜像:

    使用docker build,从零开始来创建一个新的镜像。为此,我们需要创建一个Dockerfile文件,其中包含一组指令来告诉Docker如何构建我们的镜像

    ①:创建Dockerfile文件

     Dockerfile中每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

      FROM指令指定使用哪个镜像源

      RUN 指令告诉docker 在镜像内执行命令,安装了什么

    ②:使用Dockerfile构建镜像

      docker build -t runoob/centos:6.7 .

        -t :指定要创建的目标镜像名

        . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

Docker Dockerfile:

  Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

  使用Dockerfile定制镜像

  FROM:使用的基础镜像源

  RUN:用于执行后面跟着的命令行命令

    注意:Dockerfile的指令每执行一次都会在docker上新建一层。所以过多无意义的层,会造成镜像膨胀过大。因此 RUN 后面有多个命令的话,以&&符号连接命令,这样执行后,只会创建一层镜像。

  COPY:复制指令,从上下文路径中复制文件或目录到容器指定路径

    上下文路径:是指docker在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令在得知这个路径后,会将路径下的所有内容打包。默认的上下文目录是Dockerfile所在的目录。

    注意:上下文路径下不要放无用的文件,因为会一起打包给docker引擎,如果文件过多会造成过程缓慢。

   CMD:类似RUN指令,但二者运行的时间点不同:

    CMD在docker run时运行

    RUN是在docker build

  ENV:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量

    格式:

      ENV  
      ENV =<value1> =<value2>...

   WORKDIR:指定工作目录

    用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。

    docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

END.