• 技术人一定要懂点Docker


    一、容器发展之路

    刚进入职场那会,依然记得当时公司比较节俭(抠门),整个研发团队(开发+测试),一共有三套环境,dev,sit,uat。我们的uat主要用于pd验收,验收通过后会把应用包发布到客户的uat环境,客户验收通过后会部署到自己的生产环境。

    每个应用能部署一台服务器就是好的,经常是多个应用部署到一台服务器上。而服务器用的是联通的物理机,如果想要扩容就要申请让公司掏腰包买机器。当时公司作为乙方,我们的环境用途主要是验证产品功能,性能测试都没法做,因为压不准,所以要是压测基本上出差到客户那里现场压。

    当时测试经常遇到的一类问题就是:

    1. dev环境开发自测通过后,jar包推到sit环境后,同样的功能拋错了。

    2. uat验收通过的包发布到用户环境上,服务启动失败了。(当时就有一段经历,出差上海一周,只为排查服务启动失败报内存不足的问题,最后发现是用户的服务器有多个应用在跑,虽然“纸面”内存不小,但是可用内存不足以运行我们的应用,解决方案是让他们物理扩容内存)。

    1. 如果需要增加机器,就要人工在新机器上配置环境,保持和同等物理机相同的环境配置,例如Python版本、JDK版本、MySQL版本等。

    所以当时自己简直就是装机小能手,但是细想都是重复劳动。

    而我在业务时间,也喜欢鼓捣一些小程序,例如跑一些自动化测试代码。而依赖的环境也都是centos系统、JDK这些,所以就在自己的windows本上安装了虚拟机VMWare后,首先要找一个centos的镜像文件,安装到虚拟机上,然后在安装JDK这些软件,所以要想使用虚拟机,必须得安装一个操作系统,不管你运行的程序是大是小

    当然,只要你的电脑配置足够硬,多开几个虚拟机也没得问题。但是当时8G的内存和i5的CPU,每台虚拟机分配2G内存,感觉电脑就跑不动了。而且,我的虚拟机可能就跑了一个很小的程序,其实大部分资源都没用到,所以又带你资源浪费,这也是虚拟机的缺点,虽然能做到资源隔离,但是资源利用率不够高,而且每次启动虚拟机就像启动Windows一样比较漫长,部署项目到虚拟机上,也要借助于xshell/xftp先上传到虚拟机上,然后再手动启动项目。

    以上算是我对物理机以及虚拟机的使用感受吧。而今天的主角Docker则是为解决上述问题存在的。

    二、基础知识

    什么是容器?

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

    容器由两部分组成:(1)应用程序本身;(2)依赖:比如应用程序需要的库或其他软件容器在Host操作系统的用户空间中运行,与操作系统的其他进程隔离。

    对比虚拟机技术,比如VMWare、KVM、Xen,目标是创建完整的虚拟机。为了运行应用,除了部署应用本身及其依赖(通常几十MB),还得安装整个操作系统。

    由于所有的容器共享同一个Host OS,这使得容器在体积上要比虚拟机小很多。

    解决什么问题?

    可以先考思考一下集装箱的作用是什么?

    任何货物,无论钢琴还是保时捷,都被放到各自的集装箱中。集装箱在整个运输过程中都是密封的,只有到达最终目的地才被打开。标准集装箱可以被高效地装卸、重叠和长途运输。现代化的起重机可以自动在卡车、轮船和火车之间移动集装箱。

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

    • 对于开发人员:Build Once、Run Anywhere。

    容器意味着环境隔离和可重复性。开发人员只需为应用创建一次运行环境,然后打包成容器便可在其他机器上运行。另外,容器环境与所在的Host环境是隔离的,就像虚拟机一样,但更快更简单。

    • 对于运维人员:Configure Once、Run Anything。

    只需要配置好标准的runtime环境,服务器就可以运行任何容器。这使得运维人员的工作变得更高效、一致和可重复。容器消除了开发、测试、生产环境的不一致性。

    • 对于测试人员

    可以将自己电脑上搭建的各种环境整合到一个镜像中,以后就算你换了公司、换了电脑,只要镜像在,就可以随时拉取运行,不用在自己的新电脑上重新搭建各种环境,一次搭环境建,重复使用。

    下面就以Docker为例,介绍下如何操作容器。

    三、环境搭建

    Docker安装

    1. 就以Mac Os系统为例,

    对于10.10.3以下的用户 推荐使用Docker Toolbox

    Mac安装文件:http://mirrors.aliyun.com/docker-toolbox/mac/docker-toolbox/

    对于10.10.3以上的用户 推荐使用Docker for Mac

    Mac安装文件:http://mirrors.aliyun.com/docker-toolbox/mac/docker-for-mac/

    安装后,点击启动即可。

    1. 通过设置,可以动态给Docker分配硬件资源。

    1. 通过Images可以查看本地的镜像以及运行状态、资源使用情况。

    配置国内源

    以阿里云源为例:

    1. 登陆阿里云账户后,打开控制台

    https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

    1. 配置镜像加速器

    针对安装了Docker Toolbox的用户,可以参考以下配置步骤:

    创建一台安装有Docker环境的Linux虚拟机,指定机器名称为default,同时配置Docker加速器地址。

    docker-machine create --engine-registry-mirror=https://xxxxx.mirror.aliyuncs.com -d virtualbox default

    查看机器的环境配置,并配置到本地,并通过Docker客户端访问Docker服务。

    docker-machine env default
    eval "$(docker-machine env default)"
    docker info

    针对Docker for Mac用户,可以参考以下配置步骤:

    在任务栏点击 Docker Desktop 应用图标 -> Perferences,在左侧导航菜单选择 Docker Engine,在右侧输入栏编辑 json 文件。将https://xxxx.mirror.aliyuncs.com加到"registry-mirrors"的数组里,点击 Apply & Restart按钮,等待Docker重启并应用配置的镜像加速器。

    四、入门实践

    0. 镜像拉取

    1. docker 搜索

    docker search tomcat

    也可以官网搜索如下:https://hub.docker.com,一般选择STARS比较多的镜像。

    1. 按版本TAG拉镜像到本地

     
    

    docker pull nginx:latest

    1. hello world

    docker pull hello-world
    docker run hello-world

    2. 运行Tomcat

    官方源:https://hub.docker.com/_/tomcat

    启动,做接口映射

     
    

    // -p 参数用于端口映射,前面是宿主机端口,后面是容器端口。
    docker run -p 8888:8080 tomcat
    // -d 参数表示后台启动
    docker run -p 8000:8080 -d tomcat

    http://localhost:8888/

    404?那是tomcat webapps内容为空,所以找不到了index.jsp文件了。我怎么进入我容器里的tomcat目录?比如看个log,找到webapps给他添加文件等操作。

    可以进入容器看一下文件是否是真是空的。

    docker exec -it ac1c3d62b75d /bin/bash

    可以将webapps.dist文件夹改成webapps,小老虎又回来了。。。

    3. 容器状态

    -- up 表示运行

    下面一张图可以搞懂容器状态的转换。

    五、容器内部结构

    大家都知道,tomcat的运行是需要依赖Java环境的,所以可以知道镜像内肯定安装了Jdk,咱们可以查询一下:

     
    

    java --version

     
    

    cat /proc/version

    安装的alpine是个迷你linux系统。

    六、常用指令&运作原理

    说了这么多,想要熟练使用容器,还必须掌握一些基本指令。

    命令

    解释

    docker pull 镜像名<:tags>

    从远程仓库拉取镜像到本地仓库

    docker images

    查看本地仓库所有镜像

    docker run 镜像名<:tags>

    基于镜像创建容器并启动,可以添加-d port1:port2参数,port1:宿主机端口,port2:容器端口, -d参数代表后台运行

    docker ps

    查看当前所有启动的容器

    docker ps -a

    查看本地所有容器,包含未启动的,删除容器的时候可用来查询容器id

    docker start/stop/restart 容器id

    启动/停止/重启容器

    docker rm <-f> 容器id

    删除<-f:强制删除>容器,运行中的容器不能删除,-f可以强制

    docker rmi <-f> 镜像名称 <:tags>

    删除<强制删除>镜像,镜像有容器在启动,不能被删除,-f可以强制

    docker exec [-it] 容器id 命令

    进入容器主目录,exec:在对应容器中执行命令,-it:采用交互方式执行命令

    通过这张图可以了解到,我们在终端terminal上输入的指令都通过Docker deamon转发到具体的容器上。

    七、镜像制作

    1. 第一种为commit方式,利用已有的镜像,运行后安装定制自己需要的环境,然后生成镜像;

    2. 另一种就是build方式,通过编写Dockerfile命令脚本进行生成镜像。

    以commit方式为例,这种方式可以让用户在现有的镜像上改造,然后生成新的镜像。具体操作就以改造官网的tomcat为例:就是进入容器后,将webapps.dist文件改成webapps。

    1.在已有镜像修改后,进行提交commit 即可

    docker ps -aq

    最新的记录就是最近一次容器内容的改动了。

    2.提交commit改动的镜像内容(就像commit代码一样)

    docker commit c6a03b86d086 tomcat-yg

    3. 提交后查询docker images, 可以看到新提交的镜像 tomcat-yg。

    第24届冬季奥林匹克运动会,即2022年北京冬季奥运会,计划于2022年2月4日星期五开幕,2月20日星期日闭幕 。

    往期推荐

    接口间参数传递的一种解决方案

    经验分享|测试工程师转型测试开发历程

    浅谈Mock平台的设计思路

    接口自动化测试框架设计思路

    接口自动化测试框架实践1:接口测试概述

    我在阿里做测开

  • 相关阅读:
    bzoj1934 Vote 善意的投票 最小割(最大匹配)
    poj3417 Network 树上差分+LCA
    bzoj1076 奖励关 期望dp
    bzoj1087 互不侵犯King 状压dp+bitset
    bzoj1041 圆上的整点 数学
    bzoj 1085骑士精神 迭代深搜
    CodeForces 1043D Mysterious Crime 区间合并
    2018.12.14 浪在ACM 集训队第九次测试赛
    2018.12.9 中国石油大学第四次新生训练赛题解
    2018.12.8 中国石油大学第三次新生训练赛题解
  • 原文地址:https://www.cnblogs.com/iloverain/p/16515101.html
Copyright © 2020-2023  润新知