Docker 知识
快捷导航:
Docker 官网: http://www.docker.com
Docker 文档: https://docs.docker.com/engine/install/
Docker 中文网: https://www.docker.org.cn/page/resources.html
Docker Hub 官网: https://hub.docker.com/
Docker 简介
有没有想过一个 问题:
我写的代码在我的机子上可以运行,到了你的机子上却不行? 这其中的原因就是环境问题。所以在工作中,你写好的代码给了运维和测试人员,发现你写的有 bug ,然后你们就开始了撕逼……(不就是个环境问题,嚷嚷啥) 那么此时,我们是不是应该使用一种技术,来打破这种环境的限制呢?那么,它来了,它就是 Docker 容器化技术!!! 推荐阅读(转载):
Docker 入门教程
什么是虚拟化
在计算机中,虚拟化(Virtualization)
是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。 这些资源的新虚拟部份是不受现有资源的架设方式、地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件, 从而最大化的利用物理硬件和对资源充分利用。虚拟化技术种类很多,例如: 软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机 等等。
什么是 Docker
Docker
是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。 它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议, 项目代码在 GitHub 上进行维护。
Docker
自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。 Redhat 已经在其 RHEL6.5 中集中支持 Docker ;Google 也在其 PaaS 产品中广泛应用。Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。 用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
那我们为什么要选择 Docker 呢?其 优势
如下:
1 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
容器与虚拟机比较
下面的图片比较了 Docker
和传统虚拟化方式的不同之处 ,由此可见, Docker 容器
是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统;而传统虚拟化方式则是在硬件层面实现。 如下图所示:
与传统的虚拟机相比,Docker 优势
体现为 启动速度快、占用体积小 。
Docker 组件
服务器和客户端
Docker
是一个客户端-服务器(C/S)架构程序。Docker 客户端 只需要向 Docker 服务器或者守护进程 发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker 提供了一个命令行工具以及一整套RESTful API,你可以在同一台宿主机上运行 Docker 守护进程和客户端,也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护进程。
镜像与容器
镜像
是构建 Docker 的基石,用户基于镜像来运行自己的容器。镜像 也是 Docker 生命周期中的 “构建” 部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。 例如:
1 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
Docker
可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。 容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是 Docker 生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。 容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务。所以 Docker 容器就是:
1 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
Docker
借鉴了标准集装箱的概念。 标准集装箱将货物运往世界各地,Docker 将这个模型运用到自己的设计中。唯一不同的是:集装箱运输货物,而 Docker 运输软件。 和集装箱一样,Docker 在执行上述操作时,并不关心容器中到底装了什么, 它不管是 web 服务器,还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将内容“装载”进去。Docker 也不关心你要把容器运到何方, 我们可以在自己的笔记本中构建容器,上传到 Registry ,然后下载到一个物理的或者虚拟的服务器来测试,在把容器部署到具体的主机中。像标准集装箱一样,Docker 容器方便替换,可以叠加,易于分发,并且尽量通用。
注册中心(Registry)
Docker 用 Registry
来保存用户构建的镜像。Registry 分为公共和私有两种。 Docker 公司运营公共的 Registry 叫做 Docker Hub
。用户可以在 Docker Hub 注册账号,分享并保存自己的镜像【这里说明一下:在 Docker Hub 下载镜像巨慢,可以自己构建私有的 Registry】。Docker Hub 官方网站: https://hub.docker.com/
Docker 的安装与启动
安装 Docker
Docker 官方建议
在 Ubuntu 中安装,因为 Docker 是基于 Ubuntu 发布的,而且一般 Docker 出现的问题 Ubuntu 是最先更新或者打补丁的。 在很多版本的 CentOS 中是不支持更新最新的一些补丁包的。 由于我的环境使用的是 CentOS ,因此这里我将 Docker 安装到 CentOS 上。 注意啦:
这里建议安装在 CentOS7.x 以上的版本,在 CentOS6.x 的版本中,安装前需要安装其他很多的环境而且 Docker 很多补丁不支持更新。
接下来我们使用如下命令安装 Docker 。如果你是 root 用户,可以把 sudo 去掉。 相关命令如下:
1 | # 1、移除 Docker 旧版本。推荐按照官网教程安装:https://docs.docker.com/engine/install/centos/ |
如果一切顺利,则可看到如下结果【如果出错,一定从第一步开始重新安装】:
设置 ustc 的镜像
ustc
是老牌的 linux 镜像服务提供者了, 还在遥远的 ubuntu 5.04 版本的时候就在用, ustc
的 docker 镜像加速器速度很快。 ustc docker mirror 的优势之一就是不需要注册,是真正的公共服务。相关链接: Docker 镜像使用帮助
那么我们如何来配置 ustc 镜像呢? 步骤如下:
1 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
启动与停止 Docker
以下是 Docker 启动与停止的相关命令:
1 | # Docker 的启动与停止的相关命令 |
Docker 的部分命令截图如下:
镜像相关命令
查看镜像
查看镜像的相关命令以及介绍如下:
1 | # 查看镜像的命令。这些镜像都是存储在 Docker 宿主机的 /var/lib/docker 目录下 |
搜索镜像
如果你需要从网络中查找需要的镜像,可以通过以下命令搜索:
1 | # 搜索镜像的命令 |
拉取镜像
拉取镜像就是从中央仓库中下载镜像到本地,命令如下:
1 | # 拉取镜像的命令 |
删除镜像
删除镜像的相关命令以及介绍如下:
1 | # 按镜像-ID【也可以是镜像的名字】 删除镜像 |
容器相关命令
创建与启动容器
接下来,我们介绍容器的创建和启动相关的命令。 文字版介绍如下:
1 | ######################################################################################################### |
1 | ######################################################################################################### |
上述命令的综合使用如下图:
查看容器
查看容器的相关命令以及截图如下:
1 | ######################################################################################################### |
停止与启动容器
停止与启动容器相关命令如下:
1 | ######################################################################################################### |
文件拷贝
文件拷贝相关命令如下:
1 | ######################################################################################################### |
目录挂载
目录挂载:
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。 具体详情介绍以及操作截图如下:
1 | ######################################################################################################### |
目录挂载 相关操作截图如下:
查看容器 IP 地址
查看容器 相关命令和截图如下:
1 | ######################################################################################################### |
删除容器
删除指定的容器 相关命令和截图如下:
1 | ######################################################################################################### |
应用部署
MySQL 部署
MySQL 部署 的相关步骤以及截图如下:
1 | ######################################################################################################### |
这里需要注意一下:
当我们进行远程数据库连接时,我们可能会遇到如下问题【可能报的错误】 authentication protocol requested by server; consider upgrading MySQL。
那么有效的解决方案如下:
1 | ######################################################################################################### |
Tomcat 部署
Tomcat 部署 的相关步骤以及截图如下:
1 | ######################################################################################################### |
Nginx 部署
Nginx 部署 的相关步骤以及截图如下:
1 | ######################################################################################################### |
那我们如何把漂亮的页面放到这里并进行访问呢? 接下来,我们这样做:首先:
下载好右边的静态资源文件,并上传到自己的服务器。 【点击即可下载: 静态资源下载 】 如下图:
第二步:
进入到 nginx 容器,获取到静态页面所在的目录。 具体操作如下图:
在获取到静态页面所在的目录之后,我们退出 nginx 容器。如下图:
第三步:
解压 dist 压缩包,并改名为 html 【解压我自己提前做了】。然后把 html 复制到 nginx 容器中, 如下图:
最后:
打开浏览器访问即可。 如下图:
Redis 部署
Redis 部署 的相关步骤以及截图如下:
1 | ######################################################################################################### |
当 Redis 启动好了之后,我们使用客户端 Redis 进行远程连接。 如下图:
迁移与备份
容器保存为镜像
我们可以通过命令将容器保存为镜像,供他人使用。 命令如下:
1 | ######################################################################################################### |
然后我们使用自己保存的镜像来创建一个容器,看一下效果如何。 具体操作及结果如下图:
镜像备份
我们可以通过命令将镜像保存为 tar 文件。 操作如下:
1 | ######################################################################################################### |
镜像恢复与迁移
首先,我们先删除掉 mynginx_i
镜像,然后执行相关命令进行恢复。操作如下图:
1 | ######################################################################################################### |
Dockerfile 初识
Dockerfile 是什么
Dockerfile
是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。 Dockerfile
是 docker 中镜像文件的的描述文件,说的直白点就是镜像文件到底是由什么东西一步步构成的。例如我们在淘宝上买了一件商品,但是这个商品需要组装才能使用,于是卖家就给了你一张图纸,你就按照图纸一步一步的组装起来,然后就成了你所需要的样子。那么 Dockerfile 就是这张图纸,镜像文件就是你需要的商品。Dockerfile 名字可以随便命名,但是不建议你这做,还是按照规范来使用,首字母要大写。
1 | ######################################################################################################### |
Dockerfile 常用命令
了解命令之前,我们先看一下 Dockerfile 的关键字。 如下:
1 | ######################################################################################################### |
了解关键字之后,我们再来了解 Dockerfile 的命令。 常用命令如下:
1 | ######################################################################################################### |
使用脚本创建镜像
我们以构建 JDK1.8 镜像作为演示,其基础镜像是 centos 。 构建步骤如下:
1 | ######################################################################################################### |
上述三个步骤截图如下:
接下来,我们需要编写 Dockerfile 文件。 其具体内容如下:
1 | ######################################################################################################### |
编写完成之后,我们查看 Dockerfile 这个文件。 如下图:
接下来我们使用命令构建镜像。 具体操作及结果如下图:
1 | ######################################################################################################### |
构建成功之后截图如下:
Docker 私有仓库
私有仓库搭建与配置
私有仓库:
顾名思义就是私人的,不对外开放的一种仓库,一般供企业内部使用。 如果我们不想把自己的镜像让互联网的用户使用,那么私有仓库就是最佳的选择。接下来,我们就介绍私有仓库的搭建过程和配置。如下:
1 | ######################################################################################################### |
上述的操作截图以及结果如下图:
如果能够访问到上述页面,则代表私有仓库搭建成功。 至于页面内容返回值为空数组,那是因为这个私有仓库刚刚搭建,它里面还没有 docker 镜像。那么接下来的操作就是把我们的 docker 镜像上传到我们的私有仓库。 操作步骤如下:
1 | ######################################################################################################### |
上述三个步骤操作截图如下:
TIPS:
私有仓库搭建与配置 到这里就搞定了!!!
上传镜像至私有仓库
现在,我们就上传镜像到私有仓库。【下载和上传类似,这里就不写了,不明白的自行搜索即可解决】 步骤如下:
1 | ######################################################################################################### |
上述三个步骤的操作截图如下:
最终的结果如下:
TIPS:
Docker 的入门教程 到此结束!!!
Jenkins 知识
DockerMaven 插件
首先,我们先来了解一下 微服务的两种部署方法, 如下:
1 | ######################################################################################################### |
对于数量众多的微服务,手动部署无疑是非常麻烦的做法,并且容易出错。 所以我们这里学习如何自动部署,这也是企业实际开发中经常使用的方法。那么接下来,我们就通过 Maven 插件来实现自动部署。 其具体步骤如下:
1 | ######################################################################################################### |
上述三个步骤的操作截图如下:
TIPS:
这里需要你有一个微服务项目,如果没有,点击右侧下载: 微服务项目下载
如果上面的三个步骤都没有问题,那么我们来进行 第四步:
在工程下的 pom.xml 中增加配置。 代码及截图如下:
1 | <build> |
以上配置会自动生成 Dockerfile ,相当于如下三个命令【 注意:
以上的 IP 地址须改为自己的】:
1 | ######################################################################################################### |
第五步:
使用 IDEA 打开微服务项目,然后在 IDEA 下打开终端,执行 mvn install
命令。 如下图:
当上述操作完成后,我们进入到 第六步:
进入到需要实现自动部署的微服务工程目录下,输入命令 mvn docker:build -DpushImage
进行打包和上传镜像。 具体操作与详情请参照下图:
1 | # 注意:由于上述没有执行成功,所以下面的步骤也无法进行。搞了一天,老是出错,所以问题先留在这里,以后再来解决。 |
Jenkins 安装
2.1 什么是持续集成
持续集成 Continuous integration ,简称CI
随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。尤其是近些年来,敏捷(Agile) 在软件工程领域越来越红火,如何能再不断变化的需求中快速适应和保证软件的质量也显得尤其的重要。
持续集成正是针对这一类问题的一种软件开发实践。它倡导团队开发成员必须经常集成他们的工作,甚至每天都可能发生多次集成。而每次的集成都是通过自动化的构建来验证,包括自动编译、发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件。
持续集成具有的特点:
它是一个自动化的周期性的集成测试过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动完成的,无需人工干预;
需要有专门的集成服务器来执行集成构建;
需要有代码托管工具支持,我们下一小节将介绍Git以及可视化界面Gogs的使用
持续集成的作用:
保证团队开发人员提交代码的质量,减轻了软件发布时的压力;
持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量;
2.2 Jenkins简介
Jenkins,原名Hudson,2011年改为现在的名字,它 是一个开源的实现持续集成的软件工具。官方网站:http://jenkins-ci.org/。
Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。
特点:
易安装:仅仅一个 java -jar jenkins.war,从官网下载该文件后,直接运行,无需额外的安装,更无需安装数据库;
易配置:提供友好的GUI配置界面;
变更支持:Jenkins能从代码仓库(Subversion/CVS)中获取并产生代码更新列表并输出到编译输出信息中;
支持永久链接:用户是通过web来访问Jenkins的,而这些web页面的链接地址都是永久链接地址,因此,你可以在各种文档中直接使用该链接;
集成E-Mail/RSS/IM:当完成一次集成时,可通过这些工具实时告诉你集成结果(据我所知,构建一次集成需要花费一定时间,有了这个功能,你就可以在等待结果过程中,干别的事情);
JUnit/TestNG测试报告:也就是用以图表等形式提供详细的测试报表功能;
支持分布式构建:Jenkins可以把集成构建等工作分发到多台计算机中完成;
文件指纹信息:Jenkins会保存哪次集成构建产生了哪些jars文件,哪一次集成构建使用了哪个版本的jars文件等构建记录;
支持第三方插件:使得 Jenkins 变得越来越强大
2.3 Jenkins安装
2.3.1 JDK安装
(1)将jdk-8u171-linux-x64.rpm上传至服务器(虚拟机)
(2)执行安装命令
rpm -ivh jdk-8u171-linux-x64.rpm
1
RPM方式安装JDK,其根目录为:/usr/java/jdk1.8.0_171-amd64
2.3.2 Jenkins安装与启动
(1)下载jenkins
wget https://pkg.jenkins.io/redhat/jenkins-2.83-1.1.noarch.rpm
1
或将jenkins-2.83-1.1.noarch.rpm上传至服务器
(2)安装jenkins
rpm -ivh jenkins-2.83-1.1.noarch.rpm
1
(3)配置jenkins
vi /etc/sysconfig/jenkins
1
修改用户和端口
JENKINS_USER=”root”
JENKINS_PORT=”8888”
1
2
(4)启动服务
systemctl start jenkins
1
(5)访问链接 http://192.168.184.135:8888
从/var/lib/jenkins/secrets/initialAdminPassword中获取初始密码串
(6)安装插件
(7)新建用户
完成安装进入主界面
2.4 Jenkins插件安装
我们以安装maven插件为例,演示插件的安装
(1)点击左侧的“系统管理”菜单 ,然后点击
(2)选择“可选插件”选项卡,搜索maven,在列表中选择Maven Integration ,点击“直接安装”按钮
看到如下图时,表示已经完成
详情参考: 持续集成与容器管理