使用 Docker Compose 从零部署 TeamCity + PostgreSQL(详细新手教程)

news2025/6/8 6:39:44

JetBrains TeamCity 是一款专业的持续集成(CI)服务器工具,支持各种编程语言和构建流程。本文将一步一步带你用 Docker 和 Docker Compose 快速部署 TeamCity,搭配 PostgreSQL 数据库,并确保 所有操作新手可跟着做


一、环境准备

  • 一台已安装 Docker 和 Docker Compose 的 Linux 服务器(建议 Ubuntu)

  • 推荐配置:

    • 至少 4 核 CPU
    • 至少 8 GB 内存
    • 至少 10 GB 剩余磁盘空间

如果你尚未安装 Docker,可以参考在服务器上安装 Docker


二、创建所需文件夹(数据持久化)

TeamCity 和 PostgreSQL 都需要挂载本地数据目录,避免容器删除后数据丢失。

1. 一键创建目录结构

sudo mkdir -p /home/teamcity/{datadir,logs,postgres}

创建的目录解释如下:

路径用途
/home/teamcity/datadirTeamCity 主数据(如项目、用户等)
/home/teamcity/logs日志文件
/home/teamcity/postgresPostgreSQL 数据文件

2. 设置目录权限

确保容器有权限访问这些目录:

sudo chown -R 1000:1000 /home/teamcity

说明:这里 1000:1000 是容器中的默认用户 UID 和 GID,如果你用其他方式运行容器(如 root 用户),可省略。


三、编写 docker-compose.yml

在任意工作目录下(如 /home/teamcity/),创建文件:

nano docker-compose.yml

粘贴以下内容:

services:
  teamcity-server:
    image: jetbrains/teamcity-server:latest
    container_name: teamcity-server
    restart: unless-stopped
    depends_on:
      - postgres
    environment:
      - TEAMCITY_SERVER_MEM_OPTS=-Xmx3g -XX:ReservedCodeCacheSize=640m
      - TEAMCITY_CONTEXT=/
    ports:
      - "8111:8111"
    volumes:
      - /home/teamcity/datadir:/data/teamcity_server/datadir
      - /home/teamcity/logs:/opt/teamcity/logs
    user: "1000:1000"
    mem_limit: 6g
    cpus: 4.0

  postgres:
    image: postgres:15
    container_name: teamcity-postgres
    restart: unless-stopped
    environment:
      - POSTGRES_DB=teamcity
      - POSTGRES_USER=teamcity
      - POSTGRES_PASSWORD=teamcity_pass
    ports:
      - "5432:5432"
    volumes:
      - /home/teamcity/postgres:/var/lib/postgresql/data
    user: "1000:1000"
    mem_limit: 2g
    cpus: 2.0

说明:

  • teamcity-server 是 CI 服务器主进程,监听端口 8111。
  • postgres 是 TeamCity 使用的数据库。
  • 所有数据、配置、日志都绑定本地目录,防止容器删除后数据丢失。
  • 容器资源做了合理限制,防止占用太多内存或 CPU。

四、启动服务

docker-compose.yml 所在目录执行以下命令:

docker compose up -d

等待镜像下载并启动,首次运行可能需要几分钟。

查看运行状态:

docker compose ps

如果看到两个容器都是 Up 状态,说明已成功运行。


五、访问 TeamCity 并完成初始化

打开浏览器,访问:

http://<你的服务器IP>:8111

首次访问将进入初始化界面:

  1. 等待 TeamCity 自动初始化配置。

  2. 选择 PostgreSQL 作为数据库,并填写以下信息:

    • Host: teamcity-postgres
    • Port: 5432
    • DB: teamcity
    • User: teamcity
    • Password: teamcity_pass
  3. 提交并完成后续初始化步骤。

💡 提示:容器之间通过服务名通信,因此数据库地址填 teamcity-postgres 而不是 localhost


六、配置构建代理(Agent)

TeamCity Server 部署完成后,还需要至少一个 Agent 来执行构建任务

👉 请继续阅读:《TeamCity Agent 配置完整教程(配合 Docker Compose 快速部署)》,了解如何配置构建代理。

这将帮助你:

  • 启用默认 agent 或添加多个 agent
  • 解决“没有空闲可用代理”的错误
  • 授权并管理 agent

七、停止与管理服务

停止服务:

docker compose down

查看日志:

docker compose logs -f teamcity-server

