前端之路:紧跟潮流,docker简单应用

Docker

what is docker ?

  • 根据官网描述,docker 是一个容器平台,是标准化的软件单元,使用了虚拟化技术(cgroup:提供容器隔离;UnionFS:保存镜像并使容器变得短暂),基于Google推出的go语言实现的开源项目,代码在 GitHub 上进行维护。

why use docker ?

  • 快速交付和部署html

    • 轻快:一次建立或配置,可在任意地方正常运行,秒级启动,节约开发、测试、部署时间。
  • 高效虚拟化前端

    • 基于内核的虚拟化,不须要额外hypervisor支持,CPU/内存的低消耗,更高效。
  • 可移植、可扩展node

    • 物理机、虚拟机、公有云、私有云、我的电脑、服务器等平台都可以运行
  • 对比传统虚拟机linux

    特性 容器 虚拟机
    启动 秒级 分钟级
    硬盘使用 通常MB 通常GB
    性能 接近原生 弱于原生
    系统支持量 单机上千个容器 通常几十个

    compare

  • 能够总结出,docker能够实现:nginx

    • 隔离应用依赖
    • 建立应用镜像并进行复制
    • 建立易分发的即启即用的应用
    • 容许实例简单、快速扩展
    • 测试应用并随后销毁

可见docker的 野心 是建立 ===软件程序可移植的轻量容器===,让其能够在任何安装了docker的机器上运行,而不用关心底层操做系统。git

how to use docker ?

先了解一下几个基本概念:github

镜像:是一个只读的模版,用来建立docker容器,容器在启动的时候建立一层可写层做为最上层docker


容器:从镜像建立的运行实例,能够被启动、开始、中止、删除。容器间是相互隔离的,看上去是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序shell


仓库:相似 git,集中存放镜像文件的场所,分为公开仓库(Public)和私有仓库(Private),最大的公开仓库是 Docker Hub数据库


注册服务器:相似GitHub 这样的托管服务,存放着多个仓库


宿主机:docker所在的服务器


数据卷:可供一个或多个容器使用的特殊目录,相似于 Linux 下对目录或文件进行 mount,它绕过 UFS,能够提供不少有用的特性:

  • 在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 卷会一直存在,直到没有容器使用

网络模式:用来实现容器的网络通讯,大概包括五种:

  • bridge模式,--net=bridge(默认)
  • host模式,--net=host
  • none模式,--net=none
  • 其余容器模式(即container模式),--net=container:NAME_or_ID
  • 用户自定义:docker 1.9版本之后新增的特性

了解更多


Dockerfile:易于自动化的命令,包含建立镜像所需的所有指令,基于dockerfile中的指令,咱们可使用 $ docker build 命令来建立镜像,经过减小镜像和容器的建立过程来简化部署。语法命令:

  • INSTRUCTION argument 指令不区分大小写,但命名约定为所有大写
  • FROM
    • 格式为 FROM <image>FROM <image>:<tag>
    • 第一条指令必须为 FROM 指令。而且,若是在同一个Dockerfile中建立多个镜像时,可使用多个 FROM 指令(每一个镜像一次)
  • MAINTAINER
    • 格式为 MAINTAINER <name>,指定维护者信息
  • RUN
    • 格式为 RUN <command>RUN ["executable", "param1", "param2"]
    • 前者将在 shell 终端中运行命令,即 /bin/sh -c;后者则使用 exec 执行。指定使用其它终端能够经过第二种方式实现,例如 RUN ["/bin/bash", "-c", "echo hello"]
    • 每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可使用 \ 来换行
  • CMD
    • CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式
    • CMD command param1 param2/bin/sh 中执行,提供给须要交互的应用
    • CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数
    • 指定启动容器时执行的命令,每一个 Dockerfile 只能有一条 CMD 命令。若是指定了多条命令,只有最后一条会被执行
    • 若是用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令
  • EXPOSE
    • 格式为 EXPOSE <port> [<port>...]
    • 告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时须要经过 -P,Docker 主机会自动分配一个端口转发到指定的端口
  • ENV
    • 格式为 ENV <key> <value>。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。
  • ADD
    • 格式为 ADD <src> <dest>
    • 该命令将复制指定的 <src> 到容器中的 <dest>。 其中 <src> 能够是Dockerfile所在目录的一个相对路径;也能够是一个 URL;还能够是一个 tar 文件(自动解压为目录)
  • COPY
    • 格式为 COPY <src> <dest>
    • 复制本地主机的 <src>(为 Dockerfile 所在目录的相对路径)到容器中的 <dest>。当使用本地目录为源目录时,推荐使用 COPY,能用 COPY 的状况下不用 ADD
  • ENTRYPOINT
    • ENTRYPOINT ["executable", "param1", "param2"]
    • ENTRYPOINT command param1 param2(shell中执行)
    • 配置容器启动后执行的命令,而且不可被 docker run 提供的参数覆盖
    • 每一个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效
  • VOLUME
    • 格式为 VOLUME ["/data"]
    • 建立一个能够从本地主机或其余容器挂载的挂载点,通常用来存放数据库和须要保持的数据等
  • USER
    • 格式为 USER daemon
    • 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户
    • 当服务不须要管理员权限时,能够经过该命令指定运行用户。而且能够在以前建立所须要的用户,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要临时获取管理员权限可使用 gosu,而不推荐 sudo
  • WORKDIR
    • 格式为 WORKDIR /path/to/workdir

    • 为后续的 RUN、CMD、ENTRYPOINT 指令配置工做目录

    • 可使用多个 WORKDIR 指令,后续命令若是参数是相对路径,则会基于以前命令指定的路径。例如:

    • WORKDIR /a

    • WORKDIR b

    • WORKDIR c

      则最终路径为 /a/b/c

  • ONBUILD
    • 格式为 ONBUILD [INSTRUCTION]

    • 配置当所建立的镜像做为其它新建立镜像的基础镜像时,所执行的操做指令

    • 例如,Dockerfile 使用以下的内容建立了镜像 image-A

      [...]
        ONBUILD ADD . /app/src
        ONBUILD RUN /usr/local/bin/node-build --dir /app/src
        [...]
      复制代码

      若是基于 image-A 建立新的镜像时,新的Dockerfile中使用 FROM image-A指定基础镜像时,会自动执行 ONBUILD 指令内容,等价于在后面添加了两条指令:

      FROM image-A
      
        #Automatically run the following
        ADD . /app/src
        RUN /usr/local/bin/node-build --dir /app/src
      复制代码

      使用 ONBUILD 指令的镜像,推荐在标签中注明,例如 ruby:1.9-onbuild

