[toc]

代码上线图示

传统代码上线

image-20230605155732818

容器化代码上线

image-20230703200947832

容器化代码上线示例

  • 使用docker-compose启动gitlab和jenkins
  • 部署harbor私有镜像仓库
  • Jenkins从Gitlab上拉代码
  • 使用docker部署web页面

环境准备

主机 内网IP 外网IP 应用 环境
docker01 172.16.1.81 10.0.0.81 Gitlab Jenkins docker部署容器
docker02 172.16.1.82 10.0.0.82 Harbor 私有镜像仓库
docker03 172.16.1.83 10.0.0.83 web 部署代码

部署harbor私有镜像仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 下载Harbor
wget https://github.com/goharbor/harbor/releases/download/v2.8.1/harbor-offline-installer-v2.8.1.tgz

# 安装docker-compose
yum install -y docker-compose

# 解压Harbor
tar xf harbor-offline-installer-v1.9.0-rc1.tgz

# 修改harbor中docker-compose文件名
mv /root/harbor/harbor.yml.tmpl /root/harbor/harbor.yml

# 修改docker-compose文件(并注释https配置)
vim harbor.yml
hostname: 10.0.0.81
harbor_admin_password: 123 # admin登陆密码
#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/path

# 安装Harbor并启动
./install.sh

# 已安装,启动Harbor
docker-compose up -d

登陆Harbor页面

image-20230605163041107

新建Jenkins项目

image-20230605163206252

使用docker部署gitlab

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 连接私有镜像仓库
vim /etc/docker/daemon.json
{
"insecure-registries": ["http://10.0.0.82"],
"registry-mirrors": ["https://pgz00k39.mirror.aliyuncs.com"]
}

# 重启docker服务
systemctl restart docker

# 拉取gitlab镜像
docker pull gitlab/gitlab-ce:latest

# 运行gitlab镜像
docker run -d \
--hostname gitlab.example.com \
-p 443:443 -p 80:80 -p 222:22 \
--name gitlab \
--restart always \
-v /data/gitlab/config:/etc/gitlab:Z \
-v /data/gitlab/logs:/var/log/gitlab:Z \
-v /data/gitlab/data:/var/opt/gitlab:Z \
--shm-size 256m \
gitlab/gitlab-ce:latest

# 进入gitlab的web页面
10.0.0.81

# 查看gitlab密码
docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
  • 创建项目

    image-20230605172710137

优化gitlab(docker-compose不用编辑)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 配置文件优化
vim /data/gitlab/config/gitlab.rb
## 关闭普罗米修斯
prometheus['enable'] = false
prometheus['monitor_kubernetes'] = false
prometheus_monitoring['enable'] = false
## 告警关闭
alertmanager['enable'] = false
## 关闭前端node功能
node_exporter['enable'] = false
## 关闭redis功能
redis_exporter['enable'] = false
## 关闭postgre功能
postgres_exporter['enable'] = false
## 图形展示
grafana['enable'] = false

使用docker部署jenkins

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 拉取jenkins的镜像
docker pull jenkins/jenkins:latest

# 创建Jenkins用户
useradd jenkins -u 1000

# 授权Jenkins目录权限
chown -R jenkins.jenkins /data/jenkins/

# 运行Jenkins镜像
docker run \
--name jenkins \
--rm \
--detach \
--user root \
--privileged \
--link gitlab \
--volume /etc/docker/daemon.json:/etc/docker/daemon.json \
--volume /data/jenkins:/var/jenkins_home \
--volume /usr/bin/docker:/usr/bin/docker \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume /root/.docker/:/root/.docker/ \
--volume /root/.ssh/:/root/.ssh/ \
--publish 8080:8080 \
--publish 50000:50000 \
jenkins/jenkins

