gitlab+Jenkins容器化

容器安装

harbor 80
jenkins 8080
gitlab 9090

Jenkins容器化

1.下载镜像

2.运行镜像

3.如何jenkins里运行jenkins

# 创建用户
useradd  -u 1000 jenkins -M -s /sbin/nologin
运行容器
docker run -itd \
--name="jenkins" \
--privileged=true \
--user root \
-p 8080:8080 \
-p 50000:50000 \
-v /data/jenkins:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /root/.ssh:/root/.ssh \
jenkins/jenkins

安装插件

# 解压压缩包没有就网页安装
tar xf jenkins_plugins.tar.gz plugins
cd plugins/
mv ./* /data/jenkins/plugins/
chown -R jenkins:jenkins /data/jenkins/plugins/*
docker restart jenkins 

gitlab容器化

1.下载镜像

docker run --detach \
  --publish 9090:80 --publish 2222:22 \
  --name gitlab \
  --restart always \
  --volume /data/gitlab/config:/etc/gitlab \
  --volume /data/gitlab/logs:/var/log/gitlab \
  --volume /data/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce:latest

部署命令+三个坑

三个坑
1.开启gitlab不知道密码

docker exec -it gitlab /bin/bash
gitlab-rails console
user = User.where(username: 'root').first
user.password = 'admin-123'
user.save!
exit

2.添加了公钥,克隆代码还是需要密码,需要=修改配置文件

#1. 启动后修改配置文件
cd /data/gitlab/config
# 先备份文件
cp gitlab.rb /opt/
vim gitlab.rb
:/external_url
external_url 'http://10.0.0.11'
:/gitlab_rails
gitlab_rails['gitlab_shell_ssh_port'] = 2222

docker exec -it gitlab /bin/bash
gitlab-ctl reconfigure

#2. 启动时加参数
version: '3.6'
services:
  gitlab:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'gitlab.example.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://10.0.0.11'
        gitlab_rails['gitlab_shell_ssh_port'] = 2222
        prometheus['enable'] = false
        alertmanager['enable'] = false
        node_exporter['enable'] = false
        grafana['enable'] = false
        redis_exporter['enable'] = false
        postgres_exporter['enable'] = false
        pgbouncer_exporter['enable'] = false
        gitlab_exporter['enable'] = false
    ports:
      - '9090:80'
      - '2222:22'
    volumes:
      - '/data/gitlab/config:/etc/gitlab'
      - '/data/gitlab/logs:/var/log/gitlab'
      - '/data/gitlab/data:/var/opt/gitlab'

3.优化不需要的启动服务,需要需要修改配置文件

docker exec -it gitlab /bin/bash
gitlab-ctl status

cd /data/gitlab/config
vim gitlab.rb
external_url 'http://10.0.0.11'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
prometheus['enable'] = false
alertmanager['enable'] = false
node_exporter['enable'] = false
grafana['enable'] = false
redis_exporter['enable'] = false
postgres_exporter['enable'] = false
pgbouncer_exporter['enable'] = false
gitlab_exporter['enable'] = false

docker exec -it gitlab /bin/bash
gitlab-ctl reconfigure

4.公钥key写谁的?

docker run -itd \
--name="jenkins" \
--privileged=true \
--user root \
--restart always \
-p 8080:8080 \
-p 50000:50000 \
-v /data/jenkins:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /root/.ssh:/root/.ssh \
jenkins/jenkins

# jenkins-compose
version: '3'
services:
  jenkins:
    image: 'jenkins/jenkins:latest'
    restart: always
    privileged: true
    user: root   
    ports:
      - '8080:8080'
      - '50000:50000'
    volumes:
      - '/var/run/docker.sock:/var/run/docker.sock'
      - '/usr/bin/docker:/usr/bin/docker'
      - '/root/.ssh:/root/.ssh'
      - '/data/jenkins:/var/jenkins_home'

最终版本

version: '3'
services:
  jenkins:
    image: 'jenkins/jenkins:latest'
    restart: always
    privileged: true
    user: root   
    ports:
      - '8080:8080'
      - '50000:50000'
    volumes:
      - '/var/run/docker.sock:/var/run/docker.sock'
      - '/usr/bin/docker:/usr/bin/docker'
      - '/root/.ssh:/root/.ssh'
      - '/data/jenkins:/var/jenkins_home'
      - '/root/.docker/:/root/.docker'
      - '/etc/docker/daemon.json:/etc/docker/daemon.json'
  gitlab:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'gitlab.example.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://10.0.0.11'
        gitlab_rails['gitlab_shell_ssh_port'] = 2222
        prometheus['enable'] = false
        alertmanager['enable'] = false
        node_exporter['enable'] = false
        grafana['enable'] = false
        redis_exporter['enable'] = false
        postgres_exporter['enable'] = false
        pgbouncer_exporter['enable'] = false
        gitlab_exporter['enable'] = false
    ports:
      - '9090:80'
      - '2222:22'
    volumes:
      - '/data/gitlab/config:/etc/gitlab'
      - '/data/gitlab/logs:/var/log/gitlab'
      - '/data/gitlab/data:/var/opt/gitlab'
      
      
      
docker exec -it gitlab /bin/bash
gitlab-rails console
user = User.where(username: 'root').first
user.password = 'admin-123'
user.save!
exit

容器运用

jenkins搭配gitlab操作

1.拉去代码

git clone ssh://git@10.0.0.11:2222/root/demo.git

2.打包代码

docker exec -it jenkins /bin/bash
cd /var/jenkins_home/workspace/项目名

tar zcvf code.tar.gz *

3.编写dockerfile

cat > Dockerfile << EOF
FROM nginx:latest
ADD code.tar.gz /usr/share/nginx/html/
EOF

4.构建镜像

docker build -t /linux6/nginx:v1 .

5.推送镜像

docker push 10.0.0.11/linux6/nginx:v1

宿主机11:

docker run -itd -p 9999:80 nginx:v1 -d

5.推送到harbor

安装harbor

# docker11操作
第一步:安装docker和docker-compose
yum install -y docker-compose
docker-compose version

第二步:下载 harbor-offline-installer-v1.9.0-rc1.tgz
 
cat > /etc/docker/daemon.json << 'EOF'
{
    "registry-mirrors": ["http://hub-mirror.c.163.com"],
    "insecure-registries": ["http://10.0.0.11"]
}
EOF
tar zxf harbor-offline-installer-v1.9.0-rc1.tgz -C /opt/
cd /opt/harbor
vim harbor.yml 
-------
5:hostname: 10.0.0.11
27:harbor_admin_password: 123 
-------

# 启动命令
./install.sh 


vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd://  $DOCKER_NETWORK_OPTIONS

# docker11
[root@docker-11 ~]# systemctl daemon-reload 
[root@docker-11 ~]# cd /opt/harbor/
[root@docker-11 harbor]# docker-compose stop
systemctl restart docker
docker login 10.0.0.11

 $DOCKER_NETWORK_OPTIONS

# 测试
[root@docker-11 harbor]# docker tag nginx:v1 10.0.0.11/linux6/nginx:v1
[root@docker-11 harbor]# docker push 10.0.0.11/linux6/nginx:v1

root@docker-12[11:41:13]:~
> docker pull 10.0.0.11/linux6/nginx:v1
docker run --name app -it -p 80:80 -d 10.0.0.11/linux6/nginx:v1

6.远程拉取镜像

特别注意:jenkins的*/master分区因为美国~歧视问题改成了*/main
# 首先得配ssh
[root@docker-11 harbor]# ssh-copy-id 10.0.0.12
# jenkins上操作
ssh 10.0.0.12 docker pull 10.0.0.11/linux6/nginx:v1

