• dokcer入门


    背景:

    由于最近在做基于Headless chrome + Robotframework + Docker +Jenkins架构的web自动化测试的预研工作,其中涉及到web自动化持续集成,需要搭建自动化测试环境;在经历了很多痛苦的尝试后,发现以前服务器上的Docker镜像不再适用,无法满足目前的web自动化测试环境,所以着手学习下Docker并部署适用于项目的web自动化测试的镜像。

    Docker简介

    一、什么是Docker

    定义Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。

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

    机制:容器完全是沙箱机制,相互之间不会有任何接口(类似于iPhoneapp),更重要的是容器开销极低。

    二、Docker的应用场景

    1、web应用的自动化打包和发布

    2、自动化测试和持续集成、发布

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

    4、从头编译或者扩展现有的OpenShiftCloud Foundry平台来搭建自己的PAAS环境

    Docker架构

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

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

    ·Docker中的镜像和容器类似于面向对象编程中的类和对象

     

     

     

    Docker 镜像(Images):Docker 镜像是用于创建 Docker 容器的模板。

    Docker 容器(Container):容器是独立运行的一个或一组应用。

    Docker 客户端(Client):Docker客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) Docker 的守护进程通信。

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

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

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

    Docker Machine:Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBoxDigital OceanMicrosoft Azure

    Docker安装

    一、Docker支持以下的Ubuntu版本:

    ·Ubuntu Precise 12.04 (LTS)

    ·Ubuntu Trusty 14.04 (LTS)

    ·Ubuntu Wily 15.10

    ·Xenial 16.04 (LTS)

    ·其他更新的版本

    注:如需安装Docker CE需要16.04以上(不包含16.14)的版本

    使用以下命令可以查看你的Ubuntu系统的版本:

    命令:cat etc/issue

    Docker1.13以后有两个版本,分别是CEEECE是开源的社区版本、EE是收费企业版本

    查看Docker版本:

    命令:docker --version

    二、前置条件

    Docker要求Ubuntu系统的内核版本高于3.10,首先得验证你的Ubuntu系统内核版本是否支持Docker

    命令:uname -r

    如上在终端上敲入相应命令查询到我的Ubuntu系统的内核版本是4.13版本

    三、使用脚本安装Docker

    1、获取最新版本的Docker安装包

    命令:wget -qO- https://get.docker.com/ | sh

    Sh命令的作用是执行.sh脚本或是切换到sh这个bash里,Linux默认的shellbash

    这里的sh就是后面这个用处

    输入当前用户密码后,系统会自动下载脚本并安装Docker及依赖包

    安装完成后有个提示:

     If you would like to use Docker as a non-root user, you should now consider

        adding your user to the "docker" group with something like:

     

        sudo usermod -aG docker runoob

       Remember that you will have to log out and back in for this to take effect!  

    当要以非root用户可以直接运行docker时,需要执行 sudo usermod -aG docker name 命令,然后重新登陆,否则会报错

    2、启动Docker后台服务

    命令:sudo service docker start

    部署属于自己的镜像

    一、操作步骤

    前言:镜像的制作主要分为三个部分

    1、获取基础镜像(docker pull

    2、基于基础镜像制作所需的镜像

    3、将镜像推送到制品库进行保存(docker push

    二、制作镜像的方法

    制作镜像主要有两种方法,第一种使用commit命令制作,第二种使用dockerfile制作,下面来简单的谈一谈这两种方法的优缺点。

    Commit:使用此方法方便开发者调试,但不方便过程的记录,可复制性远差于dockerfile

    DockerfileDockerfile是描述镜像制作过程中的文件,记录了制作镜像的过程,方便以后更改或者镜像丢失后重新构建

    一、Docker commit制作镜像
    1、基于基础镜像创建容器

    ·获取基础镜像:可以从docker hub或第三方网站拉取镜像到本地

    命令:docker pull [options] <dir_name>.<realm_name>:<tag>

    Options说明:

    -a:拉取所有tagged镜像

    --disable-content-trust:忽略镜像的校验,默认开启

    实例:docker pull docker hub xxxx:v1

    从网上拉取基础镜像后使用docker images命令,查看本地服务器是否有已拉取的

    基础镜像:

    ·基于基础镜像创建容器

    基于上面已经pull下来的镜像制作一个容器

    命令:docker run [options] image [command]

    实例:docker run --privileged --name=qinjiaxi_web_test --net=host -it -v ~:/share docker hub xxxx:v1

    2、在容器中安装需要的应用

    关于这一块每个项目或者说每个人的需求都不一样,因此安装的应用程序和环境必然不会想相同,这里无法统一的进行硬性规定,只进行简单的说明。

    这里主要用到apt这个命令

    如:安装python软件:

    命令:apt install python

    当然需要安装的东西比较多,而且有些软件还有自己的依赖包,在安装主软件的同时优先进行依赖包的安装否则无法安装主软件,这里有个强制安装依赖包的命令供大家参考:apt -f install。

    3、commit容器创建镜像到本地

    命令:docker commit [opions] containerid <repository>:<tag>

    Options说明:

    -a:提交的镜像作者

    -m:提交时的说明文字

    -p:在commit时,将容器暂停

    实例:docker commit -a “qinjiaxi” -m “web_ci_test” qinjiaxi_web_ci:web_ci_20190822

    通过以上命令创建完成后,使用docker images命令查看本地镜像,就可以看到上面的镜像被commit到本地了。

    注:保存在本地的镜像repository可以随便写,但是如果想推到网络上去就需要按照规定的格式来编辑,这里提供两种方法:

    1、修改已有本地镜像的repository和tag名称(镜像重命名):

    命令:docker tag <image id> <new repository>:<new tag>

    实例:docker tag 2d440113d507 zxxxxxx-xxxx-docker.xxxx.com.cn/webci/qinjiaxi_web_ci:web_ci_20190822

     

    2、commit的时候就按照规定格式来创建镜像

    在上面第三部中就按照以下格式来commit:

    实例:docker commit -a “qinjiaxi” -m “web_ci_test”  zxxxxxx-xxxx-docker.xxxx.com.cn/webci/qinjiaxi_web_ci:web_ci_20190822

     

     

    4、将本地镜像push到制品库

    命令:docker pull [options] <dir_name>.<realm_name>:<tag>

    Options说明:

    --disable-content-trust:忽略镜像的校验,默认开启

    实例:docker push zxxxxxx-xxxx-docker.xxxx.com.cn/webci/qinjiaxi_web_ci:web_ci_20190822

    至此:commit方式制作镜像已经完成。

    下面附上docker commit中常用的dokcer命令:

    command

    describe

    docker images

    查看本地所有镜像(可加上grep分支来筛选,如:docker images|grep qinjiaxi)

    docker ps

    查看正在运行的容器(加上-a查看全部的容器,也可加上grep分支来筛选)

    docker start

    启动一个容器(后面必选项为container_name or container_id)

    docker attach

    运行一个容器(后面必选项为container_name or container_id)

    docker pull

    从制品库中下载基础镜像

    docker push

    将本地镜像推送到制品库中

    docker rm

    移除本地已有容器(后面的必选项为container_name or container_id)

    docker rmi

    移除本地已有镜像(后面的必选项为image_name or image_id)

    docker tag

    对镜像进行重命名

    二、dockerfile方式制作镜像(强烈推荐)
    dockerfile常用命令:

    COMMAND

    FROMAT

    DESCRIPTION

    FROM

    FROM <REPOSITORY>:<TAG>

    指定基础镜像,必须为第一个命令

    MAINTAINER

    MAINTAINER <NAME>

    维护者信息

    RUN

    RUN <COMMAND>

    镜像容器中运行命令

    ADD

    ADD <SCR> <DEST>

    将本地文件添加到容器中,tar格式自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget

    COPY

    COPY <SCR> <DEST>

    复制本地文到容器中,压缩格式文件不会进行解压

    CMD

    RUN <COMMAND>

    指定在容器启动时所有执行的命令

    ENV

    ENV <KEY> <VALUE>

    设置环境变量

    WORKDIR

    WORKDIR <WORK_DIR>

    工作目录,类似于cd命令

    Dockerfile实例:

    1本机创建一个新目录,取名dokcer_build

    命令:mkdir docker_build

    2、将dockerfile文件复制到dokcer_build目录

    命令:cp  dockerfile.txt /docker_build

    3、进入docker_build目录执行创建命令

    命令:cd docker_build

      docker build -f dockerfile.txt -t web_ci_test:v1 -q .

    para

    description

    f

    指向任何路径下的dockerfile文件

    t

    指定生成镜像的名称,包含仓库名称和标签名称

    q

    quiet模式减少无用的打印

    .

    制作镜像时资源文件的路径,即当前目录,需要将制作镜像中用到的资源放入当前目录下

    执行docker build命令后,如果未报错,即镜像制作成功。
    过程详解:
    执行docker build命令后,首先上传dockerfile文件到docker进程,因为所有的操作都要依据dockerfile来进行。然后dockerfile中指令被一条条的执行,每一步都创建了一个新的容器,在容器中执行命令并提交修改(跟之前的commit制作镜像是一样的过程)。当dockerfile文件中的所有指令执行完毕后,返回最终的镜像ID,所有中间步骤产生的容器都被删除和清理。
    附上dockerfile中的相关指令的图表解释:

     

    总结

    学到这里大家应该也忘记的差不多了,是时候该放弃docker学习(开个玩笑),最后对以上的知识进行一个总结:本文从docker的基本概念、架构、安装调试、以及镜像制作四个维度进行了讲解和说明,期间有涉及到部分实例,实践和理论的相结合更容易让大家接受和运用,相信对后期开发中应用到docker场景的同学有所帮助。

  • 相关阅读:
    我的2012
    java抽象工厂模式
    java工厂方法模式
    javascript闭包
    字符串转换成枚举类型
    按位与 按位或 按位异域
    一个查找替换文件的简单工具
    c#写的.net 画流程图的控件
    .net 面试题之 Sql 分页 存储过程
    .net 面试整理2013年3月21
  • 原文地址:https://www.cnblogs.com/qinlangsky/p/11422560.html
Copyright © 2020-2023  润新知