# 配置解析
docker run \
--name jenkins \
## 容器运行的name
--rm \
## 容器停止时删除
--detach \
## 后台运行
--privileged \
## docker in docker场景下拥有使用docker的权限
--link gitlab \
## 连接容器
--user root \
## 以root用户运行
--volume /etc/docker/daemon.json:/etc/docker/daemon.json \
## 挂载目录,使宿主docker与Jenkins容器内docker的配置文件一致
--volume /data/jenkins:/var/jenkins_home \
## 指定Jenkins的软件目录
--volume /usr/bin/docker:/usr/bin/docker \
## 挂载宿主机的"Docker"命令,容器也可以使用Docker
--volume /var/run/docker.sock:/var/run/docker.sock \
## 挂载宿主机的sock文件,使容器的docker可以连接服务端
--volume /root/.docker/:/root/.docker/ \
## 挂载docker连接私有镜像仓库账户目录,与宿主机保持一致
--volume /root/.ssh/:/root/.ssh/ \
## 挂载公钥存放目录,使宿主机和Jenkins容器的公钥一致
--publish 8080:8080 \
--publish 50000:50000 \
jenkins/jenkins

# 访问Jenkins页面
10.0.0.81:8080
  • 登陆Jenkins

    image-20230605195034306

  • 修改Jenkins密码

    image-20230605195327697

  • 编辑密码并保存

    image-20230605195356341

1
2
# 查看Jenkins密码
docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword

优化Jenkins

1
2
3
4
5
6
7
# 安装Jenkins插件包

# 解压到Jenkins路径并覆盖Plugins目录
tar xf jenkins_plugins.tar.gz -C /data/jenkins/

# 重启Jenkins容器
docker restart jenkins

模拟开发人员上传代码

  • 新建代码文件

    image-20230605214339165

  • 写入代码

    image-20230605214305364

Jenkins从Gitlab拉取代码并部署

拉取代码

  • 获取代码仓库地址

    image-20230605214714969

1
2
3
4
5
6
7
8
9
# 进入Jenkins服务器
docker exec -it jenkins /bin/bash

# 克隆私有仓库代码
git@gitlab.example.com:root/docker.git

# 查看拉取的代码文件
ls /var/jenkins_home/docker
README.md index.html

web服务器连接私有镜像仓库

1
2
3
4
5
6
7
8
9
# 连接私有镜像仓库
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://pgz00k39.mirror.aliyuncs.com"],
"insecure-registries": ["http://10.0.0.82"]
}

# 重启docker服务
systemctl restart docker

部署到容器中并制作成镜像上传到Harbor

手动部署

  • Jenkins制作镜像并上传到Harbor

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 编辑Dockerfile
    cat > /var/jenkins_home/workspace/docker/Dockerfile <<EOF
    FROM nginx:alpine
    ADD index.html /usr/share/nginx/html/
    EOF

    # 进入代码存放目录
    cd /var/jenkins_home/workspace/docker/

    # 构建镜像
    docker build -t 10.0.0.82/jenkins/web:1 .

    # 将镜像推送到私有仓库
    docker push 10.0.0.82/jenkins/web:1
  • 在web服务器部署docker镜像

    1
    2
    3
    4
    5
    # 远程连接web设备运行镜像
    ssh 10.0.0.83 'docker stop web'
    ssh 10.0.0.83 'docker rm web'
    ssh 10.0.0.83 "docker pull 10.0.0.82/jenkins/web:1"
    ssh 10.0.0.83 "docker run --name web -p80:80 -d 10.0.0.82/jenkins/web:1"

