Docker启动Jenkins容器的命令详解

我们有一个用于运行Jenkins容器的Docker命令,让我们逐部分解释:

#!/bin/bash
mkdir /data/jenkins_home -p
docker run -d --name jenkins2.340 -u root --restart=always \
  -v /data/jenkins_home:/var/jenkins_home \
  -v /root/.bashrc:/root/.bashrc \
  -v /usr/local/jdk1.8.0_202:/usr/local/jdk1.8.0_202 \
  -v /usr/local/apache-maven-3.8.1:/usr/local/apache-maven-3.8.1 \
  -v /usr/local/nodejs:/usr/local/nodejs \
  -v /etc/hosts:/etc/hosts \
  -v /etc/localtime:/etc/localtime \
  -v /etc/timezone:/etc/timezone \
  -v /usr/bin/docker:/usr/bin/docker \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --net=host \
  jenkins:2.340

逐行解释:

  1. #!/bin/bash:指定脚本解释器为bash。

  2. mkdir /data/jenkins_home -p:创建目录/data/jenkins_home,-p选项确保如果目录不存在则创建,如果已存在也不会报错。

  3. docker run:运行一个容器。

    • -d:以后台(守护进程)模式运行容器。

    • --name jenkins2.340:为容器指定名称为jenkins2.340。

    • -u root:以root用户身份运行容器中的进程。

    • --restart=always:设置容器总是自动重启,除非明确停止。

  4. 挂载卷(-v选项):

    • -v /data/jenkins_home:/var/jenkins_home:将宿主机的/data/jenkins_home目录挂载到容器的/var/jenkins_home目录。这是Jenkins的主目录,用于持久化配置、工作空间等。

    • -v /root/.bashrc:/root/.bashrc:将宿主机的root用户的bashrc文件挂载到容器中,以便在容器内使用相同的bash配置。

    • -v /usr/local/jdk1.8.0_202:/usr/local/jdk1.8.0_202:挂载JDK,使容器内可以使用宿主机的Java开发工具包。

    • -v /usr/local/apache-maven-3.8.1:/usr/local/apache-maven-3.8.1:挂载Maven,使容器内可以使用宿主机的Maven。

    • -v /usr/local/nodejs:/usr/local/nodejs:挂载Node.js,使容器内可以使用宿主机的Node.js。

    • -v /etc/hosts:/etc/hosts:挂载宿主机的hosts文件,使容器使用与宿主机相同的域名解析。

    • -v /etc/localtime:/etc/localtime:挂载宿主机的localtime文件,使容器使用与宿主机相同的时区设置。

    • -v /etc/timezone:/etc/timezone:挂载宿主机的timezone文件,使容器使用与宿主机相同的时区信息。

    • -v /usr/bin/docker:/usr/bin/docker:挂载宿主机的docker可执行文件,使容器内可以使用docker命令(这通常用于在Jenkins容器内执行docker命令,即Docker in Docker的一种方式)。

    • -v /var/run/docker.sock:/var/run/docker.sock:挂载宿主机的Docker守护进程的套接字,使容器内的docker客户端可以与宿主机的Docker守护进程通信。

  5. 网络设置:

    • --net=host:使用宿主机的网络命名空间,容器与宿主机共享网络栈。这意味着容器不会进行网络隔离,直接使用宿主机的IP和端口。

  6. 镜像和标签:

    • jenkins:2.340:指定使用的镜像为jenkins,标签为2.340。

总结:

这个脚本创建了一个Jenkins容器,并进行了大量的目录和文件挂载,以便:

  • 持久化Jenkins数据。

  • 在容器内使用宿主机已安装的开发工具(JDK、Maven、Node.js)。

  • 使容器内可以执行docker命令(通过挂载docker可执行文件和docker套接字)。

  • 使容器与宿主机共享网络、时区、hosts等配置。

这样,Jenkins容器就可以作为一个持续集成环境,能够直接使用宿主机的docker来构建和运行其他容器。注意,以root用户运行容器可能会有安全风险,但在某些需要权限的场景下(如操作docker)可能是必要的。

这是一个用于在 Docker 中运行 Jenkins 2.340 的详细命令脚本,我将为您逐部分解释:

脚本详解

1. 脚本头部

