技术人一定要懂点Docker

网友投稿 246 2022-10-22

技术人一定要懂点Docker

一、容器发展之路

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

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

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

​dev环境开发自测通过后,jar包推到sit环境后,同样的功能拋错了。​​uat验收通过的包发布到用户环境上,服务启动失败了。(当时就有一段经历,出差上海一周,只为排查服务启动失败报内存不足的问题,最后发现是用户的服务器有多个应用在跑,虽然“纸面”内存不小,但是可用内存不足以运行我们的应用,解决方案是让他们物理扩容内存)。​​如果需要增加机器,就要人工在新机器上配置环境,保持和同等物理机相同的环境配置,例如Python版本、JDK版本、MySQL版本等。​

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

当然,只要你的电脑配置足够硬,多开几个虚拟机也没得问题。但是当时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安装​

就以Mac Os系统为例,

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

Mac安装文件:推荐使用Docker for Mac

Mac安装文件:Toolbox的用户,可以参考以下配置步骤:

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

docker-machine create --engine-registry-mirror=-d virtualbox default

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

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

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

四、入门实践

​0. 镜像拉取​

docker 搜索

docker search tomcat

也可以官网搜索如下:pull nginx:latest

​1. hello world​

docker pull hello-world docker run hello-world

​2. 运行Tomcat​

官方源:-p 参数用于端口映射,前面是宿主机端口,后面是容器端口。 docker run -p 8888:8080 tomcat // -d 参数表示后台启动 docker run -p 8000:8080 -d 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转发到具体的容器上。

七、镜像制作

第一种为commit方式,利用已有的镜像,运行后安装定制自己需要的环境,然后生成镜像;另一种就是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日星期日闭幕 。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:[云原生专题-13]:容器 - 通过docker network 构建docker微服务网络:Docker network
下一篇:Java实战之酒店人事管理系统的实现
相关文章

 发表评论

暂时没有评论,来抢沙发吧~