注意:这里仅为了快速跑通流程,未使用参数化构建,只是用最简单的功能来演示jenkins打包docker镜像,实现打包上传docker镜像到harbor仓库。生产环境根据自己公司的特点选择特定的构建方法。
说明: docker build -t 192.168.1.139/opstest/mytardis:1.5 . 这里的192.168.1.139/opstest/mytardis:1.5替换为你的仓库与项目、对应版本,版本号可以通过参数传递 docker push 192.168.1.139/opstest/mytardis:1.5 这里的将新构建的镜像上传到harbor仓库
- 修改jenkins的附加组,jenkins构建image时需要连接docker服务。(没有权限构建时会报错:permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post )
[root@zb-192-168-1-139 ~]# usermod -a -G docker jenkins
[root@zb-192-168-1-139 ~]# id jenkins
uid=998(jenkins) gid=994(jenkins) groups=994(jenkins),995(docker)
- 通过root用户登陆harbor,将登陆后的配置文件传给jenkins,这样jenkins能够登陆harbor
[root@zb-192-168-1-139 ~]# docker login http://192.168.1.139
[root@zb-192-168-1-139 ~]# cp .docker/config.json /var/lib/jenkins/.docker/
[root@zb-192-168-1-139 ~]# chown jenkins.jenkins /var/lib/jenkins/.docker/config.json
- 确保你用来测试构建image的demo包含以下文件(如果你的项目是java请根据自己的情况决定。):
[root@zb-192-168-1-139 opstest]# pwd
/var/lib/jenkins/workspace/opstest
[root@zb-192-168-1-139 opstest]# ls
Dockerfile manage.py opstest pip.conf __pycache__ requirements.txt run.sh
[root@zb-192-168-1-139 opstest]# cat Dockerfile
FROM python:3.7
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY pip.conf /root/.pip/pip.conf
COPY requirements.txt /usr/src/app/
RUN pip install -r /usr/src/app/requirements.txt
RUN rm -rf /usr/src/app
COPY . /usr/src/app
CMD ["/bin/bash","run.sh"]
[root@zb-192-168-1-139 opstest]# cat pip.conf
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
[root@zb-192-168-1-139 opstest]# cat run.sh
#!/bin/bash
python manage.py makemigrations
python manage.py migrate
python manage.py runserver 0.0.0.0:8000
[root@zb-192-168-1-139 opstest]# cat requirements.txt
asgiref==3.2.3
Django==3.0.1
mysqlclient==1.4.6
pymssql==2.1.4
pytz==2019.3
sqlparse==0.3.0
[root@zb-192-168-1-139 opstest]# cat opstest/settings.py
...省略部分输出...
ALLOWED_HOSTS = ["*"]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'm******',
'USER': 'my***',
'PASSWORD':'****',
'HOST': '192.168.1.140',
'PORT': '3306',
}
}
...省略部分输出...
# 这个django项目的settings连接数据库的配置我这里已经更改为mysql。并且在k8s集群外安装了mariadb数据库。
查看构建的log:
这里构建已经完成。登陆harbor查看image:
确保你的集群已经都配置了harbor仓库与nginx-ingress(配置daemon.json需要重启systemctl restart docker):
[root@zb-192-168-1-108 ~]# cat /etc/docker/daemon.json
{
"insecure-registries": [
"192.168.1.139"
]
}
[root@zb-192-168-1-139 mytardis-yaml]# cat mytardis-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mytardis-deployment
labels:
app: mytardis
spec:
replicas: 1
selector:
matchLabels:
app: mytardis
template:
metadata:
labels:
app: mytardis
spec:
containers:
- name: mytardis
image: 192.168.1.139/opstest/mytardis:1.5
ports:
- containerPort: 8000
[root@zb-192-168-1-139 mytardis-yaml]# cat mytardis-ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-ingress-for-mytardis
spec:
rules:
- host: www.mytardis.com
http:
paths:
- path: /
backend:
serviceName: mytardis-service
servicePort: 8000
[root@zb-192-168-1-139 mytardis-yaml]# cat mytardis-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mytardis-service
labels:
app: mytardis
spec:
selector:
app: mytardis
ports:
- name: mytardis-port
protocol: TCP
port: 8000
nodePort: 32766
targetPort: 8000
type: NodePort
[root@zb-192-168-1-139 mytardis-yaml]# kubectl apply -f ./
deployment.apps/mytardis-deployment configured
ingress.networking.k8s.io/my-ingress-for-mytardis unchanged
service/mytardis-service unchanged
注意: 因为先前已经测试过,所以ingress与srevice为unchanged。
配置好本机的hosts文件,在浏览器中访问:http://www.mytardis.com/
至此通过jenkins打包jenkins镜像,push到harbor仓库,并且发布到k8s集群的demo流程演示完成。