Docker 是一种容器化技术,能够帮助开发者将应用及其依赖打包成独立的容器,实现跨环境的一致性部署。
1. 安装 Docker
Windows/macOS:下载 Docker Desktop
2. 核心概念
- 镜像(Image):应用静态模板(类似虚拟机快照)
- 容器(Container):镜像的运行实例(轻量级虚拟机)
- 仓库(Registry):存储镜像的平台(如 Docker Hub)
3. 常用命令
3.1 镜像操作
shell
docker pull nginx:latest # 拉取镜像
docker run --name docker-nginx -p 80:80 -v /tmp/docker-nginx:/usr/share/nginx/html # 配置信息
docker images # 查看本地镜像「docker image ls」
docker build -t nest-docker:0.0.1 . # 构建镜像(基于Dockerfile)
docker rmi nginx:latest # 删除镜像
3.2 容器操作
shell
# 新建并启动容器
docker run [选项] [镜像名] [命令]
# 常用选项:
-d # 后台运行
-p 宿主机端口:容器端口 # 端口映射(例:-p 8080:80)
--name [容器名] # 指定容器名称
-v 宿主机路径:容器路径 # 数据卷挂载(例:-v /data:/app/data)
-e [键=值] # 设置环境变量(例:-e TZ=Asia/Shanghai)
--rm # 容器停止后自动删除
docker run --name docker-nginx -p 80:80 nginx:latest # 运行容器(端口映射)
docker run --rm -p 8000:3000 -it nest-docker
docker ps # 查看运行中容器
docker ps -a # 查看所有容器(含停止)
docker start/stop/rm docker-nginx # 启动/停止/删除容器(需先停止,或加 -f 强制删除)
docker ls # 查看运行中的容器(加 -all 查看所有)
docker kill [containerID] # 强制停止容器「占用磁盘空间」
docker exec -it docker-nginx sh # 进入容器
docker logs docker-nginx # 查看容器日志(加 -f 实时跟踪日志)
3.3 其他命令
shell
docker info. # 查看 Docker 系统信息
docker stats # 查看容器资源使用
docker stats docker-nginx # 查看指定容器资源使用
docker system prune # 清理未使资源(加 -a 清理所有未使用资源,加 --volumes 清理未使用卷)
4. Dockerfile 与 .dockerignore
4.1 Dockerfile 示例
shell
FROM node:18 # 基础镜像
WORKDIR /servers # 工作目录
COPY . . # 复制本地文件到镜像
ENV TZ=Asia/Guangzhou # 配置广州时区
RUN npm set registry=https://registry.npmmirror.com
RUN npm i -g pnpm && pnpm i && pnpm run build # 安装依赖+构建
EXPOSE 3000 # 声明监听端口
CMD node dist/main.js # 容器启动命令
4.2 .dockerignore (排除无需打包的文件)
shell
.git
node_modules
.eslintrc.json
.eslintignore
.prettierrc
.prettierignore
.gitignore
4.3执行命令
shell
docker build -t nest-docker:0.0.1. # 构建镜像
docker run -p 8000:3000 nest-docker:0.0.1 # 运行容器(端口映射)
docker container run -p 8000:3000 -it nest-docker:0.0.1
docker container run --rm -p 8000:3000 -it nest-docker /bin/bash # 运行容器,添加参数覆盖 cmd 命令
node dist/main
5. Docker Compose(多容器管理)
用于 Web 应用+数据库等多容器协同场景。
5.1 环境变量(.env.docker)
shell
# MySQL配置
MYSQL_HOST=mysql
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=123456
# Redis配置
REDIS_HOST=redis
REDIS_PORT=6379
API_PREFIX=/api
APP_PORT=3333
5.2 docker-compose.yml 配置
yaml
version: "3"
services:
servers: # Nest 服务
build: ./
ports: [3333:3333]
networks: [nest-net]
volumes: [upload:/upload]
depends_on: [mysql, redis] # 依赖MySQL、Redis
mysql: # MySQL 服务
image: mysql:8
environment:
- MYSQL_ROOT_PASSWORD=jminjmin
- MYSQL_DATABASE=store_web_project
networks: [nest-net]
volumes: [mysql:/var/lib/mysql]
redis: # Redis 服务
image: redis:latest
networks: [nest-net]
volumes: [redis:/data]
networks: { nest-net: { driver: bridge } }
volumes: { mysql: , redis: , upload: } # 数据卷(持久化数据)
5.3 常用命令
shell
docker-compose up -d # 后台启动所有服务(后台运行加 -d)
docker-compose up -d --build # 重建并启动服务(配置变更后)
docker-compose down # 停止并删除所有服务
docker-compose ps # 查看服务状态
docker-compose logs [服务名] # 加 -f 实时跟踪
6. 前端 Docker 配置(Nginx 托管)
前端 Dockerfile
shell
FROM nginx:stable
COPY ./nginx.conf /etc/nginx/nginx.conf # 复制Nginx配置
COPY ./dist /usr/share/nginx/html # 复制打包后的静态资源
EXPOSE 4444
ENV TZ=Asia/Guangzhou
Nginx 配置(nginx.conf,处理跨域)
nginx
http {
server {
listen 4444;
location / { # 静态资源访问
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html; # 单页应用路由兜底
}
location /api/ { # 接口反向代理(解决跨域)
proxy_pass http://localhost:3333;
}
}
}