拉取最新版镜像
docker pull jenkins/jenkins:latest
docker 运行命令行
docker run \
-d \
-u root \
-p 28080:8080 \
-v "$HOME/docker/jenkins_home":/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$HOME/docker/docker-linux":/usr/local/bin/docker:ro \
-v "$HOME/.m2/repository":/root/.m2/repository \
-v "$HOME/.m2/settings.xml":/root/.m2/settings.xml:ro \
-v "$HOME":/home \
-v /etc/localtime:/etc/localtime \
--name jenkins \
jenkins/jenkins \
bash -c "apt-get update && apt-get install -y sshpass && exec /usr/local/bin/jenkins.sh"
参数介绍
- -d:后台运行容器,并返回容器 ID
- -u root:指定容器内的进程以 root 用户运行
- -p 28080:8080
- 将宿主机 28080 端口与容器内 8080 端口映射
- -v <宿主机路径>:<容器路径>
- 用于将宿主机[目录/文件]挂载/映射到容器内[目录/文件]
- -v "$HOME/docker/jenkins_home":/var/jenkins_home \
- 容器内的"/var/jenkins_home"目录会存储 jenkins 中建立的流水线、系统配置等信息,如果未将容器内该目录挂载至宿主机,容器重启会导致信息丢失。
- 宿主机中的"$HOME/docker/jenkins_home"目录可根据喜好自定义
- -v /var/run/docker.sock:/var/run/docker.sock -v "$HOME/docker/docker-linux":/usr/local/bin/docker:ro \
- 用于在容器内使用宿主机中的 docker 命令,可用于构建镜像、推送镜像到仓库。
- /var/run/docker.sock:/var/run/docker.sock
- “/var/run/docker.sock”宿主机 Unix 域套接字,Docker daemon 的 REST API 入口。
- 挂载后容器里任何进程只要向这个 socket 发 HTTP 请求,就能直接操作宿主机的 Docker 引擎——list/build/run/stop/pull 镜像、启停容器、甚至把宿主机根目录挂进新容器(等价于宿主机 root 权限)。
- 风险:等同于给容器开了“上帝模式”,不要在不可信容器里挂载
- "$HOME/docker/docker-linux":/usr/local/bin/docker:ro
- 将 docker 命令行工具挂载至容器内,否则容器里就算有 socket 也找不到 docker 命令;如果宿主机与容器架构不同(例如宿主机 x86_64、容器 arm),记得下载容器对应架构的静态二进制。
- 下载地址:download.docker.com/linux/stati…
- 下载完成后可用 tar -zxvf <文件路径> 解压,将解压后文件夹内名为“docker”的二进制文件挂载至容器,可修改宿主机内文件“docker”二进制文件的名称,例:docker-linux
- -v "HOME/.m2/repository":/root/.m2/repository−v"HOME/.m2/settings.xml":/root/.m2/settings.xml:ro \
- 用于挂载宿主机内已有的 maven 本地仓库、setting.xml 文件至容器内
- 用 maven 构建 Java 时,maven 会从远端仓库下载 pom 中引入的包至本地仓库,将本地仓库和 setting.xml 文件挂载出来,可防止容器重启后已经下载的包丢失需重新下载和方便管理已配置的 setting.xml
- 无上述需求可不挂载
- -v "$HOME":/home
- -v /etc/localtime:/etc/localtime
- --name jenkins:容器命名
- jenkins/jenkins:要启动的镜像名称
- bash -c "apt-get update && apt-get install -y sshpass && exec /usr/local/bin/jenkins.sh"
- 启动时临时装包再交权
- apt-get update && apt-get install -y sshpass
容器一启动就用 root 身份(前面 -u root)拉最新源并装 sshpass,让 Jenkins 后续能在 Pipeline 里直接通过 sshpass -p xxx scp 这类命令做远程拷贝/部署,而不用改镜像。
- exec /usr/local/bin/jenkins.sh
装完包后立刻 exec 切换到官方入口脚本,把 PID 1 交给 Jenkins,保证信号传递和容器生命周期正常;不加 exec 会多出一个 bash 进程,导致 docker stop 时 Jenkins 收不到 SIGTERM。
- 为什么放 run 里而不是写 Dockerfile?图省事:不想重新 build 镜像就能随时追加系统依赖;代价是每次重启容器都要重新下载,CI 量大时建议还是写 Dockerfile RUN apt-get … 然后 docker build 固化。