7.远程停止旧容器并删除

ssh 10.0.0.12 docker stop app
ssh 10.0.0.12 docker rm app

8.远程启动新容器

# 启动命令
docker run --name app -it -p 80:80 -d 10.0.0.11/linux6/nginx:v1

简单的deploy_en脚本

# 1.打包代码
code_tar(){
  tar zcvf code.tar.gz *
}

# 2.编写dockerfile
docker_file(){
cat > Dockerfile << EOF
FROM nginx:latest
ADD code.tar.gz /usr/share/nginx/html/
EOF
}

# 3.构建镜像
docker_build(){
  docker build -t 10.0.0.11/linux6/nginx:$git_version .
}

# 4.推送镜像
docker_push(){
  docker push 10.0.0.11/linux6/nginx:$git_version
}

# 5.远程拉取镜像
docker_pull(){
  ssh 10.0.0.12 docker pull 10.0.0.11/linux6/nginx:$git_version
}

# 6.停止容器
docker_stop(){
  ssh 10.0.0.12 docker stop app
}

# 7.删除容器
docker_rm(){
  ssh 10.0.0.12 docker rm app
}

# 9.启动新的容器
docker_run(){
  ssh 10.0.0.12 docker run --name app -it -p 80:80 -d 10.0.0.11/linux6/nginx:$git_version
}

