zoukankan      html  css  js  c++  java
  • Docker学习心得

    每一轮新技术的兴起,无论对公司还是个人既是机会也是挑战。

    我个人的看法是:如果某项新技术未来将成为主流,就应该及早尽快掌握。 因为:

    1、新技术意味着新的市场和新的需求。
    初期掌握这种技术的人不会很多,而市场需求会越来越大,因而会形成供不应求的卖方市场,物以稀为贵,这对技术人员将是一个难得的价值提升机会。

    2、学习新技术需要时间和精力,早起步早成材。

    3、本文主要总结容器核心知识,进阶知识以后有机会在学习

    What - 什么是容器?
    容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。

    How-为什么需要容器?

    Docker 将集装箱思想运用到软件打包上,为代码提供了一个基于容器的标准化运输系统。Docker 可以将任何应用及其依赖打包成一个轻量级、可移植、自包含的容器。容器可以运行在几乎所有的操作系统上

    容器基本入门

    Docker 的核心组件包括:

    Docker 客户端 - Client:通过docker在host上构建和运行容器

    Docker 服务器 - Docker daemon:是服务器组件,以 Linux 后台服务的方式运行。

    Docker 镜像 - Image:通过它可以创建 Docker 容器。

    Registry:存放 Docker 镜像的仓库,Registry 分私有和公有两种。

    Docker 容器 - Container

    Docker 架构如下图所示:

     

    Docker 采用的是 Client/Server 架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 socket 或 REST API 与远程的服务器通信。

     

    新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。

    问什么 Docker 镜像要采用这种分层结构呢?

    最大的一个好处就是 - 共享资源。

    比如:有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享,我们将在后面更深入地讨论这个特性。

    dockerfile文件创建镜像

    Dockerfile 是一个文本文件,记录了镜像构建的所有步骤。

    第一个 Dockerfile

    用 Dockerfile 创建上节的 ubuntu-with-vi,其内容则为:

    下面我们运行 docker build 命令构建镜像并详细分析每个细节。

    root@ubuntu:~# pwd         ①  

    /root  

    root@ubuntu:~# ls          ②   

    Dockerfile   

    root@ubuntu:~#docker build -t ubuntu-with-vi-dockerfile .        ③   

    Sending build context to Docker daemon 32.26 kB           ④   

    Step 1 : FROM ubuntu           ⑤   

     ---> f753707788c5   

    Step 2 : RUN apt-get update && apt-get install -y vim           ⑥   

     ---> Running in 9f4d4166f7e3             ⑦   

    ......   

    Setting up vim (2:7.4.1689-3ubuntu1.1) ...   

     ---> 35ca89798937           ⑧    

    Removing intermediate container 9f4d4166f7e3          ⑨   

    Successfully built 35ca89798937           ⑩   

    root@ubuntu:~#   


    ① 当前目录为 /root。

    ② Dockerfile 准备就绪。

    ③ 运行 docker build 命令,-t 将新镜像命名为 ubuntu-with-vi-dockerfile,命令末尾的 . 指明 build context 为当前目录。Docker 默认会从 build context 中查找 Dockerfile 文件,我们也可以通过 -f 参数指定 Dockerfile 的位置。

    ④ 从这步开始就是镜像真正的构建过程。 首先 Docker 将 build context 中的所有文件发送给 Docker daemon。build context 为镜像构建提供所需要的文件或目录。
    Dockerfile 中的 ADD、COPY 等命令可以将 build context 中的文件添加到镜像。此例中,build context 为当前目录 /root,该目录下的所有文件和子目录都会被发送给 Docker daemon。

    所以,使用 build context 就得小心了,不要将多余文件放到 build context,特别不要把 /、/usr 作为 build context,否则构建过程会相当缓慢甚至失败。

    ⑤ Step 1:执行 FROM,将 ubuntu 作为 base 镜像。
    ubuntu 镜像 ID 为 f753707788c5。

    ⑥ Step 2:执行 RUN,安装 vim,具体步骤为 ⑦、⑧、⑨。

    ⑦ 启动 ID 为 9f4d4166f7e3 的临时容器,在容器中通过 apt-get 安装 vim。

    ⑧ 安装成功后,将容器保存为镜像,其 ID 为 35ca89798937。
    这一步底层使用的是类似 docker commit 的命令。

    ⑨ 删除临时容器 9f4d4166f7e3。

    ⑩ 镜像构建成功。 
    通过 docker images 查看镜像信息。 
    镜像 ID 为 35ca89798937,与构建时的输出一致。

    在上面的构建过程中,我们要特别注意指令 RUN 的执行过程 ⑦、⑧、⑨。Docker 会在启动的临时容器中执行操作,并通过 commit 保存为新的镜像。

    查看镜像分层结构

    ubuntu-with-vi-dockerfile 是通过在 base 镜像的顶部添加一个新的镜像层而得到的。

    这个新镜像层的内容由 RUN apt-get update && apt-get install -y vim 生成。这一点我们可以通过 docker history 命令验证。

    docker history 会显示镜像的构建历史,也就是 Dockerfile 的执行过程。

    回顾一下通过 Dockerfile 构建镜像的过程:

    从 base 镜像运行一个容器。

    执行一条指令,对容器做修改。

    执行类似 docker commit 的操作,生成一个新的镜像层。

    Docker 再基于刚刚提交的镜像运行一个新容器。

    重复 2-4 步,直到 Dockerfile 中的所有指令执行完毕。

    下面列出了 Dockerfile 中最常用的指令,完整列表和说明可参看官方文档。

    FROM
    指定 base 镜像。

    MAINTAINER
    设置镜像的作者,可以是任意字符串。

    COPY
    将文件从 build context 复制到镜像。
    COPY 支持两种形式:

    COPY src dest

    COPY ["src", "dest"]

    注意:src 只能指定 build context 中的文件或目录。

    ADD
    与 COPY 类似,从 build context 复制文件到镜像。不同的是,如果 src 是归档文件(tar, zip, tgz, xz 等),文件会被自动解压到 dest。

    ENV
    设置环境变量,环境变量可被后面的指令使用。例如:

    ...

    ENV MY_VERSION 1.3

    RUN apt-get install -y mypackage=$MY_VERSION

    ...

    EXPOSE
    指定容器中的进程会监听某个端口,Docker 可以将该端口暴露出来。我们会在容器网络部分详细讨论。

    VOLUME
    将文件或目录声明为 volume。我们会在容器存储部分详细讨论。

    WORKDIR
    为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工作目录。

    RUN
    在容器中运行指定的命令。

    CMD
    容器启动时运行指定的命令。
    Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效。CMD 可以被 docker run 之后的参数替换。

    ENTRYPOINT
    设置容器启动时运行的命令。
    Dockerfile 中可以有多个 ENTRYPOINT 指令,但只有最后一个生效。CMD 或 docker run 之后的参数会被当做参数传递给 ENTRYPOINT。

    下面我们来看一个较为全面的 Dockerfile:

     

    注:Dockerfile 支持以“#”开头的注释。

    下面是镜像的常用操作子命令:

    images    显示镜像列表

    history   显示镜像构建历史

    commit    从容器创建新镜像

    build     从 Dockerfile 构建镜像

    tag       给镜像打 tag

    pull      从 registry 下载镜像

    push      将 镜像 上传到 registry

    rmi       删除 Docker host 中的镜像

    search    搜索 Docker Hub 中的镜像


    除了 rmi 和 search,其他命令都已经用过了。

    rmi

    rmi 只能删除 host 上的镜像,不会删除 registry 的镜像。

    Search:默认在docker hub 中查找镜像:docker search httpd

    容器指令

    容器的常用操作命令:

    create      创建容器  

    run         运行容器  

    pause       暂停容器  

    unpause     取消暂停继续运行容器  

    stop        发送 SIGTERM 停止容器  

    kill        发送 SIGKILL 快速停止容器  

    start       启动容器  

    restart     重启容器  

    attach      attach 到容器启动进程的终端  

    exec        在容器中启动新进程,通常使用 "-it" 参数  

    logs        显示容器启动进程的控制台输出,用 "-f" 持续打印  

    rm          从磁盘中删除容器

    以下三者是当前主流的容器编排引擎。

    docker swarm 是 Docker 开发的容器编排引擎。

    kubernetes 是 Google 领导开发的开源容器编排引擎,同时支持 Docker 和 CoreOS 容器。

    mesos 是一个通用的集群资源调度平台,mesos 与 marathon 一起提供容器编排引擎功能。

  • 相关阅读:
    [原创]基于asp.ent MVC的无刷新文件上传组件
    ATL 开发 Com 学习笔记
    杀毒软件—美杜杉(medusa)使用观后感1
    IIS gzip压缩
    常用网页播放器代码
    [转]安装AspNetMVC1RC2出错
    Asp.net 异步请求 IHttpAsyncHandler
    发几个小的测式软件
    [转]关于document.cookie的使用
    boost Serialization
  • 原文地址:https://www.cnblogs.com/sea520/p/11375951.html
Copyright © 2011-2022 走看看