Jenkins自动化代码上线

  • 新建一个项目

    image-20230606004511277

  • 配置项目

    image-20230606004318505

  • 填写代码仓库地址

    image-20230606004636628

  • 配置Jenkins容器的私钥

    image-20230606004800528

  • 编写Jenkins的job

    image-20230606000915757

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # 编辑Dockerfile
    cat > $WORKSPACE/Dockerfile <<EOF
    FROM nginx:alpine
    ADD index.html /usr/share/nginx/html/
    EOF

    # 进入代码存放目录构建镜像
    cd $WORKSPACE && docker build -t 10.0.0.82/jenkins/web:$GIT_COMMIT .

    # 将镜像推送到私有仓库
    docker push 10.0.0.82/jenkins/web:$GIT_COMMIT

    # 远程连接到web服务器
    ## 停止当前"web"容器
    ssh 10.0.0.83 'docker stop web'

    ## 删除当前"web"容器
    ssh 10.0.0.83 'docker rm web'

    ## 拉取web镜像
    ssh 10.0.0.83 "docker pull 10.0.0.82/jenkins/web:$GIT_COMMIT"

    ## 运行web容器
    ssh 10.0.0.83 "docker run --name web -p80:80 -d 10.0.0.82/jenkins/web:$GIT_COMMIT"
  • 立刻构建项目

    image-20230606004934091

使用docker-compose自动化部署CICD

  • 编辑docker-compose文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    # vim docker-compose.yml
    version: '3.3'
    services:
    gitlab:
    image: 'gitlab/gitlab-ce:latest'
    container_name: gitlab
    restart: always
    environment:
    GITLAB_OMNIBUS_CONFIG: |
    external_url 'http://10.0.0.81'
    gitlab_rails['gitlab_shell_ssh_port'] = '2222'
    prometheus['enable'] = false
    prometheus['monitor_kubernetes'] = false
    prometheus_monitoring['enable'] = false
    alertmanager['enable'] = false
    node_exporter['enable'] = false
    redis_exporter['enable'] = false
    postgres_exporter['enable'] = false
    grafana['enable'] = false
    ports:
    - '80:80'
    - '443:443'
    - '2222:22'
    volumes:
    - '/data/gitlab/config:/etc/gitlab'
    - '/data/gitlab/logs:/var/log/gitlab'
    - '/data/gitlab/data:/var/opt/gitlab'
    shm_size: '256m'

    jenkins:
    image: jenkins/jenkins
    container_name: jenkins
    restart: always
    ports:
    - '8080:8080'
    - '50000:50000'
    volumes:
    - /etc/docker/daemon.json:/etc/docker/daemon.json
    - /data/jenkins:/var/jenkins_home
    - /usr/bin/docker:/usr/bin/docker
    - /var/run/docker.sock:/var/run/docker.sock
    - /root/.docker/:/root/.docker/
    - /root/.ssh/:/root/.ssh/
    user: root
    privileged: true
    links:
    - gitlab
  • 运行

    1
    2
    # 运行docker-compose
    docker-compose up
  • 总结

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    # gitlab使用非22端口拉代码
    gitlab_rails['gitlab_shell_ssh_port'] = '2222'

    # gitlab代码地址根据docker容器的id(固定)
    external_url 'http://10.0.0.81'

    # gitlab启动慢,配置文件优化
    prometheus['enable'] = false
    prometheus['monitor_kubernetes'] = false
    prometheus_monitoring['enable'] = false
    alertmanager['enable'] = false
    node_exporter['enable'] = false
    redis_exporter['enable'] = false
    postgres_exporter['enable'] = false
    grafana['enable'] = false

    # Jenkins想要拉取gitlab代码,固定公钥
    -v /root/.ssh/:/root/.ssh/

    # Jenkins要使用docker in docker
    docker run --privileged
    docker-compose privileged: true
    -v /var/run/docker.sock:/var/run/docker.sock
    -v /usr/bin/docker:/usr/bin/docker

    # Jenkins要永久登录harbor
    -v /etc/docker/daemon.json:/etc/docker/daemon.json
    -v /root/.docker/:/root/.docker/ ## config.json 主要记录harbor的登录信息
    {
    "auths": {
    "10.0.0.82": {
    "auth": "YWRtaW46MTIz"
    }
    }
    }

    # Jenkins需要使用root用户启动
    docker run --user root
    或者 docker-compose user: root