Linux构建docker项目镜像

第一步:准备你的项目(这里以nestjs项目为例)

第二步:创建 Dockerfile

# 使用多阶段构建,以减少最终镜像体积
FROM node:22.18.0-alpine AS builder

WORKDIR /app
COPY package*.json ./
RUN npm install

COPY . .
RUN npm run build

# 生产阶段 - 使用相同的主要版本以确保兼容性
FROM node:22-alpine

WORKDIR /app
COPY package*.json ./
RUN npm install --production --ignore-scripts --prefer-offline --no-audit

COPY --from=builder /app/dist ./dist
#复制配置文件目录
COPY --from=builder /app/config ./config 

# 设置容器内的时区(可选,根据需要修改)
RUN apk add --no-cache tzdata
ENV TZ=Asia/Shanghai

EXPOSE 3000
# 健康检查(可选)
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD node -e "require('http').get('http://localhost:3000/health', (r) => { if (r.statusCode !== 200) throw new Error() })" || exit 1

CMD ["node", "dist/src/main.js"]

docker-compose.yaml文件

version: '3.8'

services:
  your-nest-app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: nest-app-container
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
    # 连接数据库和缓存,config.yaml中的地址就用 'mysql-service','redis-service'
    depends_on:
      - mysql-service
      - redis-service
    networks:
      - app-network
    # 健康检查依赖于Dockerfile中的HEALTHCHECK指令,这里通常不需要再定义
    # 但如果想用Compose的自定义健康检查,可以这样写:
    healthcheck:
      test: ["CMD", "node", "-e", "require('http').get('http://localhost:3000/health', (r) => { if (r.statusCode !== 200) throw new Error() })"]
      interval: 30s
      timeout: 3s
      retries: 3
      start_period: 5s

  mysql-service:
    image: mysql:9.0
    container_name: mysql-container
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: nest
      MYSQL_USER: layne
      MYSQL_PASSWORD: layne
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-proot"] # 使用应用程序用户更安全,这里测试就用root了
      interval: 10s
      timeout: 5s
      retries: 3

  redis-service:
    image: redis:7-alpine
    container_name: redis-container
    restart: unless-stopped
    volumes:
      - redis-data:/data
    command: redis-server --requirepass 123456 --appendonly yes # 添加持久化选项,密码123456
    networks:
      - app-network
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "123456", "ping"] # 检查时带上密码
      interval: 10s
      timeout: 5s
      retries: 3

volumes:
  mysql-data:
  redis-data:

networks:
  app-network:
    driver: bridge

.dockerignore文件,忽略不需要构建的内容

node_modules
dist
.git
.gitignore
README.md
.dockerignore
.env
# 清除之前的构建缓存
docker-compose build --no-cache

# 构建并启动服务
docker-compose up -d

# 重新构建镜像并重新创建容器
docker-compose up -d --build

Linux服务器

1.安装git

先更新软件包列表 sudo apt update

sudo apt install git

判断是否安装完成 git --version;

为确保你提交的代码身份正确识别,请执行以下命令完成配置

git config --global user.name 'your name' 
git config --global user.email 'your git account'

2.安装docker

使用便携脚本安装, docker文档地址 https://docs.docker.com/engine/install/ubuntu/

sudo apt update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
#添加 Docker 的官方 GPG 密钥
sudo chmod a+r /etc/apt/keyrings/docker.asc

下载gpg出现 curl: (35) Recv failure: Connection reset by peer 异常,可更换为

# 使用阿里云镜像下载GPG密钥
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

设置 Docker 的 Apt 仓库

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
#$(lsb_release -cs) 会自动获取当前的 Ubuntu 代号(如 jammy, focal 等)

 再次更新Apt 软件包索引以使系统识别新源的软件包

sudo apt update
#安装 Docker Engine 及相关组件
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装完成后启动 Docker 服务并设置开机自启

sudo systemctl start docker
sudo systemctl enable docker

将当前用户加入 docker 组

sudo usermod -aG docker $USER #执行此命令后,必须完全注销(Log Out)并重新登录,或者重启电脑,才能使这个组权限更改生效。

 

3.安装并运行MySQL容器

# 拉取最新版 MySQL 镜像
docker pull mysql:latest

# 运行 MySQL 容器
docker run --name mysql-container \
  -e MYSQL_ROOT_PASSWORD=root-password \
  -e MYSQL_DATABASE=database-name \
  -e MYSQL_USER=db-user \
  -e MYSQL_PASSWORD=db-password \
  -p 3306:3306 \
  -d mysql:latest

4.安装并运行Redis容器

# 拉取最新版的 Redis 镜像
docker pull redis

# 创建数据目录
mkdir -p ~/redis/data

# 运行 Redis 容器并启用数据持久化
docker run --name redis-container \
  -d \
  -p 6379:6379 \
  -v ~/redis/data:/data \
  redis:latest \
  redis-server --appendonly yes
  
# 端口如果被占用使用不同的主机端口(例如 6380)
docker run --name redis-container -d -p 6380:6379 redis

 

posted @ 2025-08-28 20:22  吃西瓜不吐西瓜籽  阅读(7)  评论(0)    收藏  举报
Live2D