#!/bin/bash
  • 指定脚本使用 bash 解释器执行。

mkdir /data/jenkins_home -p
  • 在宿主机上创建 Jenkins 数据目录,-p参数确保目录不存在时创建,已存在时不报错。

2. Docker 运行参数详解

容器基本信息:

docker run -d --name jenkins2.340 -u root --restart=always
  • -d: 在后台运行容器(守护进程模式)

  • --name jenkins2.340: 为容器命名为 "jenkins2.340"

  • -u root: 以 root 用户身份运行容器(解决权限问题)

  • --restart=always: 容器退出时自动重启


数据持久化卷挂载:

-v /data/jenkins_home:/var/jenkins_home
  • 核心挂载:将宿主机的 /data/jenkins_home挂载到容器的 /var/jenkins_home

  • 目的:持久化 Jenkins 的所有配置、作业、插件等数据

-v /root/.bashrc:/root/.bashrc
  • 挂载宿主机的 bash 配置文件,使容器内继承相同的 bash 环境配置


开发工具挂载:

-v /usr/local/jdk1.8.0_202:/usr/local/jdk1.8.0_202
  • 挂载 JDK 1.8.0_202 到容器,使 Jenkins 可以使用宿主机已安装的 Java 环境

-v /usr/local/apache-maven-3.8.1:/usr/local/apache-maven-3.8.1
  • 挂载 Maven 3.8.1,为 Java 项目提供构建工具

-v /usr/local/nodejs:/usr/local/nodejs
  • 挂载 Node.js,支持前端项目构建


系统配置挂载:

-v /etc/hosts:/etc/hosts
  • 共享宿主机的 hosts 文件,解决容器内部域名解析问题

-v /etc/localtime:/etc/localtime
-v /etc/timezone:/etc/timezone
  • 同步宿主机的时区和时间设置,确保容器内时间正确


Docker 环境挂载(关键配置):

-v /usr/bin/docker:/usr/bin/docker
-v /var/run/docker.sock:/var/run/docker.sock
  • Docker in Docker (DinD) 模式:允许 Jenkins 容器内部使用宿主机 Docker

  • 作用:Jenkins 可以在流水线中执行 docker build、docker push等命令

  • 通过挂载 Docker socket,容器内部可以直接调用宿主机的 Docker 守护进程


网络配置:

--net=host
  • 使用宿主机网络模式,容器与宿主机共享网络命名空间

  • 优点:容器内服务可以直接使用宿主机的 IP 和端口

  • 注意:可能会有端口冲突风险


镜像指定:

jenkins:2.340
  • 使用官方 Jenkins 2.340 版本的镜像


配置的目的和用途

主要功能:

  1. 持久化数据:Jenkins 所有数据保存在 /data/jenkins_home,容器重建不丢失配置

  2. 集成开发环境:容器内可直接使用宿主机已安装的 JDK、Maven、Node.js

  3. Docker 集成:支持在 Jenkins 流水线中构建和推送 Docker 镜像

  4. 时间同步:保持容器与宿主机时间一致

  5. 网络直通:使用 host 网络,无需端口映射

使用场景:

这是一个典型的 CI/CD Jenkins 主节点配置,特别适用于:

  • 需要构建 Docker 镜像的 Java/Node.js 项目

  • 需要在流水线中执行 Docker 命令

  • 需要持久化 Jenkins 配置的场景


注意事项

  1. 权限问题:使用 -u root解决了权限,但可能有安全风险

  2. 网络模式:--net=host意味着 Jenkins 默认使用 8080 端口,确保宿主机该端口空闲

  3. Docker 挂载:挂载 Docker socket 意味着容器内的 Jenkins 拥有与宿主机相同的 Docker 权限

  4. 路径依赖:脚本假设宿主机上相关工具已安装在指定路径

启动后访问

启动后,Jenkins 应该可以通过以下方式访问:

  • 宿主机IP:8080(如 http://192.168.1.100:8080)

首次访问需要输入初始管理员密码,该密码位于:

/data/jenkins_home/secrets/initialAdminPassword

这个配置是一个生产环境中比较完整的 Jenkins Docker 部署方案。

posted on 2026-03-15 11:23  luzhouxiaoshuai  阅读(40)  评论(0)    收藏  举报

导航