在 Ubuntu 20.04 上部署 Jenkins 并配置 Nginx 反向代理

本文最后更新于 2024年10月20日 中午

通过 Docker 部署

  1. 创建一个 Docker 网络

    1
    docker network create jenkins

  2. 自定义 Jenkins Docker 镜像

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    FROM jenkins/jenkins:2.462.2-jdk17
    USER root
    RUN apt-get update && apt-get install -y lsb-release
    RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
    https://download.docker.com/linux/debian/gpg
    RUN echo "deb [arch=$(dpkg --print-architecture) \
    signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
    https://download.docker.com/linux/debian \
    $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
    RUN apt-get update && apt-get install -y docker-ce-cli
    USER jenkins
    RUN jenkins-plugin-cli --plugins "blueocean docker-workflow"
    1
    docker build -t myjenkins-blueocean:2.462.2-1 .

Docker in Docker (DinD) 方式

  1. 下载并运行 docker:dind Docker 镜像以在 Jenkins 节点内执行 Docker 命令

    1
    2
    3
    4
    5
    6
    7
    docker run --name jenkins-docker --rm --detach \
    --privileged --network jenkins --network-alias docker \
    --env DOCKER_TLS_CERTDIR=/certs \
    --volume jenkins-docker-certs:/certs/client \
    --volume jenkins-data:/var/jenkins_home \
    --publish 2376:2376 \
    docker:dind --storage-driver overlay2

  2. 运行 Jenkins Docker 镜像

    1
    2
    3
    4
    5
    6
    7
    8
    9
    docker run --name ${container_name} \
    -u root --restart=on-failure --detach \
    --network jenkins --env DOCKER_HOST=tcp://docker:2376 \
    --env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 \
    --env JENKINS_OPTS="--prefix=/${prefix}" \
    --publish 20000:8080 --publish 50000:50000 \
    --volume jenkins-data:/var/jenkins_home \
    --volume jenkins-docker-certs:/certs/client:ro \
    myjenkins-blueocean:2.462.2-1

--prefix=/${prefix}/ 用于配置 Jenkins 的路径前缀

Docker out of Docker (DOoD) 方式

Dind 方式端口映射比较复杂,可以使用 DooD 方式 3. 运行 Jenkins Docker 镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker run --name ${container_name} \
-u root \
--restart=on-failure \
--detach \
--network jenkins \
--env DOCKER_CERT_PATH=/certs/client \
--env DOCKER_TLS_VERIFY=1 \
--env JENKINS_OPTS="--prefix=${prefix}" \
--publish 20000:8080 \
--publish 50000:50000 \
--volume jenkins-data:/var/jenkins_home \
--volume jenkins-docker-certs:/certs/client:ro \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
myjenkins-blueocean:2.462.2-1

-v /var/run/docker.sock:/var/run/docker.sock 把 Docker 守护进程的 Unix 套接字复制到 Jenkins 节点内
-v /usr/bin/docker:/usr/bin/docker 把 Docker 客户端复制到 Jenkins 节点内

这样 Jenkins 节点就可以通过 Docker 守护进程的 Unix 套接字与 Docker 守护进程通信,直接在 Jenkins 节点内执行宿主机上的 Docker 命令 注意:这种部署方式会导致 Jenkins 节点具有宿主机上的 Docker 权限,存在安全风险

配置 Nginx 反向代理

1
2
3
4
5
6
7
location /${prefix}/ {
proxy_pass http://localhost:${port};
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

输入密码

1
2
3
sudo docker exec -it ${container_name} bash
cd /var/jenkins_home/secrets/
vi initialAdminPassword

访问其他容器的数据库 (DOoD 方式)

要让需要的容器加入同一个网络,在这个例子中,可以是 jenkins 网络,或者新建一个网络

1
docker network connect ${network_name} ${container_name_or_id}

然后在后端的数据库配置中使用容器名作为主机名,例如:

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
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://${redis_container}:${port}/${db}",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
"setting": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://${redis_container}:${port}/${db}",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}

CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
"hosts": [('${redis_container}', ${port})],
},
},
}

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': ${password},
'HOST': '${postgres_container_name}',
'PORT': '${postgres_port}',
}
}


在 Ubuntu 20.04 上部署 Jenkins 并配置 Nginx 反向代理
https://term-inator.github.io/2024/09/27/install-jenkins/
作者
Sicong Chen
发布于
2024年9月27日
更新于
2024年10月20日
许可协议