我正在参加「掘金·启航计划」
搭建docker、gitlab、sonar、jenkins、nginx、mysql、redis、rabbitmq过程
第一步:centos7
VMware® Workstation
Centos 7
https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso
设置网络,最小化Centos7安装后一般没有开启网络
1)查看网卡
[root@localhost ~]# ip a
2)修改网卡参数
ONBOOT=no改成yes
[root@localhost ~]# sed -i 's|ONBOOT=no|ONBOOT=yes|g' /etc/sysconfig/network-scripts/ifcfg-enp0s3
3)重启网卡服务
[root@localhost ~]# systemctl restart network
2丶开启自动获取动态IP地址
1)修改网卡参数
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static #改成静态模式
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s3
UUID=dcbf623d-ea0d-41e3-8062-f147336c0f04
DEVICE=enp0s3
ONBOOT=yes #开启网卡
IPADDR=192.168.3.8 #静态IP
GATEWAY=192.168.3.1 #网关IP
NETMASK=255.255.255.0 #子网掩码
DNS1=114.114.114.114 #首先DNS地址
Centos7软件的镜像设置清华源
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://mirror.centos.org|baseurl=https://mirrors.tuna.tsinghua.edu.cn|g' \
-i.bak \
/etc/yum.repos.d/CentOS-*.repo
最后,更新软件包缓存
yum makecache
设置DNS
DNS配置增加,要重启reboot
# vi /etc/resolv.conf
nameserver 114.114.114.114
nameserver 114.114.114.115
第二步:docker
一、docker 安装
参考地址 https://docs.docker.com/engine/install/centos/#install-using-the-repository
1、Set up the repository
#配置主机名:
hostnamectl set-hostname zy-nph-skg-dev-k8s-master01 && bash
#关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
#安装 iptables
yum install iptables-services -y
#禁用 iptables
service iptables stop && systemctl disable iptables
#关闭 selinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#安装基础软件包
yum install -y wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack yum-utils
#配置 docker-ce 国内 yum 源(阿里云)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
遇到问题
执行yum安装命令式报如下错误,解决办法通过强制关掉yum进程。
Loaded plugins: fastestmirror, refresh-packagekit, security
Existing lock /var/run/yum.pid: another copy is running as pid 2922.
Another app is currently holding the yum lock; waiting for it to exit...
The other application is: PackageKit
Memory : 52 M RSS (908 MB VSZ)
Started: Fri Sep 14 01:41:58 2018 - 01:58 ago
State : Sleeping, pid: 2922
实现方式如下,然后重新使用yum安装:
#rm -f /var/run/yum.pid
记一次执行yum命令报错:Could not retrieve mirrorlist http://mirrorlist.centos.org/
DNS配置增加,要重启reboot
# vi /etc/resolv.conf
nameserver 114.114.114.114
nameserver 114.114.114.115
2、Install Docker Engine
#安装 docker 依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
#安装 docker-ce
yum install docker-ce docker-ce-cli containerd.io
遇到问题
安装过程中,会询问是否继续安装某些工具,输入y回车就行
3、设置开机启动
systemctl enable docker
4、Start Docker
systemctl start docker
5、Test
docker run hello-world
6、harbor 不能用http解决,192.168.1.100:5000是Harbor服务器地址
在客户机”/etc/docker/“目录下,创建”daemon.json“文件。在文件中写入:
{ "insecure-registries":["192.168.1.100:5000"] }
二、docker 语法介绍
https://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
常用命令
docker pull [image] 拉取镜像
docker images 查看所有镜像
docker ps 查看正在运行的容器
docker ps -a 查看所有容器,包括停止的容器
docker containre rm [containerID] 移除容器
docker container start [containerID] 启动容器
docker container stop [containerID] 停止容器
docker container restart [containerID] 重启容器
docker container update --restart=always [containerID] 更新容器增加restart
docker container exec -it [containerID] /bin/bash 进入容器且启动shell
docker exec -it --user root [containerID] bash 用root进入容器shell
docker container cp [containID]:[/path/to/file] /path/to/file 从正在运行的 Docker 容器里面,将文件拷贝到本机,两路径可交换
docker run -d --restart always -p 10240:8080 -p 10241:50000 -v /var/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime --name myjenkins jenkins/jenkins 运行jenkins容器,如果没有回下载镜像再安装容器,-d 后台运行 -p 端口映射 -v 目录挂载 --name 设置容器名称
第三步:gitlab
参考地址 https://docs.gitlab.com/ee/install/docker.html#install-gitlab-using-docker-engine
1、Install GitLab using Docker Engine 社区版
sudo docker run --detach \
--publish 44301:443 --publish 36001:80 --publish 2201:22 \
--name gitlab \
--restart always \
--volume $GITLAB_HOME/config:/etc/gitlab \
--volume $GITLAB_HOME/logs:/var/log/gitlab \
--volume $GITLAB_HOME/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
2、等等gitlab启动成功,访问地址 192.168.1.10:36001
这个启动非常耗cpu,冲到90%,可能服务器卡死
docker ps可以看到STATUS是 heathing: starting,等待变成 heathy才行,
如果长时间没启动成功,或者报错,可能是这三个volume 目录映射没有权限,可去掉这三个volume ,学会查看日志 docker logs gitlab
cpu过高问题 https://www.cnblogs.com/51core/articles/15305816.html
gitlab非常耗内存,如果少于700M可用内存,看是否要清楚缓存内存占用
free -m 命令查询当前内存使用情况,单位M
echo 1 > /proc/sys/vm/drop_caches :表示清除pagecache。
echo 2 > /proc/sys/vm/drop_caches :表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
echo 3 > /proc/sys/vm/drop_caches :表示清除pagecache和slab分配器中的缓存对象。
3、获取root初始密码,这里获取的密码如果不能登录gitlab,直接用第三步重置root密码
注意:The password file will be automatically deleted in the first reconfigure run after 24 hours.
sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
web界面首次修改root密码
右上角 -> Edit profile -> password
4、reset password
sudo docker exec -it gitlab bash
sudo gitlab-rake "gitlab:password:reset"
5、修改gitllab显示的clone地址,不然是一串数字乱码
docker exec -it -u root gitlab bash
vi /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
修改地址 host: 192.168.1.10
gitlab-ctl restart
第四步:nginx
参考地址 https://www.runoob.com/docker/docker-install-nginx.html
安装
sudo mkdir -p /home/nginx/www
sudo docker run --restart always --name nginx -p 80:80 -v /home/nginx/www:/usr/share/nginx/html -d nginx
挂载到/home/nginx/www目录的目的是,后面jenkins发布dist文件用ssh直接推到这个目录就行了 访问 http://192.168.162.129/ 可以看到 Welcome to nginx!
可选:安装ngrok做内网穿透
拉取 wernight/ngrok
docker pull wernight/ngrok
后台运行ngrok指向ngxin 80端口,authtoken 要先去 dashboard.ngrok.com/get-started… 官网注册获取
如果代理到nginx镜像
docker run -d -p 4040 --name www_ngrok --link nginx wernight/ngrok ngrok http nginx:80 --authtoken 24GP7iKlsqGYDwh0QjjqcoviMws_6SQujd8xWkhB2oSVQd2Yk
如果代理到服务端口,公网ip:端口
docker run -it -d -p 4040 --name www_ngrok ngrok/ngrok http 175.178.1.249:3000 --authtoken 24GP7iKlsqGYDwh0QjjqcoviMws_6SQujd8xWkhB2oSVQd2Yk
显示穿透域名,外网便可直接访问
curl $(docker port www_ngrok 4040)/api/tunnels
第三步报错 Error: No public port '4040/tcp' published for www_ngrok,则换可用authtoken
24GP7iKlsqGYDwh0QjjqcoviMws_6SQujd8xWkhB2oSVQd2Yk
24HJkjwss1uvgmvSvXRMSFwsofF_55AaiQuiYWdeTnCFgzYji
第三步报错 curl: (3) Bad URL, colon is first character
docker port www_ngrok 4040
// 用上句显示的端口49167
curl http://127.0.0.1:49167/api/tunnels
第五步:sonar
参考地址 https://www.jianshu.com/p/e0883f347901
1、安装
sudo docker run -d --restart always --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 sonarqube:8.9.2-community
注意 初始账号admin密码admin 访问网址如192.168.162.129:9000 需要等待一段时间服务启动
2、建一个项目,后面jenkins用
#sonarqube服务器地址
sonar.host.url=http://192.168.162.129:9000/
#sonarqube token
sonar.login=fc3486ae08da99f0735bfb241b888f68d736d55e
#项目唯一标识
sonar.projectKey=myvue1
#项目名称
sonar.projectName=myvue1
#源代码目录
sonar.sources=src
#语言
sonar.language=js
#源代码文件编码
sonar.sourceEncoding=UTF-8
#忽略目录(非自身项目代码)
# sonar.exclusions=src/components/**
第六步:jenkins
1、安装
参考地址 https://www.cnblogs.com/fuzongle/p/12834080.html
chmod 777 /var/run/docker.sock
mkdir -p /var/jenkins_home
chmod 777 /var/jenkins_home
docker run -d --restart always -p 10240:8080 -p 10241:50000 -v /var/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime --name jenkins jenkins/jenkins
2、安装镜像加速
修改文件 vi /var/jenkins_home/hudson.model.UpdateCenter.xml
将url改为 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
3、获取默认admin初始密码 访问网站 http://192.168.162.129:10240/,云平台注意打开防火墙端口10240
cat /var/jenkins_home/secrets/initialAdminPassword
4、点击安装推荐的插件按钮即可
第七步:搭建自动化构建
1、安装插件(nodejs、sonarqube scanner、Publish Over SSH) 图片
地址 http://192.168.162.129:10240/pluginManager/available
Manage Jenkins(管理jenkins) -> 插件管理 -> 可用插件 -> nodejs
2、全局配置node版本 图片
地址 http://192.168.162.129:10240/configureTools/
Manage Jenkins(管理jenkins) -> (global tool confirguation)全局工具配置 -> nodejs
3、配置sonar服务器 图片
地址 http://192.168.162.129:10240/configure
Manage Jenkins(管理jenkins) -> (confirguation system)配置系统 -> SonarQube servers
4、配置jenkins关联sonarqube scanner 图片
地址 http://192.168.162.129:10240/configureTools/
Manage Jenkins(管理jenkins) -> (global tool confirguation)全局工具配置 -> SonarQube Scanner
5、配置SSH服务 图片
地址 http://192.168.162.129:10240/configure
Manage Jenkins(管理jenkins) -> (confirguation system)配置系统 -> Publish over SSH -> SSH Servers
配置完点一下Test Configuration看通不通
6、发布项目
1、新自由风格空项目
2、git源码配置
3、勾选构建环境 -> Add timestamps to the Console Output
4、勾选构建环境 -> Provide Node & npm bin/ folder to PATH ,勾选就好了,其他不用动
4、sonar信息配置 图片 构建 -> 新增Execute SonarQube Scanner -> Analysis properties 其他不用填
#sonarqube服务器地址
sonar.host.url=http://192.168.162.129:9000/
#sonarqube token
sonar.login=fc3486ae08da99f0735bfb241b888f68d736d55e
#项目唯一标识
sonar.projectKey=myvue1
#项目名称
sonar.projectName=myvue1
#源代码目录
sonar.sources=src
#语言
sonar.language=js
#源代码文件编码
sonar.sourceEncoding=UTF-8
#忽略目录(非自身项目代码)
# sonar.exclusions=src/components/**
5、node信息配置 图片 构建 -> 新增执行shell
npm install --registry https://registry.npm.taobao.org/
npm run build
cd dist
tar -cvf dist.tar ./
6、SSH发送到nginx
构建后操作 -> 新增Send build artifacts over SSH
Source files填 dist/dist.tar
Remove prefix填 dist/
Remote directory填 ./
Exec command填
cd /home/nginx/www
tar -xvf dist.tar
rm -rf dist.tar
7、到项目myvue1点击立即构建 遇到问题
1、解决Unpacking https://nodejs.org/dist/v16.9.1/node-v16.9.1-linux-x64.tar.gz to /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/nodejs16.9.1 on Jenkins
[图片](https://user-images.githubusercontent.com/82021554/134309505-354257b1-cb6f-4a19-ad0e-81d1ae23d2c0.png)
参考地址 https://blog.csdn.net/u012075238/article/details/103052201
手动下载node-v16.9.1-linux-x64.tar.gz,上传/var/jenkins_home目录,执行 tar -xzvf node-v16.9.1-linux-x64.tar.gz,会生成/var/jenkins_home/node-v16.9.1-linux-x64目录
2、解决SSH: Transferred 0 file(s)
参考地址 https://www.jianshu.com/p/ef6a4022b7b5
Source files **/* 表示sskzmz这个job的工作目录下所有的文件和目录。
Remove prefix 该操作是针对上面的source files目录,会移除匹配的目录。通常留空。
Remote directory 该操作是基于设定的服务器目录进行。这里我的服务器配置是的/www. 因此这里应该写sites/sskzmz即可。
Exec command 远程服务器执行的命令。例如可以输出 service nginx restart 或者/www/xx. sh 均可。
重点一: source files 要基于任务的目录进行。不支持绝对路径。如果配置不对,则找不到文件。上例中/var/jenkins_home/workspace/sskzmz 是任务目录。最终jenkins会选择 /var/jenkins_home/workspace/sskzmz/**/* 查询所要传送的文件。
重点二: Remote directory 要基于你远程服务器的目录配置。你远程服务器配置的基准是/www 。则最终的文件目录是 /www+ Remote directory的配置参数。不支持绝对路径。
3、虚拟机重启后 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?服务没开启
su root # 先切换到root用户, 再执行以下命令
systemctl enable docker # 开机自动启动docker
systemctl start docker # 启动docker
4、虚拟机重启后 没有ip了
执行 ifconfig 发现多了docker0,虚拟机保持NAT链接
执行
ifconfig docker0 down
service network restart
关闭虚拟机,重新启动,或许就好了
追加内容
第八步:搭建Harbor
安装docker-compose
下载docker-compose
curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
查看下载好的包
ls /usr/local/bin/
修改执行权限
chmod +x /usr/local/bin/docker-compose
软连接映射到/usr/bin/
ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose
验证
which docker-compose
安装harbor
yum install -y wget
wget https://github.com/goharbor/harbor/releases/download/v2.5.0/harbor-online-installer-v2.5.0.tgz
解压harbor安装包
tar xf harbor-online-installer-v2.5.0.tgz -C /data/app/
编辑harbor.yml文件
cd /data/app/harbor
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
hostname: harbor01.k8s.com #主机IP/或者域名
harbor_admin_password: Harbor12345 #harbor UI界面admin登陆密码
data_volume: /data/app/harbor-data #harbor 持久化数据
#关闭https(把以下的行都注释掉12-18行)
# https related config
#https:
# # https port for harbor, default is 443
# port: 443
# # The path of cert and key files for nginx
# certificate: /your/certificate/path
# private_key: /your/private/key/p
运行./install.sh安装脚本 ./install.sh
### 配置harbor开机自启动
1)编写启动脚本
vim /data/app/harbor/startall.sh
#!/bin/bash
cd /data/app/harbor
docker-compose stop && docker-compose start
2)赋予执行权限
chmod +x /data/app/harbor/startall.sh
3)把启动脚本加到系统启动之后最后一个执行的文件
echo "/bin/bash /data/app/harbor/startall.sh" >>/etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local