Clay 的技术空间

用进废退 | 艺不压身

前言

本教程实战演示基于 SVN + Jenkins + Maven + JDK + Docker 搭建 CI/CD 环境,其中 SVN 基于 Debian 镜像手动安装,而 Jenkins、Maven、JDK 则基于 Tomcat 镜像手动安装。如果仅为了快速体验使用 Jenkins 的功能,可以直接 Pull Jenkins 官方的 Docker 镜像,然后创建并启动 Docker 容器来体验 Jenkins 相关功能,此时可忽略下面教程中的大部分操作步骤。

Docker 环境安装与配置

基于 Docker 搭建 SVN 服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 拉取Debian镜像
# docker pull debian

# 创建并启动容器,80是Apache端口,3690是Subversion端口,/var/lib/svn是所有SVN仓库的父目录
# docker run -it -p 9126:80 -p 4690:3690 --name svn-httpd \
-v /container/svn-server:/var/lib/svn \
-d debian

# 连接容器
# docker exec -it svn-httpd /bin/bash

# 修改系统时间
# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 参考上面给出的本站教程,使用Apache、Subversion搭建SVN服务器

# 断开容器连接,不停止运行容器
# ctrl + p + q

# 最后如果Subversion容器能正常工作,建议执行commit操作生成Docker备份镜像
# docker commit -a "clay@gmail.com" -m "commit jenkins-svn-httpd image" svn-httpd clay/jenkins-svn-httpd:1.0
阅读全文 »

Jenkins 相关站点

Jenkins 与 Hundson 介绍

Jenkins 与 Hundson 是目前最流行的持续集成及自动化部署工具,基于 Java 语言开发,二者师出同门。2009 年甲骨文收购了 Sun 公司并继承了 Hudson 代码库。在 2011 年年初,甲骨文和开源社区之间的关系破裂,该项目被分成两个独立的项目 Jenkins 和 Hundson。其中 Jenkins 的团队由大部分原始开发人员组成,Hudson 则由甲骨文公司继续管理,所以二者是非常相似的产品。Jenkins 可以整合 Subversion、Git、GitHub 等,而 Husband 同样也可以。其他优秀的持续集成工具还有 Strider、GitLab CI、TeamCity(JetBrains)、Travis CI、Codeship、Codefresh 等。

持续集成介绍

  • 问题:各个小组分别负责各个具体模块开发,本模块独立测试虽然能够通过,但是上线前夕将所有模块整合到一起集成测试却发现存在很多问题,想要解决就需要把很多代码返工重写而且仍然有可能有问题,但现在时间很可能不够了。那怎么做会好一些呢?
  • 概念:Continuous Integration(CI)持续集成指开发人员提交了新代码之后,立刻进行构建、自动化测试。根据测试结果,确定所有模块的代码是否能正确地集成在一起;如果失败,开发团队就要停下手中的工作立即修复它。Martin Fowler 说过:” 持续集成并不能消除 Bug,而是让它们非常容易发现和改正。”
  • 关注点:持续集成的关注点在于尽早发现项目整体运行存在的问题,并尽早解决。
阅读全文 »

Docker 官方 Redis 镜像的使用说明文档

使用 Docker 官方的 Redis 镜像

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 搜索所有可用的Redis镜像
# docker search redis

# 下载Docker官方提供的Redis5.0镜像(基于Debian-Stretch)
# docker pull redis:5.0

# 创建并启动(以后台方式)Redis容器,同时挂载Redis的数据文件目录和启用AOF
# docker run -p 6379:6379 --name redis5.0 \
-v /container/redis5.0/data:/data \
-d redis:5.0 redis-server --appendonly yes

# 或者指定Redis的配置文件目录来启动Redis容器
# docker run -p 6379:6379 --name redis5.0 \
-v /container/redis5.0/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /container/redis5.0/data:/data \
-d redis:5.0 redis-server /usr/local/etc/redis/redis.conf

# 注意:
# 上面的/container/redis5.0/conf/redis.conf是Redis的配置文件目录(非配置文件本身),应该在此目录下预先添加Reids真正的配置文件redis.conf,然后再启动Redis容器
# 如果指定Reids配置文件目录来启动Redis容器,那配置文件redis.conf里应该注释掉"bind"相关配置项
# 指定Redis的配置文件目录来启动Redis容器,并添加Redis的配置文件,最终宿主机共享目录的目录结构如下:
/container
└── redis5.0
├── conf
│   └── redis.conf
│   └── redis.conf
└── data

# 查看当前所有正在运行的容器
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dbe17690112d redis:5.0 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:6379->6379/tcp redis5.0

# 连接到Docker容器,连接之后如果想断开连接,在容器内的终端直接执行"exit"命令即可,连接断开后容器不会停止运行
# docker exec -it redis5.0 /bin/bash

# 在容器内,连接到Redis服务器
# redis-cli -p 6379

