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

浙公网安备 33010602011771号