编写完成 Dockerfile 以后,能够经过 $ docker build 命令来建立镜像

  • 基本的格式为 $ docker build [选项] 路径,该命令将读取指定路径下(包括子目录)的 Dockerfile,并将该路径下全部内容发送给 Docker 服务端,由服务端来建立镜像。所以通常建议放置 Dockerfile 的目录为空目录。也能够经过 .dockerignore 文件(每一行添加一条匹配模式)来让 Docker 忽略路径下的目录和文件
  • 例如:$ docker build -t ${dockerImageName} --force-rm -f ./Dockerfile .

=========================================================

以上是一些基本概念,如今ubuntu下开始安装docker并启动一个nginx容器(其实大多数场景下nginx不必跑在容器里,这里只是举个例子)

=========================================================

$ cat /etc/issue
Ubuntu 16.04.6 LTS \n \l
复制代码
  1. 经过shell命令安装:

    1. $ curl -sSL https://get.docker.com/ | sh
    2. 更多平台及安装方式
  2. 检验安装,显示版本信息,说明已成功安装:

    $ docker -v
    Docker version 18.09.5, build e8ff056
    复制代码

    ps:$ docker info可查看更多信息

  3. 下面开始建立一个容器:

     $ docker run❶ \
     -d❷ \
     --name=demo❸ \
     -u root❹ \
     -p 8002:80❺ \
     -v /var/demo:/var/demo❻ \
     nginx:latest❼
    复制代码

    该命令表示:基于nginx:latest这个镜像,建立一个名称为demo的容器,并把容器内部的80端口与宿主机上的8002端口作映射,使得经过宿主机8002端口的流量转发到容器内部的80端口上

    ❶:run 新建并启动容器,更多选项,其标准过程:

    • 检查本地是否存在指定的镜像,不存在就从公有仓库下载(docker pull xxx)
    • 利用镜像建立并启动一个容器
    • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
    • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
    • 从地址池配置一个 ip 地址给容器
    • 执行用户指定的应用程序
    • 执行完毕后容器被终止

    ❷:-d Daemonized模式,以守护态形式在后台运行容器


    ❸:--name=demo 为容器起一个名字


    ❹:-u 指定容器的用户


    ❺:-p 端口映射,规则是 -p 宿主机端口:容器端口,可屡次使用映射多个端口


    ❻:-v 挂载数据卷,规则是 -v 宿主机目录:容器目录,可屡次使用挂载多个数据卷


    ❼:镜像名,该容器所用的镜像名,可经过 $ docker images 查看本地镜像

  4. 查看正在运行的容器:

    $ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
    c24cfee8226a        nginx:latest        "nginx -g 'daemon of…"   6 minutes ago       Up 6 minutes        0.0.0.0:8002->80/tcp          demo
    复制代码

    ps:$ docker ps -a查看全部容器(包括正在运行的、已中止的)

    如今访问宿主机的8002端口(安全组开通),便可看到nginx的欢迎页面:

    nginx:welcom

  5. 进入容器:

    执行 $ docker exec -it demo bash ,demo也能够换成容器的id即:$ docker exec -it c24cfee8226a bash

    shell

    在容器内可执行 $ netstat -lntp 查看端口使用状况:

    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
     tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1/nginx: master pro
    复制代码

    若发现netstat not found,先执行 $ apt update && apt install net-tools

    执行 $ exit 退出容器

    ps经常使用命令:

    • $ docker inspect demo 能够查看该容器更多信息
    • $ docker stop 容器名/id 终止容器
    • $ docker rm 容器名/id 删除未运行的容器
    • $ docker rmi 镜像名/id 删除未占用(无容器正在运行)的镜像
    • $ docker rmi $(docker images -f "dangling=true" -q) 批量删除为 none(无容器正在运行)的镜像

【参考】:

  1. www.kancloud.cn/kancloud/do…
  2. leilux.github.io/lou/docker_…
  3. docs.docker.com
  4. blog.csdn.net/ithaibianti…

===🧐🧐 文中不足,欢迎指正 🤪🤪===

最后:下一次讲一下,基于docker,搭建ci(jenkins)构建部署前端项目

相关文章
相关标签/搜索