进入容器内部调试:

docker exec -it teamcity-server /bin/bash

八、常见问题 FAQ

1. 浏览器提示“连接被拒绝”?

检查防火墙是否放行 8111 端口:

sudo ufw allow 8111

确认 Docker 是否已成功运行:

docker compose ps

2. 数据丢失?

请检查挂载目录是否创建并有权限,尤其是 /home/teamcity/postgres/home/teamcity/datadir 是否有 1000:1000 权限。


九、总结

通过本文你学会了:

  • 如何准备 TeamCity 和 PostgreSQL 持久化目录
  • 如何使用 Docker Compose 编排 CI 服务
  • 如何启动并初始化 TeamCity 服务
  • 如何设置资源限制与权限
  • 如何继续配置构建代理(Agent)

配合下一篇教程一起使用,你将拥有完整的 CI/CD 系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2403829.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux进程(中)

目录 进程等待 为什么有进程等待 什么是进程等待 怎么做到进程等待 wait waitpid 进程等待 为什么有进程等待 僵尸进程无法杀死&#xff0c;需要进程等待来消灭他&#xff0c;进而解决内存泄漏问题--必须解决的 我们要通过进程等待&#xff0c;获得子进程退出情况--知…

【计算机组成原理】计算机硬件的基本组成、详细结构、工作原理

引言 计算机如同现代科技的“大脑”&#xff0c;其硬件结构的设计逻辑承载着信息处理的核心奥秘。从早期程序员手动输入指令的低效操作&#xff0c;到冯诺依曼提出“存储程序”概念引发的革命性突破&#xff0c;计算机硬件经历了从机械操控到自动化逻辑的蜕变。本文将深入拆解…

MVC分层架构模式深入剖析

&#x1f504; MVC 交互流程 #mermaid-svg-5xGt0Ka13DviDk15 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-5xGt0Ka13DviDk15 .error-icon{fill:#552222;}#mermaid-svg-5xGt0Ka13DviDk15 .error-text{fill:#552222…

新能源汽车热管理核心技术解析:冬季续航提升40%的行业方案

新能源汽车热管理核心技术解析&#xff1a;冬季续航提升40%的行业方案 摘要&#xff1a;突破续航焦虑的关键在热能循环&#xff01; &#x1f449; 本文耗时72小时梳理行业前沿方案&#xff0c;含特斯拉/比亚迪等8家车企热管理系统原理图 一、热管理为何成新能源车决胜关键&am…

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1开通指南及使用心得

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年CSDN全站排名top 28。 &#x1f3c6;数年电商行业从业经验&#xff0c;AWS/阿里云资深使用用…

运行示例程序和一些基本操作

欢迎 ----> 示例 --> 选择sample CTRL B 编译代码 CTRL R 运行exe 项目 中 Shadow build 表示是否 编译生成文件和 源码是否放一块 勾上不在同一个地方 已有项目情况下怎么打开项目 方法一: 左键双击 xxx.pro 方法二: 文件菜单里面 选择打开项目

学习数字孪生,为你的职业发展开辟新赛道

你有没有想过&#xff0c;未来十年哪些技能最吃香&#xff1f; AI、大数据、智能制造、元宇宙……这些词频繁出现在招聘市场和行业报告中。而在它们背后&#xff0c;隐藏着一个“看不见但无处不在”的关键技术——数字孪生&#xff08;Digital Twin&#xff09;。 它不仅在制造…

WebRTC源码线程-1

1、概述 本篇主要是简单介绍WebRTC中的线程&#xff0c;WebRTC源码对线程做了很多的封装。 1.1 WebRTC中线程的种类 1.1.1 信令线程 用于与应用层的交互&#xff0c;比如创建offer&#xff0c;answer&#xff0c;candidate等绝大多数的操作 1.1.2 工作线程 负责内部的处理逻辑&…

MySQL中的内置函数

文章目录 一、日期函数1.1 获取当前的日期1.2 获取当前时间1.3 获取当前日期和时间1.4 提取时间日期1.5 添加日期1.6 减少日期1.7 两个日期的差值 二、字符串处理函数2.1 获取字符串的长度2.2 获取字符串的字节数2.3 字符串拼接2.4 转小写2.5 转大写2.6 子字符串第⼀次出现的索…

YOLOv8n行人检测实战:从数据集准备到模型训练

