运维:Docker 容器和 Jenkins 持续集成

运维:Docker 容器和 Jenkins 持续集成


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
2
3
4
5
6
7
8
9
10
11
12
13
14
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+++ 1、上手快
+ ​用户只需要几分钟,就可以把自己的程序 “Docker 化”。Docker 依赖于 “写时复制”(copy-on-write)模型,使修改应用程序也非常迅速,
+ 可以说达到 “随心所致,代码即改” 的境界。随后,就可以创建容器来运行应用程序了。大多数 Docker 容器只需要不到 1 秒中即可启动。
+ 由于去除了管理程序的开销,Docker 容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户尽可能的充分利用系统资源。


+++ 2、职责的逻辑分类
+ 使用 Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。
+ Docker 设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性。
+ 从而降低那种 “开发时一切正常,肯定是运维的问题(测试环境都是正常的,上线后出了问题就归结为肯定是运维的问题)” 。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1
2
3
4
5
6
7
8
9
10
11
12
13
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+++ 3、快速高效的开发生命周期
+ Docker 的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。
+ (通俗一点说,Docker 就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从该盒子中一件件的取。)


+++ 4、鼓励使用面向服务的架构
+ Docker 还鼓励面向服务的体系结构和微服务架构。Docker 推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型。
+ 在这种模型下,应用程序或者服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序都变得非常简单。
+ 同时也提高了程序的内省性。(当然,可以在一个容器中运行多个应用程序)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

容器与虚拟机比较

​下面的图片比较了 Docker 和传统虚拟化方式的不同之处 ,由此可见, Docker 容器 是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统;而传统虚拟化方式则是在硬件层面实现。 如下图所示:

与传统的虚拟机相比,Docker 优势 体现为 启动速度快、占用体积小 。


Docker 组件

服务器和客户端

​Docker 是一个客户端-服务器(C/S)架构程序。Docker 客户端 只需要向 Docker 服务器或者守护进程 发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker 提供了一个命令行工具以及一整套RESTful API,你可以在同一台宿主机上运行 Docker 守护进程和客户端,也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护进程。

镜像与容器

镜像 是构建 Docker 的基石,用户基于镜像来运行自己的容器。镜像 也是 Docker 生命周期中的 “构建” 部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。 例如:

1
2
3
4
5
6
7
8
9
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+ 1、添加一个文件
+ 2、执行一个命令
+ 3、打开一个窗口
+++ 也可以将镜像当作容器的 “源代码” 。镜像体积很小,非常“便携”,易于分享、存储和更新。
+++ 镜像和容器的关系: 镜像就好比我们的类,容器就是对象,一个镜像可以创建多个容器。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Docker 可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。 容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是 Docker 生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。 容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务。所以 Docker 容器就是:

1
2
3
4
5
6
7
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+ 1、一个镜像格式
+ 2、一些列标准操作
+ 3、一个执行环境

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 1、移除 Docker 旧版本。推荐按照官网教程安装:https://docs.docker.com/engine/install/centos/
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

# 2、将 yum 包更新到最新。这个过程需要点时间,我的花了 10 多分钟
sudo yum update

# 3、安装需要的软件包 yum-utils
sudo yum install -y yum-utils

# 4、设置 yum 源为阿里云
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 5、安装 Docker 。docker-ce 是免费的,所示安装它。可以加上 -y ,中途就不用我们自己点击了
sudo yum install docker-ce docker-ce-cli containerd.io

# 6、安装后查看 Docker 版本
docker -v
docker version

如果一切顺利,则可看到如下结果【如果出错,一定从第一步开始重新安装】:

设置 ustc 的镜像

ustc 是老牌的 linux 镜像服务提供者了, 还在遥远的 ubuntu 5.04 版本的时候就在用, ustc 的 docker 镜像加速器速度很快。 ustc docker mirror 的优势之一就是不需要注册,是真正的公共服务。相关链接: Docker 镜像使用帮助


那么我们如何来配置 ustc 镜像呢? 步骤如下:

1
2
3
4
5
6
7
8
9
10
11
12
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+++ 1、编辑 daemon.json 文件,如果没有这个文件,那就创建: touch /etc/docker/daemon.json
+ vi /etc/docker/daemon.json