# 发布逻辑
if [ "$deploy_env" == "deploy" ]
then
  code_tar
  docker_file
  docker_build
  docker_push
  docker_pull
  docker_stop
  docker_rm
  docker_run
else
  docker_stop
  docker_rm
  docker_run
fi


###  !!!!!容器要连接harbor 不然会推送失败
root@docker-11[00:03:44]:~
> docker exec -it 8f0cfb884db8 /bin/bash
root@8f0cfb884db8:/# docker login 10.0.0.11

###


chmod +x /root/deploy_env.sh 
[jenkins---ID]
docker cp /root/deploy_env.sh 8f0cfb884db8:/root/

pipeline脚本

pipeline {
    agent any
    parameters {
        gitParameter name: 'git_version', 
                     branchFilter: 'origin/(.*)',
                     type: 'PT_TAG',
                     defaultValue: 'v1.0',
                     description: '发布新版本'
        choice(name: 'base_image', choices: ['nginx:1.17','nginx:1.18'],description: '请选择基础镜像版本')
        choice(name: 'deploy_env', choices: ['deploy','rollback'],description: 'deploy: 发布版本\nrollback: 回滚版本')               
    }
    stages {
        stage('拉取代码'){
            steps {
                  checkout([$class: 'GitSCM', 
                                     branches: [[name: '${git_version}']], 
				                     doGenerateSubmoduleConfigurations: false, 
                                     extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'game']],				  
				                     submoduleCfg: [], 
				                     userRemoteConfigs: [[credentialsId: 'e66c4757-c002-4f21-9102-dfd342d9d667', 
				                     url: 'ssh://git@10.0.0.11:2222/root/game.git']]])
            }
        }
        stage("编译镜像"){
            steps{
                writeFile file: "Dockerfile", text: """FROM 10.0.0.11:8888/base_image/${params.base_image}\nADD game /usr/share/nginx/html/"""
            } 
        }
		stage('上传镜像'){
            steps {
                sh "docker build -t 10.0.0.11:8888/linux5/game:${params.git_version} . && docker push 10.0.0.11:8888/linux5/game:${params.git_version}"
            }
        }
		stage('部署容器'){
            steps {
                sh 'ssh 10.0.0.7 "docker pull 10.0.0.11:8888/linux5/game:${git_version} && docker stop game && docker rm game && docker run --name game -p 80:80 -d 10.0.0.11:8888/linux5/game:${git_version} && docker ps"'
            }
        }
        stage("清理构建镜像"){
            steps{
                sh "docker rmi 10.0.0.11:8888/linux5/game:${params.git_version}"
            }
        }
	}
}

posted @ 2022-05-30 12:31  hai起奈  阅读(55)  评论(0编辑  收藏  举报