# 提示:Reids相关文件目录说明
# 默认数据文件目录:/data
# 默认安装目录:/usr/local/bin/
# 默认日志文件:在配置文件redis.conf中指定
# 默认配置文件:启动Redis容器的时候,如果不指定Redis的配置文件目录,则容器内使用默认参数启动Redis服务(即此时不存在默认的Reids配置文件)
阅读全文 »

前言

拉取 MySQL 镜像

1
2
3
4
5
# 搜索所有可用的MySQL镜像
# docker search mysql

# 拉取Docker官方提供的MySQL5.7镜像(基于Debian-Stretch)
# docker pull mysql:5.7

启动 MySQL 容器

Docker 启动容器

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
29
# 创建并启动(以后台方式)MySQL容器,同时挂载MySQL的数据文件目录
# docker run -p 3308:3306 --name mysql5.7 \
-v /container/mysql5.7/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai \
-d mysql:5.7

# 或者挂载MySQL的配置文件目录、数据文件目录、日志文件目录
# docker run -p 3308:3306 --name mysql5.7 \
-v /container/mysql5.7/conf:/etc/mysql/conf.d \
-v /container/mysql5.7/data:/var/lib/mysql \
-v /container/mysql5.7/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai \
-d mysql:5.7

# 查看当前所有正在运行的容器
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7485feae5c64 mysql:5.7 "docker-entrypoint.s…" 7 seconds ago Up 5 seconds 33060/tcp, 0.0.0.0:3308->3306/tcp mysql5.7

# 连接到Docker容器,连接之后如果想断开连接,在容器内的终端直接执行"exit"命令即可,连接断开后容器不会停止运行
# docker exec -it mysql5.7 /bin/bash

# MySQL相关文件目录说明:
# 默认的日志文件目录:/var/log/mysql
# 默认的数据文件目录:/var/lib/mysql
# 默认的配置文件路径:/etc/mysql/my.cnf
# 值得一提的是,默认的配置文件 /etc/mysql/my.cnf 会分别加载 /etc/mysql/conf.d 和 /etc/mysql/mysql.conf.d 目录下的自定义配置文件
参数说明
-e TZ=Asia/Shanghai设置系统时区
-e MYSQL_ROOT_PASSWORD=123456设置数据库密码

Docker-Compose 启动容器

  • docker-compose.yml 配置文件的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: "3.5"

services:
mysql:
image: mysql:5.7
container_name: mall-mysql
privileged: false
restart: always
environment:
TZ: 'Asia/Shanghai'
MYSQL_ROOT_PASSWORD: 123456
ports:
- 3308:3306
volumes:
- '/container/mysql5.7/conf:/etc/mysql/conf.d'
- '/container/mysql5.7/data:/var/lib/mysql'
- '/container/mysql5.7/logs:/var/log/mysql'
command: --default-authentication-plugin=mysql_native_password
  • 启动 MySQL 容器
1
2
# 后台启动容器
# docker-compose up -d

验证 MySQL 服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 在容器内执行登录MySQL服务器的命令
# docker exec -it mysql5.7 mysql -h localhost -u root -p

# 创建数据库
mysql> create database bbs default character set utf8;

# 创建表
mysql> create table bbs.user(id bigint(20) not null auto_increment primary key, name varchar(25) not null) engine=innodb auto_increment=3 default charset=utf8;

# 插入表数据
mysql> insert into bbs.user(name) values("peter");

# 查询表数据
mysql> select * from bbs.user;
+----+-------+
| id | name |
+----+-------+
| 3 | peter |
+----+-------+
1 row in set (0.00 sec)

# 退出登录
mysql> exit

开启 MySQL 远程访问

开启 MySQL 远程访问的权限,这里仅供演示,出于数据库安全考虑,强烈不建议开启 root 用户的远程访问权限,尤其是生产环境。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 在容器内执行登录MySQL服务器的命令
# docker exec -it mysql5.7 mysql -h localhost -u root -p

# 切换数据库
mysql> use mysql;

# 用户授权
mysql> grant all privileges on *.* to root@'%' identified by "123456";

# 更新授权信息
mysql> flush privileges;

# 退出登录
mysql> exit

如果以后想在宿主机上或者外部通过 MySQL 客户端连接到 Docker 容器内的 MySQL 服务器,使用以下命令即可。其中 192.168.1.198 是 Docker 容器所在宿主机的 IP,3308 是宿主机的 MySQL 映射端口。

1
mysql -h 192.168.1.198 -u root -P 3308 -p

完成 MySQL 授权后,如果外部依然无法连接 Docker 容器内的 MySQL 服务器,务必检查宿主机的防火墙是否开放了 MySQL 的映射端口(如上面的 3308 端口)。

备份 MySQL 数据库

1
2
# 备份MySQL所有数据库的数据
# docker exec mysql5.7 sh -c 'exec mysqldump --all-databases -uroot -p"123456"'> ~/all-databases.sql