+++ 2、在该文件中输入如下内容
+ {
+ "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
+ }

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

启动与停止 Docker

以下是 Docker 启动与停止的相关命令:

1
2
3
4
5
6
7
8
9
10
11
12
# Docker 的启动与停止的相关命令

systemctl start docker # 1、启动 Docker 命令
systemctl stop docker # 2、停止 Docker 命令
systemctl restart docker # 3、重启 Docker 命令
systemctl status docker # 4、查看 Docker 状态
systemctl enable docker # 5、设置开机启动
docker version # 6、查看 Docker 版本信息
docker info # 7、查看 Docker 概要信息【Docker 启动了才有用】
docker --help # 8、查看 Docker 帮助文档【Docker 启动了才有用】

# Docker 的启动与停止的相关命令

Docker 的部分命令截图如下:


镜像相关命令

查看镜像

查看镜像的相关命令以及介绍如下:

1
2
3
4
5
6
7
8
# 查看镜像的命令。这些镜像都是存储在 Docker 宿主机的 /var/lib/docker 目录下
docker images

# REPOSITORY: 镜像名称
# TAG: 镜像标签
# IMAGE ID: 镜像 ID ,这个是唯一的,后面的命令中常用到
# CREATED: 镜像的创建日期(不是获取该镜像的日期)
# SIZE: 镜像大小

搜索镜像

如果你需要从网络中查找需要的镜像,可以通过以下命令搜索:

1
2
3
4
5
6
7
8
# 搜索镜像的命令
docker search 镜像名称

# NAME: 镜像名称
# DESCRIPTION: 镜像描述
# STARS: 用户评价【收藏】,反应一个镜像的受欢迎程度
# OFFICIAL: 是否官方
# AUTOMATED: 自动构建,表示该镜像由 Docker Hub 自动构建流程创建的

拉取镜像

拉取镜像就是从中央仓库中下载镜像到本地,命令如下:

1
2
3
4
5
# 拉取镜像的命令
docker pull 镜像名称

# 例如,我要下载 centos7 镜像。7 代表 TAG,如果是 latest ,那么可以省略
docker pull centos:7

删除镜像

删除镜像的相关命令以及介绍如下:

1
2
3
4
5
# 按镜像-ID【也可以是镜像的名字】 删除镜像
docker rmi 镜像-ID

# 删除所有镜像
docker rmi `docker images -q`

容器相关命令

创建与启动容器

接下来,我们介绍容器的创建和启动相关的命令。 文字版介绍如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#########################################################################################################

docker run # 创建容器命令

# 创建容器常用的参数说明
-i: # 表示运行容器
-t: # 表示容器启动后会进入其命令行。加入这两个参数后,容器创建后就进入到了容器内部。
--name: # 为创建的容器命名。(这里要注意:容器的名字是唯一的,如果容器名字相同会报错)
-d: # 加上这个参数则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加 -i -t 两个参数,创建后就会自动进去容器)。
-p: # 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个 -p 做多个端口映射
-v: # 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个 -v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。

#########################################################################################################
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#########################################################################################################

# 交互式方式创建容器。这时我们通过开启另外一个窗口(当前窗口已进入到容器),
# 然后使用 docker ps 命令查看,发现可以看到启动的容器,状态为启动状态
docker run -it --name=容器名称 镜像名称:标签 /bin/bash

# 退出当前容器
exit

# 守护式方式创建容器(容器名称是唯一的)
docker run -di --name=容器名称 镜像名称:标签

# 登录守护式容器方式(容器名称是唯一的)
docker exec -it 容器名称 (或者容器ID) /bin/bash

#########################################################################################################

上述命令的综合使用如下图:

交互式方式创建容器
守护式方式创建容器以及登陆容器

查看容器

查看容器的相关命令以及截图如下:

1
2
3
4
5
6
7
8
#########################################################################################################

docker ps # 1、查看正在运行的容器
docker ps –a # 2、查看所有容器
docker ps –l # 3、查看最后一次运行的容器
docker ps -f status=exited # 4、查看停止的容器

#########################################################################################################

