Jenkinsfile:
Docker的NETWORK_NAME不要使用bridge默认网络,要使用自定义的网络如test
- 默认 bridge 网络:容器间不能用名字互相访问,只能用 IP。
- 自定义网络:容器间可以用名字互相访问,Docker 自动做了 DNS 解析。
pipeline {
agent any
environment {
// 定义镜像名称和标签作为环境变量
IMAGE_NAME = 'my-application'
IMAGE_TAG = 'latest'
CONTAINER_NAME = 'my-app-container'
VOLUME_NAME = 'app-data-volume'
NETWORK_NAME = 'test' // 使用自定义网络名称
HOST_PORT = '8080'
CONTAINER_PORT = '8080'
}
stages {
stage('检查运行中的容器') {
steps {
script {
// 检查容器是否存在并移除
try {
sh "docker container inspect ${CONTAINER_NAME}"
echo "容器 ${CONTAINER_NAME} 已存在。正在停止并移除..."
sh "docker container stop ${CONTAINER_NAME}"
sh "docker container rm ${CONTAINER_NAME}"
} catch (Exception e) {
echo "未找到名为 ${CONTAINER_NAME} 的容器。"
}
// 检查镜像是否存在并移除
try {
sh "docker image inspect ${IMAGE_NAME}:${IMAGE_TAG}"
echo "镜像 ${IMAGE_NAME}:${IMAGE_TAG} 已存在。正在移除..."
sh "docker rmi ${IMAGE_NAME}:${IMAGE_TAG} -f"
} catch (Exception e) {
echo "未找到镜像 ${IMAGE_NAME}:${IMAGE_TAG}。"
}
}
}
}
stage('创建 Docker 卷') {
steps {
script {
// 检查卷是否存在,不存在则创建
try {
sh "docker volume inspect ${VOLUME_NAME}"
echo "卷 ${VOLUME_NAME} 已存在。"
} catch (Exception e) {
echo "正在创建卷 ${VOLUME_NAME}..."
sh "docker volume create ${VOLUME_NAME}"
}
}
}
}
stage('构建 Docker 镜像') {
steps {
script {
// 构建 Docker 镜像
echo "正在构建 Docker 镜像 ${IMAGE_NAME}:${IMAGE_TAG}..."
sh "docker build -t ${IMAGE_NAME}:${IMAGE_TAG} ."
}
}
}
stage('运行 Docker 容器') {
steps {
script {
// 运行 Docker 容器,挂载卷并映射端口
echo "正在启动容器 ${CONTAINER_NAME}..."
sh """
docker run -d \
--name ${CONTAINER_NAME} \
-p ${HOST_PORT}:${CONTAINER_PORT} \
-v ${VOLUME_NAME}:/app/data \
--network ${NETWORK_NAME} \
${IMAGE_NAME}:${IMAGE_TAG}
"""
}
}
}
stage('清理') {
steps {
script {
// 移除未使用的镜像
echo "正在清理未使用的 Docker 镜像..."
sh "docker image prune -f"
}
}
}
}
post {
success {
echo "部署成功!"
echo "应用程序可通过 http://<服务器IP>:${HOST_PORT} 访问"
}
failure {
echo "部署失败!"
}
always {
echo "流水线执行完成。"
}
}
}
Dockerfile:
# 使用官方 Python 基础镜像(轻量级版本)
FROM python:3.10-slim
# 设置工作目录
WORKDIR /app
# 先复制依赖文件,以便利用 Docker 缓存层
COPY requirements.txt .
# 设置 pip 使用国内镜像源加速下载(可根据需要修改或删除)
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 安装依赖(使用 --no-cache-dir 减少镜像大小)
RUN pip install --no-cache-dir -r requirements.txt
# 复制项目所有文件(放在依赖安装之后,以便代码变更不影响依赖层缓存)
COPY . .
# 暴露应用端口(根据实际应用修改)
EXPOSE 8080
# 设置容器启动命令(根据实际应用修改)
CMD ["python", "app.py"]