查看 MySQL 的日志信息

1
2
3
4
5
6
7
# 显示所有日志信息
# docker logs mysql5.7

# 跟踪显示日志信息
# docker logs -f --tail 20 mysql5.7

# 或者进入 MySQL 容器内的日志目录 /var/log/mysql,进一步分析日志信息

更改 MySQL 的最大连接数

参数默认值说明
max_connections151 数据库的最大连接数
max_user_connections 单用户的最大连接数

临时更改生效

1
2
3
4
5
6
7
8
9
# 在容器内执行登录MySQL服务器的命令
# docker exec -it mysql5.7 mysql -h localhost -u root -p

# 临时更改最大连接数(重启后失效)
mysql> set GLOBAL max_connections=16384;
mysql> set GLOBAL max_user_connections=2000;

# 退出登录
mysql> exit

永久更改生效

1
2
3
4
5
6
7
# 连接到Docker容器,连接之后如果想断开连接,在容器内的终端直接执行"exit"命令即可,连接断开后容器不会停止运行
# docker exec -it mysql5.7 /bin/bash

# 更改配置文件,在末尾添加两行内容
# vim /etc/mysql/mysql.conf.d/mysqld.cnf
max_connections=16384
max_user_connections=2000

验证更改结果

1
2
3
4
5
6
7
8
9
# 在容器内执行登录MySQL服务器的命令
# docker exec -it mysql5.7 mysql -h localhost -u root -p

# 查看最大连接数
mysql> show variables like 'max_connections';
mysql> show variables like "max_user_connections";

# 退出登录
mysql> exit

提示

若 MySQL 的最大连接数更改后无法生效,则建议进一步更改 Linux 系统的最大打开文件描述符数,具体可以参考 这篇文章

更改系统的镜像源

若希望更改系统的镜像源,可以按照以下步骤进行操作,适用于 Debian 9(Stretch)。

1
2
3
4
5
6
7
8
9
10
11
12
# 连接到Docker容器,连接之后如果想断开连接,在容器内的终端直接执行"exit"命令即可,连接断开后容器不会停止运行
# docker exec -it mysql5.7 /bin/bash

# 使用阿里云镜像站
# cp /etc/apt/sources.list /etc/apt/backup.sources.list
# echo "deb http://mirrors.aliyun.com/debian/ stretch main non-free contrib" > /etc/apt/sources.list
# echo "deb http://mirrors.aliyun.com/debian-security stretch/updates main" >> /etc/apt/sources.list
# echo "deb http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib" >> /etc/apt/sources.list
# echo "deb http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib" >> /etc/apt/sources.list

# 更新软件索引
# apt-get update

实战内容介绍

编写 Dockerfile 文件,指定终端登录后的默认路径,安装 vim、ifconfig、jdk、tomcat,并配置 jdk 与 tomcat 的环境变量,最后通过 Dockerfile 文件构建新的 Docker 镜像(基于 Centos)并运行。

目录结构介绍

1
2
3
4
5
6
# 后续所有操作都在/root/build-tomcat目录下进行
# tree /root/build-tomcat
/root/build-tomcat
├── apache-tomcat-7.0.77.tar.gz
├── dockerfile-tomcat
└── jdk1.8.0_201.tar.gz
阅读全文 »

前言

目前比较流行的日志框架有 Log4j、Logback 等,这两个框架的作者是同一个人,Logback 旨在作为流行的 Log4j 项目的后续版本,从而恢复 Log4j 离开的位置。另外 SLF4J (Simple Logging Facade for Java) 则是一个日志门面框架,提供了日志系统中常用的接口,Logback 和 Log4j 则对 SLF4J 进行了实现。本文将讲述如何在 Spring Boot 中应用 SLF4J + Logback 实现日志的记录。

引入依赖

Spring Boot 默认内置了 Logback 日志框架,一般只需在 Maven 中要引入 spring-boot-starter-logging 依赖。

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
阅读全文 »

系统环境

1
2
CentOS Linux release 7.6.1810 (Core)
Linux centos7 3.10.0-957.5.1.el7.x86_64 #1 SMP Fri Feb 1 14:54:57 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

卸载 Mariadb

1
2
3
4
5
# 查找mariadb模块
# rpm -qa | grep mariadb

# 删除查找到的mariadb模块
# rpm -e --nodeps xxxx
阅读全文 »

实战内容介绍

实战编写 Dockerfile,指定终端登录后的默认路径,同时预安装 vim、ifconfig 工具,最后通过 Dockerfile 构建新的 Centos 镜像并运行起来。

编写 Dockerfile 文件

1
2
3
4
5
6
7
8
9
10
FROM centos

MAINTAINER peter<peter@gmail.com>

ENV work_path /usr/local
WORKDIR $work_path

RUN yum -y update && yum -y install vim net-tools

CMD /bin/bash
阅读全文 »
0%