停止与启动容器

停止与启动容器相关命令如下:

1
2
3
4
5
6
#########################################################################################################

docker stop 容器名称(或者容器ID) # 停止容器
docker start 容器名称(或者容器ID) # 启动容器

#########################################################################################################

文件拷贝

文件拷贝相关命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#########################################################################################################

# 1、如果我们需要将文件拷贝到容器内,我们可以使用 cp 命令
docker cp 需要拷贝的文件或目录 容器名称:容器目录

# 2、我们也可以将文件从容器内拷贝出来(注意:拷贝完成之后,文件所在目录为宿主系统的当前位置)
docker cp 容器名称:容器目录 需要拷贝的文件或目录

# 3、将文件从容器内拷贝出来(我们指定拷贝文件以及文件放置位置)
docker cp 容器名称:容器目录/需要拷贝的文件或目录 拷贝后的文件目录
docker cp myCentos2:/usr/local/Hello.java /root/Java # 表示把容器中的 Hello.java 拷贝到宿主机的 /root/Java 目录下

#########################################################################################################

目录挂载

目录挂载: 我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。 具体详情介绍以及操作截图如下:

1
2
3
4
5
6
7
8
9
#########################################################################################################

# 创建容器,添加 -v 参数。 后边为:宿主机目录:容器目录
docker run -di --name=myCentos3 -v /usr/local:/usr/local centos

# 如果你共享的是多级的目录,可能会出现权限不足的提示。这是因为 CentOS7 中的安全模块 selinux 把权限禁掉了,
# 我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题

#########################################################################################################

目录挂载 相关操作截图如下:

查看容器 IP 地址

查看容器 相关命令和截图如下:

1
2
3
4
5
6
7
8
9
#########################################################################################################

# 查看容器中运行的各种数据
docker inspect 容器名称(容器ID) 

# 查看容器的 IP 地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)

#########################################################################################################

删除容器

删除指定的容器 相关命令和截图如下:

1
2
3
4
5
6
7
#########################################################################################################

# 删除指定的容器
docker rm 容器名称(容器ID)
docker rm myCentos3 # 删除名字为 myCentos3 的容器,如果容器开启了,则无法删除

#########################################################################################################

应用部署

MySQL 部署

MySQL 部署 的相关步骤以及截图如下:

1
2
3
4
5
6
7
8
9
10
11
12
#########################################################################################################

# 1、拉取 MySQL 镜像
docker pull centos/mysql-57-centos7

# 2、创建 MySQL 容器。-p 代表端口映射,格式为:宿主机映射端口:容器运行端口。
# -e 代表添加环境变量  MYSQL_ROOT_PASSWORD 是 root 用户的登陆密码
docker run -di --name=Guo_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

# 3、远程登录 MySQL 。即连接宿主机的 IP ,指定端口为 3306

#########################################################################################################



这里需要注意一下: 当我们进行远程数据库连接时,我们可能会遇到如下问题【可能报的错误】 authentication protocol requested by server; consider upgrading MySQL。 那么有效的解决方案如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#########################################################################################################

# 1、先进入到 docker 容器里面。命令: docker exec -it 容器名称 (或者容器ID) /bin/bash
docker exec -it Guo_mysql /bin/bash

# 2、登陆 MySQL 数据库,密码是刚刚指定的 123456
mysql -uroot -p123456

# 3、执行以下两条命令
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; # 注意: 123456 是你自己的 MySQL 密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456'; # 注意: 123456 是你自己的 MySQL 密码

# 4、退出 MySQL 和容器即可进行远程连接了
exit
exit

#########################################################################################################

Tomcat 部署

Tomcat 部署 的相关步骤以及截图如下:

1
2
3
4
5
6
7
8
9
10
11
#########################################################################################################

# 1、拉取 Tomcat 镜像
docker pull tomcat

# 2、创建 Tomcat 容器
docker run -di --name=myTomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat

# 3、浏览器登陆即可访问我们的页面。(我这里 war 包出来问题,所以页面没出来,呜呜呜~~~)

#########################################################################################################

上传 war 包
启动 Tomcat 服务器
使用 9000 端口进行访问

Nginx 部署

