- Dokcker 中jenkins容器配置发布连接应用服务器
docker安装jenkins
如:192.168.86.129服务器中docker 部署jenkins
>> 1. 拉取镜像 docker pull jenkins/jenkins:2.277.4-lts-centos7
>> 2. 创建容器
docker run -d --name jenkins277 \
-u root \
-v /usr/local/git:/usr/local/git \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /home/xuzhi/softs/maven-3.6.3:/usr/local/maven \
-v /home/xuzhi/softs/jenkins_home:/var/jenkins_home \
-v /home/xuzhi/softs/jdk8u191:/usr/java/jdk1.8.0_191 \
-v /home/xuzhi/softs/jdk8u191/bin/java:/usr/java/jdk1.8.0_191/bin/java \
-p 18988:8080 -p 50000:50000 --restart=always 66b731b6aa3f
注:(1) docker run命令 --rm 命令选项,等价于在容器退出后,执行docker rm
(2) root用户启动 -u root \
>> 3. 查看容器详细信息:
docker inspect meJenkins
curl -s --unix-socket /var/run/docker.sock http:/containers/json
>> 4. 开放端口
firewall-cmd --zone=public --add-port=18988/tcp --permanent
firewall-cmd –reload
>> 5. 进入容器
docker exec -it containerId/name /bin/bash
>> 6. 查看初始密码:
cat /var/lib/jenkins/secrets/initialAdminPassword
>> 7. 修改时区问题,则启动时添加:JAVA_OPTS=-Duser.timezone=Asia/Shanghai
docker run -d --name jenkins \
-v /jenkins_data/:/var/jenkins_home \
-e JENKINS_OPTS="--prefix=/jenkins" JAVA_OPTS=-Duser.timezone=Asia/Shanghai \
-p 8080:8080 -p 18000:8080 66b731b6aa3f
>> 8. systemctl start docker ; docker start containerid ; docker ps | grep Jenkins
>> 9. 查看日志 docker logs Jenkins
>> 10 说明 /var/run/docker.sock
> 等于docker image: curl -s --unix-socket /var/run/docker.sock http:/images/json
> 等于docker ps: curl -s --unix-socket /var/run/docker.sock http:/containers/json
2. 免密登录(登入到jenkins容器中操作)
>> 1. 查看 sshd 是否开启 systemctl status sshd.service
>> 2. 使用 rsa算法加密生成公私钥 ssh-keygen -t rsa
cat id_rsa -> 查看私钥
cat id_rsa.pub -> 查看公钥可用 ssh-copy-id 方式
注: ssh-keygen -t rsa 默认 >>公私钥<< 会保存在~/.ssh目录下
>> 3. Jenkins服务器中的公钥发送到应用服务器命令:ssh-copy-id root@192.168.86.130
>> 4. 应用服务器下 .ssh目录的权限为700 authorized_keys和私钥的权限为600
> 应用服务器(目标服务器)/root/.ssh/下 生成 authorized_keys
> Jenkins所在的服务器(docker容器)的/root/.ssh/下known_hosts文件生成。
chmod 700 .ssh/
chmod 600 authorized_keys
注:否则会有权限问题
>> 5. 使用 ssh 登录远程服务器 如:ssh root@192.168.86.130
[root@localhost .ssh]# ssh root@192.168.86.130
Last login: Wed May 26 16:21:38 2021 from 192.168.86.129
[root@192 ~]#
这样 129 jenkin所在服务器的(docker容器)/root/.ssh/konw_hosts 就会追加:
192.168.86.130 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBH8tuFQJulVX7yBptfaFbIKY1DMzHRaXzhADqiE/LhRFMXsvFGxaAg/+o5vZ4sH0hOfcMlOQPuBGs/PkNTkDcig=
注:(1)docker的jenkins容器需要 docker exec –it 4d18efbae119 /bin/bash 进入到容器中,cd /root/.ssh/下 生成公私钥,以及查看 know_hosts等
(2)jenkins 使用的docker 则上述的免密操作需要在 进入到容器中后进行
注:[root@4d18efbae119 ~] 为 Jenkins 容器内
>> 6. 查看SSH日志: ssh -vT git@localhost
3. 容器常用命令
>> 1. 容器IP: docker inspect 4d18efbae119 --format='{{.NetworkSettings.IPAddress}}'
如:结果: 172.17.0.2
查看所有IP sudo docker inspect -f='{{.NetworkSettings.IPAddress}}' $(sudo docker ps -a -q)
>> 2. 容器名称 sudo docker inspect -f='{{.Name}}' $(sudo docker ps -a -q)
结果:/jenkins277 /newMysql
>> 3. 容器详情 docker inspect 4d18efbae119
>> 4. 暂停容器 docker stop 4d18efbae119
>> 5. 删除镜像 docker rmi imageId
>> 6. 删除容器 docker rm containerId
>> 7. 查看容器的运行状态(不可用)
docker insdocker inspect --format '{{.Name}} {{.State.Running}}' 4d18efbae119
>> 8. 查看进程信息 docker top 4d18efbae119
>> 9. 查看端口号 docker port 4d18efbae119
>> 10. 综合命令
docker inspect -f='{{.Name}} {{.NetworkSettings.IPAddress}} {{.HostConfig.PortBindings}}' $(docker ps -aq)
>> 11. 查看日志 docker logs 容器ID
5. Jenkins 系统设置和全局工具配置
注:公钥是提供出去给 应用服务器的/Gitea/Gitee/GitHup网站中,私钥是jenkins所在服务器,以及jenkins中配置使用
>> 1. 系统配置 -> Publish Over SSH
Passphrase :有私钥并且私钥设置了密码 name填私钥的密码 (生成公钥私钥的时候会设置一个密码一般都是直接回车)
Path to key:私钥的位置
Key :私钥的内容
SSH Servers: 服务器的配置
name : 用户自定义一个容易区分记忆的名字
HostName: 服务器的地址 例如:192.168.86.129
UserName: root 上述服务的登录用户
Remote Directory: / 设置远程服务器的基础目录、具体的目录由具体应用配置
注意:在配置上述内容时,要首先在jenkins服务器上生成私钥,然后将公钥推送到服务器上。
Jenkins 容器: docker exec -it 40966bea34c3 /bin/bash -> 运行时 -u root \
这样测试 sucess
注: 如果不成功 :检查用户是否为 root
>> 2. 全局工具配置
主要是配置 git / jdk / maven ,这个需要jenkins 容器运行时,进行相应的挂载。
docker run -d --name jenkins277 \
-u root \
-v /usr/local/git:/usr/local/git \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /home/xuzhi/softs/maven-3.6.3:/usr/local/maven \
-v /home/xuzhi/softs/jenkins_home:/var/jenkins_home \
-v /home/xuzhi/softs/jdk8u191:/usr/java/jdk1.8.0_191 \
-v /home/xuzhi/softs/jdk8u191/bin/java:/usr/java/jdk1.8.0_191/bin/java \
--rm -p 18988:8080 -p 50000:50000 66b731b6aa3f
Maven 配置:
> 文件系统中的 settings 文件 -> /usr/local/maven/conf/settings.xml
> 新增Maven -> 挂载的 MAVEN_HOME -> /var/jenkins_home
> 新增JDK -> 挂载的 JAVA_HOME -> /usr/java/jdk1.8.0_191
6. 项目配置
执行应用服务脚本:
方式(1)
#!/bin/bash
HOST=192.168.86.130
BUILD_ID=dontKillMe
ssh root@$HOST << EOF
cd /home/xuzhi/work_2021/docket_web/
chmod 777 *.sh
chmod 777 *.jar
sh start.sh
EOF
方式(2)
#!/bin/bash
HOST=192.168.86.130
BUILD_ID=dontKillMe
ssh root@$HOST "cd /work/ && chmod 777 *.sh && chmod 777 *.jar && sh start.sh"
注:这个是执行在 jenkins 所在服务器。
>> Git 仓库地址:git@192.168.86.129:/home/meGitRepo/docket/sx-docket.git
7. 问题
>> 1. jdk8u191 is not a directory on the Jenkins master (but perhaps it exists on some agents) 解决:需要将本地的maven 和 java <挂载> 到 <Jenkins容器>,重新启动安装jenkins:
>> 2. /var/run/docker.sock参数 是什么?
可以直接发http请求到Docker Daemon,获取本地镜像列表
> 等同于docker image: curl -s --unix-socket /var/run/docker.sock http:/images/json
> 等同于docker ps: curl -s --unix-socket /var/run/docker.sock http:/containers/json
8.Docker下jenkins 全局工具配置:
>> 8.1 全局工具配置
注:Jenkins 全局配置GIT,配置服务器的git ,不要使用自动安装的内置的 ,全局工具配置:
Path to Git executable: -> /usr/local/git/bin/git
容器运行示例:
docker run -d --name jenkins277 \
-u root \
-v /usr/local/git:/usr/local/git \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /home/xuzhi/softs/maven-3.6.3:/usr/local/maven \
-v /home/xuzhi/softs/jenkins_home:/var/jenkins_home \
-v /home/xuzhi/softs/jdk8u191:/usr/java/jdk1.8.0_191 \
-v /home/xuzhi/softs/jdk8u191/bin/java:/usr/java/jdk1.8.0_191/bin/java \
-p 18988:8080 -p 50000:50000 --restart=always 66b731b6aa3f
(1) maven的settings -> /usr/local/maven/conf/settings.xml (挂载对应容器中的目录)
(2) JDK 的 Home目录 -> /usr/java/jdk1.8.0_191 (挂载对应容器中的目录)
(3) GIT 的目录 -> /usr/local/git/bin/git (挂载对应容器中的目录)
>> 8.2 系统配置主要是配置连接应用服务器的 SSH 免密或者账号信息 Publish Over SSH 模块、
(1)秘钥方式
(2)用户密码
注:分为两种方式:
- 通过配置公钥和私钥,将私钥粘贴到这里 需要配置jenkins(容器)服务器中的私钥的位置
一般:/root/.ssh/id_rsa
(2)通过用户名密码
Passphrase/Password 填写 上面填写的账号(root)对应的密码。最好用root或者路径权限的用户。
>> 9. 具体项目配置
点击上图中的添加 –> 凭据: SSH Username with private key
这个私钥看的 jenkins(服务器)容器中的私钥,同时相应的公钥部署到GIT的.ssh下的 authorized_keys 文件中。
如:Git证书的创建目录为 /home/git
cd /home/git/ - > ll –a -> cd .ssh -> cat authorized_keys -> 粘贴进去即可
目标: clean package -Dmaven.test.skip=true -Pdocket-web
install -Dmaven.test.skip=true
执行应用服务脚本:
方式(1)
#!/bin/bash
HOST=192.168.86.130
BUILD_ID=dontKillMe
ssh root@$HOST << EOF
cd /home/xuzhi/work_2021/docket_web/
chmod 777 *.sh
chmod 777 *.jar
sh start.sh
EOF
方式(2)
#!/bin/bash
HOST=192.168.86.130
BUILD_ID=dontKillMe
ssh root@$HOST "cd /work/ && chmod 777 *.sh && chmod 777 *.jar && sh start.sh"
注:这个是执行在 jenkins 所在服务器。
执行shell: jenkins和应用服务同机器:
cd /home/xuzhi/work_2021/docket_web
chmod 777 *.sh
BUILD_ID=dontKillMe
bash start-web.sh
注:BUILD_ID=dontKillMe 不加 Jenkins 会关闭所有衍生创建的额进程,导致服务起不来 java –jar 不成功。
>> 10. Git 服务器搭建
>>11. Jenkins 添加钉钉通知
首先安装钉钉插件
系统配置(Configure System)中添加 钉钉
Id 空着 Jenkins会默认生成id ,然后就是 webhook 在钉钉中新增的机器人,
安全策略推荐使用 加密方法 不推荐关键字、这里的 加密 对应 钉钉中的加签
钉钉中机器人:
具体的项目中的配置 勾选 系统配置中的 配置的jenkins即可