Dokcer如何容器部署及常见问题

本文讲解通过Docker部署Jenkins过程及遇到的问题。

通过 Docker 部署 Jenkins

使用 Docker 来部署 Jenkins 是一个快速且高效的方式。以下是使用 Docker 部署 Jenkins 的分步骤指南:

1. 安装 Docker

如果你的系统上还没有安装 Docker,请根据操作系统执行以下操作:

  • 对于 Linux(以 Ubuntu 为例) :

    bash 复制代码
    sudo apt update
    sudo apt install docker.io -y
    sudo systemctl start docker
    sudo systemctl enable docker

检查 Docker 是否安装成功,查看版本:

bash 复制代码
docker --version

2. 拉取 Jenkins Docker 镜像

从 Docker Hub 拉取Jenkins的镜像(lts 长期支持版本):

bash 复制代码
docker pull jenkins/jenkins:lts

如果你想要最新版本,可以拉取:

bash 复制代码
docker pull jenkins/jenkins

3. 运行 Jenkins 容器

运行 Jenkins 时,需要暴露一些端口并挂载一个卷以保持 Jenkins 的数据持久性。

使用以下命令运行 Jenkins:

bash 复制代码
docker run -d -p 8080:8080 -p 50000:50000 --name jenkins \
  -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts
命令详解:
  • -d: 以后台模式运行容器。
  • -p 8080:8080: 将 Jenkins 内部的 8080 端口映射到主机的 8080 端口。
  • -p 50000:50000: 映射 50000 端口,用于 Jenkins 代理通信。
  • --name jenkins: 为容器命名为 "jenkins"。
  • -v jenkins_home:/var/jenkins_home: 将 Docker 卷 jenkins_home 挂载到容器内的 Jenkins 主目录。这样可以确保数据在容器重启后不会丢失。

现在你可以通过浏览器访问 Jenkins,地址为 http://localhost:8080

4. 解锁 Jenkins

首次运行 Jenkins 时,你需要输入初始管理员密码进行解锁。

  1. 查看日志以找到管理员密码:

    bash 复制代码
    docker logs jenkins

    在日志中查找以下内容:

    复制代码
    Jenkins initial setup is required. Please use the following password to proceed to installation:
    <initialAdminPassword>
  2. 复制密码并在 Jenkins Web 界面中输入(http://localhost:8080)。

5. 安装插件和创建管理员用户

解锁 Jenkins 后:

  1. 系统会提示你安装推荐的插件。你可以选择安装推荐的插件,或手动选择特定的插件。
  2. 插件安装完成后,根据提示创建管理员用户。

6. 数据持久化和自定义配置

在前面创建的 Docker 容器中,使用的卷(jenkins_home)用于保持 Jenkins 的配置和任务数据持久化。这可以确保即使删除或停止容器,Jenkins 的数据仍然保留。

  • 你可以查看挂载的卷:

    bash 复制代码
    docker volume inspect jenkins_home

如果想使用本地目录来保存数据,可以将 jenkins_home:/var/jenkins_home 替换为主机上的一个目录路径:

bash 复制代码
docker run -d -p 8080:8080 -p 50000:50000 --name jenkins \
  -v /path/to/your/jenkins_home:/var/jenkins_home jenkins/jenkins:lts

7. 也可以使用 Docker Compose 部署 Jenkins

如果你希望通过 Docker Compose 更方便地管理 Jenkins,可以创建一个 docker-compose.yml 文件:

yaml 复制代码
version: '3'
services:
  jenkins:
    image: jenkins/jenkins:lts
    container_name: jenkins
    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - jenkins_home:/var/jenkins_home

volumes:
  jenkins_home:

然后使用 Docker Compose 启动 Jenkins:

bash 复制代码
docker-compose up -d

8. 常见问题

  1. Jenkins 端口无法访问
    解决办法:
  • 检查容器是否运行:
bash 复制代码
docker ps

如果没有运行,检查启动日志:

bash 复制代码
docker logs jenkins
  • 确保端口没有被占用
bash 复制代码
sudo lsof -i -P -n | grep LISTEN
  1. 无法获取Jenkins初始管理员密码
    解决办法:
  • 检查启动日志
bash 复制代码
docker logs jenkins
  • 如果没有日志,确保jenkins_home目录的权限正确,尝试修改主机目录权限:
bash 复制代码
sudo chown -R 1000:1000 /path/jenkins_home
  1. Jenkins 插件安装失败或速度很慢时
    解决方法:
    一般为网络问题,通过设置代理服务器解决:在Jenkins的"Manage Jenkins" -> "Manage Plugins" ->
    "Advanced" 中的"Update Site"将默认更新站点替换为国内镜像源:
bash 复制代码
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
  1. Jenkins意外停止
    Jenkins Docker容器启动后一直正常,但一段时间后自动停止 。

可能的原因:

  • 内存不足,Jenkins使用大量内存导致Docker容器崩溃。
  • 容器资源分配不足

解决办法

  • 查看容器日志
bash 复制代码
docker logs jenkins
  • 容器资源不足时,动态的增加分配给容器内存或CPU
bash 复制代码
docker run -d -p 8080:8080 -p 50000:50000 --name jenkins \
  -v jenkins_home:/var/jenkins_home \
  --memory=2g jenkins/jenkins:lts
  1. Jenkins数据丢失或无法保存配置时
    有时重启Jenkins后,任务丢失。

可能原因:

  • Docker容器未正确挂载
  • 文件系统权限有问题

解决办法

  • 确保正确挂载Jenkins容器的Jenkins_home目录,保证数据持久化:
bash 复制代码
docker run -d -p 8080:8080 -p 50000:50000 --name jenkins \
  -v /path/to/your/jenkins_home:/var/jenkins_home jenkins/jenkins:lts
  • 检查挂载目录权限,确保容器有写入权限:
bash 复制代码
sudo chown -R 1000:1000 /pat/jenkins_home
相关推荐
要站在顶端3 小时前
Jenkins PR编号提取&环境变量赋值问题总结
java·servlet·jenkins
DN金猿5 小时前
jenkins 权限控制(用户只能看指定的项目)
linux·运维·服务器·jenkins
weixin_307779135 小时前
Jenkins Pipeline: Basic Steps 插件详解
开发语言·ci/cd·自动化·jenkins·etl
java_logo5 小时前
AdguardHome Docker 容器化部署指南
运维·docker·容器·jenkins·adguardhome·部署adguardhome·docker adguard
weixin_307779136 小时前
Jenkins Pipeline:Groovy插件全解析:从原理到实战应用
开发语言·ci/cd·自动化·jenkins·etl
weixin_307779136 小时前
Jenkins Pipeline: API 插件详解
运维·ci/cd·自动化·jenkins·etl
weixin_307779136 小时前
Jenkins Declarative Pipeline:现代CI/CD的声明式实践指南
开发语言·ci/cd·自动化·jenkins·etl
Watermelo6171 天前
【简单快速】windows中docker数据如何从C盘迁移到其他盘
java·运维·docker·容器·运维开发·devops·空间计算
weixin_307779131 天前
Jenkins Token Macro 插件:宏扩展的基石
开发语言·ci/cd·架构·自动化·jenkins
weixin_307779131 天前
Jenkins SSH Build Agents 插件详解:远程构建的利器
运维·开发语言·架构·ssh·jenkins