Nginx 部署 的相关步骤以及截图如下:

1
2
3
4
5
6
7
8
9
#########################################################################################################

# 1、拉取 Tomcat 镜像
docker pull nginx

# 2、创建 Nginx 容器
docker run -di --name=mynginx -p 80:80 nginx

#########################################################################################################


那我们如何把漂亮的页面放到这里并进行访问呢? 接下来,我们这样做:首先: 下载好右边的静态资源文件,并上传到自己的服务器。 【点击即可下载: 静态资源下载 】 如下图:

第二步: 进入到 nginx 容器,获取到静态页面所在的目录。 具体操作如下图:


在获取到静态页面所在的目录之后,我们退出 nginx 容器。如下图:

第三步: 解压 dist 压缩包,并改名为 html 【解压我自己提前做了】。然后把 html 复制到 nginx 容器中, 如下图:

最后: 打开浏览器访问即可。 如下图:

Redis 部署

Redis 部署 的相关步骤以及截图如下:

1
2
3
4
5
6
7
8
9
#########################################################################################################

# 1、拉取 Redis 镜像
docker pull redis

# 2、创建 Redis 容器
docker run -di --name=myRedis -p 6379:6379 redis

#########################################################################################################

当 Redis 启动好了之后,我们使用客户端 Redis 进行远程连接。 如下图:

迁移与备份

容器保存为镜像

我们可以通过命令将容器保存为镜像,供他人使用。 命令如下:

1
2
3
4
5
6
7
#########################################################################################################

# myNginx 是容器的名字。 mynginx_i 是保存之后的镜像的名字
docker commit myNginx mynginx_i
# 注意:镜像的名字不能大写,只能小写

#########################################################################################################

然后我们使用自己保存的镜像来创建一个容器,看一下效果如何。 具体操作及结果如下图:


镜像备份

我们可以通过命令将镜像保存为 tar 文件。 操作如下:

1
2
3
4
5
6
#########################################################################################################

# 把镜像保存为 tar 格式的压缩文件
docker save -o mynginx.tar mynginx_i

#########################################################################################################

镜像恢复与迁移

首先,我们先删除掉 mynginx_i 镜像,然后执行相关命令进行恢复。操作如下图:

1
2
3
4
5
6
#########################################################################################################

# 把 tar 格式的压缩文件恢复为镜像
docker load -i mynginx.tar

#########################################################################################################


Dockerfile 初识

Dockerfile 是什么

Dockerfile 是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。 Dockerfile 是 docker 中镜像文件的的描述文件,说的直白点就是镜像文件到底是由什么东西一步步构成的。例如我们在淘宝上买了一件商品,但是这个商品需要组装才能使用,于是卖家就给了你一张图纸,你就按照图纸一步一步的组装起来,然后就成了你所需要的样子。那么 Dockerfile 就是这张图纸,镜像文件就是你需要的商品。Dockerfile 名字可以随便命名,但是不建议你这做,还是按照规范来使用,首字母要大写。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#########################################################################################################

# 1、Dockerfile 的好处
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
3、对于运维人员:在部署时,可以实现应用的无缝移植。


# 2、Dockerfile、镜像、容器之间的关系
1、Dockerfile:是镜像的构建文件,描述的镜像是一步步怎么来的。
2、镜像:是通过 Dockerfile 做出来的,包含操作系统基础文件和软件运行环境,它使用分层的存储方式。
3、容器:是运行起来的镜像,简单理解,Docker 镜像相当于程序,容器相当于进程。

#########################################################################################################

Dockerfile 常用命令

了解命令之前,我们先看一下 Dockerfile 的关键字。 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#########################################################################################################

# 关键字 作用
FROM # 指定基础镜像
MAINTAINER # 作者的信息
RUN # 执行什么命令
EXPOSE # 容器对外暴露的端口
WORKDIR # 进入到容器后进入到哪个目录
ENV # 配置环境变量
ADD # 将文件拷贝到镜像中并解压
COPY # 将文件拷贝到镜像中
VOLUME # 配置数据卷
CMD # 容器启动时候执行的命令
ENTRYPOINT # 容器启动时候执行的命令

#########################################################################################################

