總體流程
安裝Docker
- 下載docker-ce的repo
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
- 安裝依賴
yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm
ps:containerd版本過低,無法安裝docker,所以此處是升級containerd的
- 安裝docker-ce
yum install docker-ce
- 啟動docker
systemctl start docker
#開機自動啟動
# systemctl enable docker
- 設置國內源
vi /etc/docker/daemon.json
"registry-mirrors": [
"https://1nj0zren.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn",
"http://f1361db2.m.daocloud.io", "https://registry.docker-cn.com"]
- 重啟
sudo systemctl daemon-reload
sudo systemctl restart docker
安裝Portainer
介紹一款docker可視化界面portainer,可以方便的查看啟動刪除停止容器,也可以管理鏡像
docker pull portainer/portainer
docker run -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -d portainer/portainer
安裝Jenkins
docker pull jenkinsci/blueocean
docker run -d --name jenkins -p 9001:8080 -p 50000:50000 --env PATH=/usr/share/maven/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin -v /var/run/docker.sock:/var/run/docker.sock -v /dockerworkspace/jenkins:/var/jenkins_home -v /opt/maven:/usr/share/maven -v /etc/localtime:/etc/localtime jenkinsci/blueocean
Ps:
jenkins插件清華大學鏡像地址
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json-
可能會出現java.net.UnknownHostException,困擾了我很久,百度搜出來的答案都不靠譜??戳艘黄恼抡f有可能是防火墻沒關。關閉防火墻,重啟立馬好了。。坑啊
systemctl status firewalld.service 查看防火墻狀態 systemctl stop firewalld.service 執行停止運行防火墻命令 systemctl disable firewalld.service 禁止防火墻自啟動
防火墻的開啟和自啟動命令:
1、啟動:
systemctl start firewalld.service
2、防火墻隨系統開啟啟動 :
systemctl enable firewalld.service
-
報錯:
touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
需要修改下目錄權限, 因為當映射本地數據卷時,/home/docker/jenkins目錄的擁有者為root用戶,而容器中jenkins user的uid為1000
sudo chown -R 1000:1000 /dockerworkspace/jenkins
8080端口是jenkins的端口,5000端口是master和slave通信端口
-
jenkin調用docker沒有權限時
chmod 666 /var/run/docker.sock
clock of the subversion server appears to be out of sync. This can result in inconsistent check out behavior.
svn url末尾添加@HEAD
安裝Maven
-
下載
wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
-
解壓
tar xf /tmp/apache-maven-*.tar.gz -C /opt
-
設置環境變量(此處采用的dockerhub的jenkins,所以可以省略)
nano /etc/profile.d/maven.sh
粘貼以下代碼:
export JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk export MAVEN_HOME=/usr/opt/maven export PATH=${MAVEN_HOME}/bin:${PATH}
為了更好地控制 Maven 版本和更新,我們將 創建一個符號鏈接 maven ,該鏈接指向 Maven 安裝目錄:
ln -s /opt/apache-maven-3.6.3 /opt/maven
通過運行以下 chmod 命令使腳本可執行
chmod +x /etc/profile.d/maven.sh
使用以下 source 命令加載環境變量:
source /etc/profile.d/maven.sh
-
構建Maven多模塊項目
配置一個maven風格的項目 然后在配置
root pom 指向的是最頂級的pom.xml
mvn clean install -pl ETECSA-SERVER/ETECSA-SERVER-EUREKA -am -amd -Dmaven.test.skip=true
這樣就單獨構建ETECSA-SERVER-EUREKA這個jar,相關依賴也會構建好,不用將依賴提前放入maven倉庫
根據資料已知:
參數 全稱 釋義 說明 -pl --projects Build specified reactor projects instead of all projects 選項后可跟隨{groupId}:{artifactId}或者所選模塊的相對路徑(多個模塊以逗號分隔) -am --also-make If project list is specified, also build projects required by the list 表示同時處理選定模塊所依賴的模塊 - amd --also-make-dependents If project list is specified, also build projects that depend on projects on the list 表示同時處理依賴選定模塊的模塊 -N --Non-recursive Build projects without recursive 表示不遞歸子模塊 -rf --resume-from Resume reactor from specified project 表示從指定模塊開始繼續處理
Ps:
permission denied異常
解決方法:
將jenkins用戶加入docker組,重啟Jenkins服務
sudo gpasswd -a jenkins docker
sudo systemctl jenkins restart
搭建私有鏡像倉庫Harbor
-
下載
wget -P /workspace/harbor/ https://github.com/vmware/harbor/releases/download/v1.10.2/harbor-online-installer-v1.10.2.tgz
-
解壓
tar zxf harbor-online-installer-v1.10.2.tgz
修改配置文件,配置文件為:harbor.yml
-
進入harbor目錄下,運行腳本
./install.sh
-
安裝docker-compose
#國內鏡像 curl -L "https://get.daocloud.io/docker/compose/releases/download/v1.25.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
-
給docker-compose執行權限,運行命令:
chmod +x /usr/local/bin/docker-compose
-
測試上傳和下載鏡像,修改各docker client配置
nano /etc/docker/daemon.json
"insecure-registries":["10.1.20.16:9002"]
Ps:docker 官方私有倉庫鏡像register
docker pull registry
docker run -d -v /opt/registry:/var/lib/registry -p 9001:5000 --restart=always --name registry registry:latest
Jenkins Pipe腳本示例(拉取svn代碼build image push到鏡像倉庫)
def getHost(ip){
def remote = [:]
remote.name = 'server-${ip}'
remote.host = ip
remote.port = 22
remote.allowAnyHosts = true
withCredentials([usernamePassword(credentialsId: '31ed3f9c-3e80-496d-9733-98b78db29128', passwordVariable: 'password', usernameVariable: 'userName')]) {
remote.user = "${userName}"
remote.password = "${password}"
}
return remote
}
def imageName="10.1.20.16:9002/hn/demo:v1.0.0"
def prjName="demo"
pipeline {
agent any
environment{
def server = ''
}
stages {
stage('init-server'){
steps {
script {
server = getHost("1.10.80.2")
}
}
}
stage('Build') {
steps {
echo '拉取代碼'
checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[cancelProcessOnExternalsFail: true, credentialsId: '2d3c4a0b-1bba-4690-b208-3a511fc4f415', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'svn://10.1.80.111/ETECSA-SERVER']], quietOperation: true, workspaceUpdater: [$class: 'UpdateUpdater']])
withMaven(maven: 'maven', mavenSettingsConfig: '3f3f6844-0644-48a3-8c4f-cef8f4e75196') {
sh label: '', script: 'mvn clean install -pl ETECSA-SERVER-EUREKA -amd -Dmaven.test.skip=true'
}
}
}
stage('DockerBuild') {
steps {
dir ("ETECSA-SERVER-EUREKA/") {
script {
def image = docker.build("hn/demo:v1.0.0")
docker.withRegistry("http://10.1.20.16:9002", '67bbae3e-a0da-4c30-9357-eec4a146cc2e'){
image.push()
}
}
}
}
}
stage('use'){
steps {
script {
sshCommand remote: server, command: """
if [ \$(docker ps -a | grep -i $imageName | wc -l) -eq 1 ]; then
sudo docker stop $prjName
sudo docker rm -v -f $prjName
fi
if [ \$(docker images | grep -i $imageName | wc -l) -eq 1 ]; then
sudo docker rmi -f $imageName
else
sudo docker run -p 8761:8761 --name $prjName -d $imageName
fi
"""
}
}
}
stage('clean') {
steps{
sh label: '', script: '''
docker rmi -f hn/demo:v1.0.0
docker rmi -f 10.1.20.16:9002/hn/demo:v1.0.0'''
}
}
}
}
jenkins build日志如下
其他手動部署方式
- docker-compose部署服務
有三種方式:webEditor,上傳docker-compose文件,git倉庫獲取docker-compose
點擊部署
- docker容器部署
- 命令行部署
docker run -p 8761:8761 --name demo -d 10.1.20.16:9002/hn/demo:v1.0.0
虛擬機IP 變動解決方法
進入到/etc/sysconfig/network-scripts
目錄下面ls后有個文檔(我的是ifcfg-ens33) ifcfg-eno16777736(不同機器后面數字會不相同),編輯該文件內容,將BOOTPROTO=dhcp的值改為static
并在最后面加上:
DNS1=114.114.114.114 --dns地址
IPADDR=192.168.49.128 --需要設置的ip地址
NETMASK=255.255.255.0 --子網掩碼
GATEWAY=192.168.49.1 --網關
nmcli c reload