美文网首页
1、docker入门

1、docker入门

作者: KissGoodby | 来源:发表于2018-10-16 15:37 被阅读0次

    什么是docker

    如今Docker的使用已经非常普遍,特别在一线互联网公司。使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力。在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如今在微服务架构越来越流行的情况下,微服务+Docker的完美组合,更加方便微服务架构运维部署落地

    Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。

    Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

    docker和虚拟机的区别

    传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

    为什么使用docker
    1. 更高效的利用系统资源
      由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

    2. 更快速的启动时间
      传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

    3. 一致的运行环境
      开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。

    4. 持续交付和部署
      对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
      使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
      而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

    5. 更轻松的迁移
      由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

    6. 更轻松的维护和扩展
      Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

    docker架构

    Docker是CS架构,主要有两个概念:

    • Docker daemon: 运行在宿主机上,Docker守护进程,用户通过Docker client(Docker命令)与Docker daemon交互

    • Docker client: Docker 命令行工具,是用户使用Docker的主要方式,Docker client与Docker daemon通信并将结果返回给用户,Docker client也可以通过socket或者RESTful api访问远程的Docker daemon

      image.png

    docker基本概念

    1. docker image
      Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
      镜像用来创建container,一个镜像可以运行多个container;镜像可以通过Dockerfile创建,也可以从Docker hub/registry上下载。
    2. docker container
      镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
      容器是一个隔离环境,多个容器之间不会相互影响,保证容器中的程序运行在一个相对安全的环境中。
    3. docker hub/registry
      共享和管理Docker镜像,用户可以上传或者下载上面的镜像,官方地址为https://registry.hub.docker.com/,也可以搭建自己私有的Docker registry。

    docker 安装

    可以参考官网教程或者 docker book

    Dockerfile文件

    首先通过一张图来了解 Docker 镜像、容器和 Dockerfile 三者之间的关系。


    image.png

    通过上图可以看出使用 Dockerfile 定义镜像,运行镜像启动容器。

    Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可,省去了敲命令的麻烦。

    Dockerfile文件格式
    ##  Dockerfile文件格式
    
    # This dockerfile uses the ubuntu image
    # VERSION 2 - EDITION 1
    # Author: docker_user
    # Command format: Instruction [arguments / command] ..
     
    # 1、第一行必须指定 基础镜像信息
    FROM ubuntu
     
    # 2、维护者信息
    MAINTAINER docker_user docker_user@email.com
     
    # 3、镜像操作指令
    RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
    RUN apt-get update && apt-get install -y nginx
    RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
     
    # 4、容器启动执行指令
    CMD /usr/sbin/nginx
    

    Dockerfile 分为四部分:基础镜像信息维护者信息镜像操作指令容器启动执行指令。一开始必须要指明所基于的镜像名称,接下来一般会说明维护者信息;后面则是镜像操作指令,例如 RUN 指令。每执行一条RUN 指令,镜像添加新的一层,并提交;最后是 CMD 指令,来指明运行容器时的操作命令,’#’ 为 Dockerfile 中的注释。

    Dockerfile指令详解
    1. FROM:指定基础镜像,必须为第一个命令
    格式:
      FROM <image>
      FROM <image>:<tag>
      FROM <image>@<digest>
    示例:
      FROM mysql:5.6
    注:
      tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
    
    1. MAINTAINER: 维护者信息
    格式:
        MAINTAINER <name>
    示例:
        MAINTAINER hui.wang
    
    1. RUN:构建镜像时执行的命令
    RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
    
    shell执行
    格式:
        RUN <command>
    
    exec执行
    格式:
        RUN ["executable", "param1", "param2"]
    示例:
        RUN ["executable", "param1", "param2"]
        RUN apk update
        RUN ["/etc/execfile", "arg1", "arg1"]
    注:
      RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
    
    1. ADD:将本地文件添加到容器中,tar类型文件会自动解压,可以访问网络资源,类似wget
    格式:
        ADD <src>... <dest>
        ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
    示例:
        ADD hom* /mydir/          # 添加所有以"hom"开头的文件
        ADD test relativeDir/     # 添加 "test" 到 `WORKDIR`/relativeDir/
    
    1. COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
    2. CMD:构建容器后调用,也就是在容器启动时才进行调用。
    格式:
        CMD ["executable","param1","param2"] (执行可执行文件,优先)
        CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
        CMD command param1 param2 (执行shell内部命令)
    示例:
        CMD echo "This is a test." | wc -
        CMD ["/usr/bin/wc","--help"]
    注:
       CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
    
    1. ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
    格式:
        ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
        ENTRYPOINT command param1 param2 (shell内部命令)
    示例:
        FROM ubuntu
        ENTRYPOINT ["top", "-b"]
        CMD ["-c"]
    注:
       ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
    
    1. LABEL:用于为镜像添加元数据
    格式:
        LABEL <key>=<value> <key>=<value> <key>=<value> ...
    示例:
      LABEL version="1.0" description="这是一个Web服务器" by="hui.wang"
    注:
      使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
    
    1. ENV:设置环境变量
    格式:
        ENV <key> <value>
        ENV <key>=<value> ...
    示例:
        ENV myName John Doe
        ENV myDog Rex The Dog
    
    1. EXPOSE:指定于外界交互的端口
    格式:
        EXPOSE <port> [<port>...]
    示例:
        EXPOSE 80 443
        EXPOSE 8080
    注:
      EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
    
    1. VOLUME:用于指定持久化目录
    格式:
        VOLUME ["/path/to/dir"]
    示例:
        VOLUME ["/data"]
    注:
      一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
      1.卷可以容器间共享和重用
      2.容器并不一定要和其它容器共享卷
      3.修改卷后会立即生效
      4.对卷的修改不会对镜像产生影响
      5.卷会一直存在,直到没有任何容器在使用它
    
    1. WORKDIR:工作目录,类似于cd命令
    格式:
        WORKDIR /path/to/workdir
    示例:
        WORKDIR /a  (这时工作目录为/a)
        WORKDIR b  (这时工作目录为/a/b)
        WORKDIR c  (这时工作目录为/a/b/c)
    注:
      通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
    
    1. USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
    格式:
      USER user
      USER user:group
      USER uid
      USER uid:gid
      USER user:gid
      USER uid:group
     示例:
          USER www
     注:
      使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
    
    1. ARG:用于指定传递给构建运行时的变量
    格式:
        ARG <name>[=<default value>]
    示例:
        ARG site
        ARG build_user=www
    
    1. ONBUILD:用于设置镜像触发器
    格式:
      ONBUILD [INSTRUCTION]
    示例:
      ONBUILD ADD . /app/src
      ONBUILD RUN /usr/local/bin/python-build --dir /app/src
    注:
      当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
    

    最后图解


    image.png

    docker常用命令

    1. docker build
    docker build [OPTIONS] PATH | URL | -
    
    --build-arg=[] :设置镜像创建时的变量;
    
    --cpu-shares :设置 cpu 使用权重;
    
    --cpu-period :限制 CPU CFS周期;
    
    --cpu-quota :限制 CPU CFS配额;
    
    --cpuset-cpus :指定使用的CPU id;
    
    --cpuset-mems :指定使用的内存 id;
    
    --disable-content-trust :忽略校验,默认开启;
    
    -f :指定要使用的Dockerfile路径;
    
    --force-rm :设置镜像过程中删除中间容器;
    
    --isolation :使用容器隔离技术;
    
    --label=[] :设置镜像使用的元数据;
    
    -m :设置内存最大值;
    
    --memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
    
    --no-cache :创建镜像的过程不使用缓存;
    
    --pull :尝试去更新镜像的新版本;
    
    --quiet, -q :安静模式,成功后只输出镜像 ID;
    
    --rm :设置镜像成功后删除中间容器;
    
    --shm-size :设置/dev/shm的大小,默认值是64M;
    
    --ulimit :Ulimit配置。
    
    --tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
    
    --network: 默认 default。在构建期间设置RUN指令的网络模式
    
    1. docker run
    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    
    -d, --detach=false, 指定容器运行于前台还是后台,默认为false
    -i, --interactive=false, 打开STDIN,用于控制台交互
    -t, --tty=false, 分配tty设备,该可以支持终端登录,默认为false
    -u, --user="", 指定容器的用户
    -a, --attach=[], 登录容器(必须是以docker run -d启动的容器)
    -w, --workdir="", 指定容器的工作目录
    -c, --cpu-shares=0, 设置容器CPU权重,在CPU共享场景使用
    -e, --env=[], 指定环境变量,容器中可以使用该环境变量
    -m, --memory="", 指定容器的内存上限
    -P, --publish-all=false, 指定容器暴露的端口
    -p, --publish=[], 指定容器暴露的端口
    -h, --hostname="", 指定容器的主机名
    -v, --volume=[], 给容器挂载存储卷,挂载到容器的某个目录
    --volumes-from=[], 给容器挂载其他容器上的卷,挂载到容器的某个目录
    --cap-add=[], 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
    --cap-drop=[], 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
    --cidfile="", 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
    --cpuset="", 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
    --device=[], 添加主机设备给容器,相当于设备直通
    --dns=[], 指定容器的dns服务器
    --dns-search=[], 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
    --entrypoint="", 覆盖image的入口点
    --env-file=[], 指定环境变量文件,文件格式为每行一个环境变量
    --expose=[], 指定容器暴露的端口,即修改镜像的暴露端口
    --link=[], 指定容器间的关联,使用其他容器的IP、env等信息
    --lxc-conf=[], 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
    --name="", 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
    --net="bridge", 容器网络设置:
      bridge 使用docker daemon指定的网桥
      host //容器使用主机的网络
      container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
      none 容器使用自己的网络(类似--net=bridge),但是不进行配置
    --privileged=false, 指定容器是否为特权容器,特权容器拥有所有的capabilities
    --restart="no", 指定容器停止后的重启策略:
      no:容器退出时不重启
      on-failure:容器故障退出(返回值非零)时重启
      always:容器退出时总是重启
    --rm=false, 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
    --sig-proxy=true, 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
    

    相关文章

      网友评论

          本文标题:1、docker入门

          本文链接:https://www.haomeiwen.com/subject/bwchzftx.html