了解关键字之后,我们再来了解 Dockerfile 的命令。 常用命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
#########################################################################################################

# 命令 作用
FROM image_name:tag # 定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name # 声明镜像的创建者
ENV key value # 设置环境变量 (可以写多条)
RUN command # 是 Dockerfile 的核心部分(可以写多条)
ADD source_dir/file dest_dir/file # 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file # 和 ADD 相似,但是如果有压缩文件并不能解压
WORKDIR path_dir # 设置工作目录

#########################################################################################################

使用脚本创建镜像

我们以构建 JDK1.8 镜像作为演示,其基础镜像是 centos 。 构建步骤如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#########################################################################################################

# 1、创建目录
mkdir –p /usr/local/dockerjdk8

# 2、下载 jdk-8u171-linux-x64.tar.gz 并上传到服务器(虚拟机)中的 /usr/local/dockerjdk8 目录
mv jdk-8u221-linux-x64.tar.gz /usr/local/dockerjdk8/
cd /usr/local/dockerjdk8/

# 3、创建 Dockerfile 文件
vi Dockerfile

#########################################################################################################

上述三个步骤截图如下:

接下来,我们需要编写 Dockerfile 文件。 其具体内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#########################################################################################################

# Dockerfile 文件的内容如下:
FROM centos # 依赖镜像名称和 ID
MAINTAINER root # 指定镜像创建者信息
WORKDIR /usr # #切换工作目录
RUN mkdir /usr/local/java

# ADD 是相对路径 jar ,把 java 添加到容器中
ADD jdk-8u221-linux-x64.tar.gz /usr/local/java/

# 配置 java 环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_221
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

#########################################################################################################

编写完成之后,我们查看 Dockerfile 这个文件。 如下图:

接下来我们使用命令构建镜像。 具体操作及结果如下图:

1
2
3
4
5
6
7
8
9
#########################################################################################################

# 4、执行命令构建镜像。注意:后边的空格和点,不要省略
docker build -t='jdk1.8' .

# 5、查看镜像是否建立完成
docker images

#########################################################################################################

构建成功之后截图如下:

Docker 私有仓库

私有仓库搭建与配置

私有仓库: 顾名思义就是私人的,不对外开放的一种仓库,一般供企业内部使用。 如果我们不想把自己的镜像让互联网的用户使用,那么私有仓库就是最佳的选择。接下来,我们就介绍私有仓库的搭建过程和配置。如下:

1
2
3
4
5
6
7
8
9
10
11
12
#########################################################################################################

# 1、拉取私有仓库镜像
docker pull registry

# 启动私有仓库容器
docker run -di --name=myRegistry -p 5000:5000 registry

# 3-1、打开浏览器 输入地址 http://192.168.0.141:5000/v2/_catalog 进行访问。
# 3-2如果看到 `{"repositories":[]}` 表示私有仓库搭建成功并且内容为空

#########################################################################################################

上述的操作截图以及结果如下图:


如果能够访问到上述页面,则代表私有仓库搭建成功。 至于页面内容返回值为空数组,那是因为这个私有仓库刚刚搭建,它里面还没有 docker 镜像。那么接下来的操作就是把我们的 docker 镜像上传到我们的私有仓库。 操作步骤如下:

1
2
3
4
5
6
7
8
9
10
11
12
#########################################################################################################

# 4、修改 daemon.json
vi /etc/docker/daemon.json

# 5、添加以下内容(用于让 docker 信任私有仓库地址),然后保存退出。里面是 => 虚拟机IP地址:端口号
"insecure-registries": ["192.168.0.141:5000"]

# 6、重启 docker 服务
systemctl restart docker

#########################################################################################################

上述三个步骤操作截图如下:

TIPS: 私有仓库搭建与配置 到这里就搞定了!!!

上传镜像至私有仓库

现在,我们就上传镜像到私有仓库。【下载和上传类似,这里就不写了,不明白的自行搜索即可解决】 步骤如下:

1
2
3
4
5
6
7
8
9
10
11
12
#########################################################################################################

# 1、标记此镜像为私有仓库的镜像。命令:docker tag 镜像名 服务器IP地址:端口号/镜像名
docker tag redis 192.168.0.141:5000/redis

