> 文档中心 > 技术人一定要懂点Docker

技术人一定要懂点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 镜像名

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

docker images

查看本地仓库所有镜像

docker run 镜像名

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

docker ps

查看当前所有启动的容器

docker ps -a

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

docker start/stop/restart 容器id

启动/停止/重启容器

docker rm 容器id

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

docker rmi 镜像名称

删除镜像,镜像有容器在启动,不能被删除,-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:接口测试概述

我在阿里做测开

说说控