YOLOv8n行人检测实战&#xff1a;从数据集准备到模型训练 一、为什么选择YOLOv8&#xff1f;二、环境准备2.1 环境配置解析 三、安装Ultralytics框架四、数据集准备与理解4.1 数据集下载4.2 数据集结构4.3 YOLO标签格式解析 五、数据集可视化&#xff1a;理解标注数据5.1 可视化…

国标GB28181设备管理软件EasyGBS远程视频监控方案助力高效安全运营

一、方案背景​ 在商业快速扩张的背景下&#xff0c;连锁店门店数量激增&#xff0c;分布范围广。但传统人工巡检、电话汇报等管理方式效率低下&#xff0c;存在信息滞后、管理盲区&#xff0c;难以掌握店铺运营情况&#xff0c;影响企业效率与安全。网络远程视频监控系统可有…

网络寻路--图论

所以我们固定题中M条边&#xff08;因为这M条一定联通&#xff09; P8605 [蓝桥杯 2013 国 AC] 网络寻路 - 洛谷 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typedef pair<int,int> pii; int n,m; int d[N],u[N],v[N]…

LangChain4j 学习教程项目

LangChain4j 学习教程 项目地址项目简介主要功能使用的技术和库项目环境配置环境要求 依赖版本每天学习内容和目标Day 01Day 02Day 03Day 04Day 05Day 06Day 07Day 08Day 09Day 10Day 11Day 12重点学习内容 RAG 经过为期12天&#xff08;日均1小时&#xff09;的LangChain4j源码…

【读论文】U-Net: Convolutional Networks for Biomedical Image Segmentation 卷积神经网络

摘要1 Introduction2 Network Architecture3 Training3.1 Data Augmentation 4 Experiments5 Conclusion背景知识卷积激活函数池化上采样、上池化、反卷积softmax 归一化函数交叉熵损失 Olaf Ronneberger, Philipp Fischer, Thomas Brox Paper&#xff1a;https://arxiv.org/ab…

Linux 文件系统与 I/O 编程核心原理及实践笔记

文章目录 一、理解文件1.1 狭义理解1.2 广义理解1.3 文件操作的归类认识1.4 系统角度&#xff1a;进程与文件的交互1.5 实践示例 二、回顾 C 文件接口2.1 hello.c 打开文件2.2 hello.c 写文件2.3 hello.c 读文件2.4 输出信息到显示器的几种方法2.5 stdin & stdout & st…

vite+tailwind封装组件库

前言 演示视频 https://www.bilibili.com/video/BV1EST3zPEyP/?spm_id_from333.1387.homepage.video_card.click 参考 https://juejin.cn/post/7112295067682865166 https://juejin.cn/post/7046187185615142949 代码仓库 https://gitee.com/malguy/vite-components-li…

【Java学习笔记】包装类

包装类&#xff08;Wrapper&#xff09; 1. 介绍 &#xff08;1&#xff09;针对八种基本数据类型相应的引用类型 --> 包装类 &#xff08;2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法 2. 分类和继承关系 基本数据类型包装类父类booleanBooleanObjectc…

【高效开发工具系列】Blackmagic Disk Speed Test for Mac:专业硬盘测速工具

博客目录 一、Blackmagic Disk Speed Test 概述二、软件核心功能解析三、v3.3 版本的新特性与改进四、实际应用场景分析五、使用技巧与最佳实践六、与其他工具的比较及优势 一、Blackmagic Disk Speed Test 概述 Blackmagic Disk Speed Test 是 Mac 平台上广受专业人士青睐的一…

UniRig:如何在矩池云一站式解决 3D 模型绑定难题

在 3D 动画制作中&#xff0c;绑定&#xff08;Rigging&#xff09;是一个至关重要但复杂耗时的步骤。它包括为 3D 模型创建骨架并分配蒙皮权重&#xff0c;以实现流畅的动画效果。由清华大学与 Tripo 联合开发的 UniRig 框架&#xff0c;为这一难题提供了全新的解决方案。 什…

字符串字典序最大后缀问题详解

字符串字典序最大后缀问题详解 一、问题定义与背景1.1 问题描述1.2 实际应用场景 二、暴力解法及其局限性2.1 暴力解法思路2.2 代码示例2.3 局限性分析 三、双指针算法&#xff1a;高效解决方案3.1 算法核心思想3.2 算法步骤3.3 代码实现3.4 与暴力解法对比 四、复杂度分析4.1 …