# 2、再次启动私服容器。如果 registry 已启动,则跳过这一步
docker start registry

# 3、上传标记的镜像
docker push 192.168.0.141:5000/redis

#########################################################################################################

上述三个步骤的操作截图如下:


最终的结果如下:

TIPS: Docker 的入门教程 到此结束!!!

Jenkins 知识

DockerMaven 插件

首先,我们先来了解一下 微服务的两种部署方法, 如下:

1
2
3
4
5
6
7
#########################################################################################################

# 微服务的两种部署方法
1、手动部署:把源码打包生成 jar 包(或 war 包),将 jar 包(或 war 包)上传至虚拟机并拷贝至 JDK 容器中。
2、自动部署:通过 Maven 插件来实现自动部署。

#########################################################################################################

对于数量众多的微服务,手动部署无疑是非常麻烦的做法,并且容易出错。 所以我们这里学习如何自动部署,这也是企业实际开发中经常使用的方法。那么接下来,我们就通过 Maven 插件来实现自动部署。 其具体步骤如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#########################################################################################################

# 1、修改宿主机的 docker 配置,让其可以实现远程访问
vi /lib/systemd/system/docker.service

# 2、进入到 docker.service 配置文件,找到 ExecStart= 字样,然后在其后面加入如下代码,然后保存退出
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

# 3、刷新配置,重启服务。注意:docker start registry 命令被我替换成了下列第 3,4,5 这三条命令
systemctl daemon-reload
systemctl restart docker
docker images
docker run -di --name=registry registry
docker ps

#########################################################################################################

上述三个步骤的操作截图如下:


TIPS: 这里需要你有一个微服务项目,如果没有,点击右侧下载: 微服务项目下载

如果上面的三个步骤都没有问题,那么我们来进行 第四步: 在工程下的 pom.xml 中增加配置。 代码及截图如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<build>
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- docker 的 maven 插件,官网:https://github.com/spotify/docker-maven-plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>192.168.0.141:5000/${project.artifactId}:${project.version}</imageName>
<baseImage>jdk1.8</baseImage>
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<dockerHost>http://192.168.0.141:2375</dockerHost>
</configuration>
</plugin>
</plugins>
</build>

以上配置会自动生成 Dockerfile ,相当于如下三个命令【 注意: 以上的 IP 地址须改为自己的】:

1
2
3
4
5
6
7
#########################################################################################################

FROM jdk1.8
ADD app.jar /
ENTRYPOINT ["java","-jar","/app.jar"]

#########################################################################################################

第五步: 使用 IDEA 打开微服务项目,然后在 IDEA 下打开终端,执行 mvn install 命令。 如下图:

当上述操作完成后,我们进入到 第六步: 进入到需要实现自动部署的微服务工程目录下,输入命令 mvn docker:build -DpushImage 进行打包和上传镜像。 具体操作与详情请参照下图:

1
2
3
4
5
6
7
8
9
10
11
12
# 注意:由于上述没有执行成功,所以下面的步骤也无法进行。搞了一天,老是出错,所以问题先留在这里,以后再来解决。

上述操作完成后,我们进入宿主机 , 查看镜像
docker images
输出如上内容,表示微服务已经做成镜像
浏览器访问 http://192.168.184.141:5000/v2/_catalog ,输出
浏览器访问 http://192.168.184.141:5000/v2/_catalog ,输出
{"repositories":["tensquare_base"]}
(7) 启动容器:
docker run -di --name=base -p 9001:9001 192.168.184.141:5000/tensquare_base:1.0-SNAPSHOT

# 注意:由于上述没有执行成功,所以下面的步骤也无法进行。搞了一天,老是出错,所以问题先留在这里,以后再来解决。

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 ,点击“直接安装”按钮

看到如下图时,表示已经完成

详情参考: 持续集成与容器管理

    / 

📚 本站推荐文章
  👉 从 0 开始搭建 Hexo 博客
  👉 计算机网络入门教程
  👉 数据结构入门
  👉 算法入门
  👉 IDEA 入门教程

可在评论区留言哦

一言句子获取中...

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×