Docker 使用完整指南
从安装到项目部署的完整流程
一、安装 Docker
1.1 Windows 安装
- 前往官网下载:https://www.docker.com/products/docker-desktop
- 下载
Docker Desktop Installer.exe - 双击安装,勾选 Use WSL 2 instead of Hyper-V
- 安装完成后重启电脑
- 打开 Docker Desktop,等待启动完成(任务栏图标变绿)
前置要求(Windows):
powershell
# 以管理员身份运行 PowerShell,启用 WSL2
wsl --install
wsl --update
wsl --set-default-version 2
1.2 macOS 安装
- 前往官网下载 Docker Desktop for Mac
- 根据芯片选择版本:
- Apple Silicon(M1/M2/M3)→ Apple Chip 版
- Intel → Intel Chip 版
- 拖拽到 Applications 文件夹
- 启动 Docker Desktop
1.3 Linux(Ubuntu)安装
bash
# 更新包索引
sudo apt-get update
# 安装依赖
sudo apt-get install ca-certificates curl gnupg
# 添加 Docker 官方 GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 添加仓库
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
# 安装 Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker
# 将当前用户加入 docker 组(避免每次都 sudo)
sudo usermod -aG docker $USER
newgrp docker
1.4 验证安装
bash
# 查看版本
docker --version
# 输出示例:Docker version 24.0.7, build afdd53b
docker compose version
# 输出示例:Docker Compose version v2.23.3
# 运行测试容器
docker run hello-world
# 看到 "Hello from Docker!" 说明安装成功
二、Docker 核心概念
| 概念 | 说明 |
|---|---|
| 镜像(Image) | 只读模板,类似系统安装包 |
| 容器(Container) | 镜像运行的实例,类似虚拟机 |
| 仓库(Registry) | 存放镜像的地方,如 Docker Hub |
| Dockerfile | 构建镜像的脚本文件 |
| Volume | 数据卷,用于持久化存储 |
| Network | 容器间通信的网络 |
三、常用命令
3.1 镜像操作
bash
# 搜索镜像
docker search nginx
# 拉取镜像(不指定 tag 默认 latest)
docker pull nginx
docker pull nginx:1.25
# 查看本地镜像
docker images
# 删除镜像
docker rmi nginx
docker rmi nginx:1.25
# 查看镜像详情
docker inspect nginx
3.2 容器操作
bash
# 运行容器
docker run nginx
# 常用参数:
docker run \
-d \ # 后台运行
-p 8080:80 \ # 端口映射(主机:容器)
--name my-nginx \ # 容器名称
-v /host/path:/container/path \ # 挂载目录
-e ENV_VAR=value \ # 环境变量
nginx
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止)
docker ps -a
# 停止容器
docker stop my-nginx
# 启动已停止的容器
docker start my-nginx
# 重启容器
docker restart my-nginx
# 删除容器(需先停止)
docker rm my-nginx
# 强制删除运行中的容器
docker rm -f my-nginx
# 进入容器内部(交互式)
docker exec -it my-nginx /bin/bash
# 或
docker exec -it my-nginx sh
# 查看容器日志
docker logs my-nginx
docker logs -f my-nginx # 实时跟踪日志
docker logs --tail 100 my-nginx # 最后100行
# 查看容器资源占用
docker stats
3.3 数据卷
bash
# 创建数据卷
docker volume create my-data
# 查看数据卷
docker volume ls
# 挂载数据卷运行容器
docker run -d -v my-data:/data nginx
# 删除数据卷
docker volume rm my-data
四、编写 Dockerfile
4.1 基本结构
dockerfile
# 基础镜像
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 复制依赖文件(利用缓存层)
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制项目文件
COPY . .
# 暴露端口
EXPOSE 3000
# 启动命令
CMD ["node", "server.js"]
4.2 常用指令说明
| 指令 | 作用 |
|---|---|
FROM |
指定基础镜像 |
WORKDIR |
设置工作目录 |
COPY |
复制文件到镜像 |
ADD |
复制文件(支持解压 tar) |
RUN |
构建时执行命令 |
CMD |
容器启动时执行命令(可被覆盖) |
ENTRYPOINT |
容器入口命令(不可被覆盖) |
ENV |
设置环境变量 |
EXPOSE |
声明容器监听端口 |
VOLUME |
声明数据卷挂载点 |
ARG |
构建时参数 |
4.3 构建镜像
bash
# 在 Dockerfile 所在目录执行
docker build -t my-app:1.0 .
# 指定 Dockerfile 路径
docker build -f ./docker/Dockerfile -t my-app:1.0 .
# 查看构建的镜像
docker images | grep my-app
4.4 .dockerignore 文件
node_modules
.git
.env
*.log
dist
build
五、Docker Compose 多容器编排
5.1 docker-compose.yml 结构
yaml
version: '3.8'
services:
# Web 应用
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=db
depends_on:
- db
- redis
volumes:
- ./logs:/app/logs
restart: always
# MySQL 数据库
db:
image: mysql:8.0
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: myapp
MYSQL_USER: user
MYSQL_PASSWORD: password
volumes:
- mysql-data:/var/lib/mysql
# Redis 缓存
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis-data:/data
# Nginx 反向代理
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/ssl:/etc/nginx/ssl
depends_on:
- app
volumes:
mysql-data:
redis-data:
5.2 Compose 常用命令
bash
# 启动所有服务(后台)
docker compose up -d
# 启动并重新构建镜像
docker compose up -d --build
# 只启动指定服务
docker compose up -d app db
# 查看服务状态
docker compose ps
# 查看服务日志
docker compose logs -f
docker compose logs -f app
# 停止所有服务
docker compose stop
# 停止并删除容器
docker compose down
# 停止并删除容器+数据卷
docker compose down -v
# 重启某个服务
docker compose restart app
# 进入某个服务容器
docker compose exec app sh
六、实战:部署一个 Node.js 项目
6.1 项目结构
my-project/
├── src/
│ └── index.js
├── package.json
├── Dockerfile
├── .dockerignore
└── docker-compose.yml
6.2 示例 Node.js 应用
javascript
// src/index.js
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.json({ message: 'Hello Docker!', env: process.env.NODE_ENV });
});
app.get('/health', (req, res) => {
res.json({ status: 'ok' });
});
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
6.3 编写 Dockerfile
dockerfile
# 多阶段构建
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:18-alpine AS runner
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY src ./src
COPY package.json .
EXPOSE 3000
CMD ["node", "src/index.js"]
6.4 编写 docker-compose.yml
yaml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- PORT=3000
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- app
restart: unless-stopped
6.5 Nginx 配置
nginx
# nginx.conf
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://app:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
6.6 部署步骤
bash
# 1. 进入项目目录
cd my-project
# 2. 构建并启动
docker compose up -d --build
# 3. 查看状态
docker compose ps
# 4. 测试访问
curl http://localhost/
curl http://localhost/health
# 5. 查看日志
docker compose logs -f app
七、实战:部署前端项目(Vue/React)
7.1 Dockerfile
dockerfile
# 构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 生产阶段(nginx 托管静态文件)
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
7.2 nginx.conf(支持 Vue Router history 模式)
nginx
server {
listen 80;
root /usr/share/nginx/html;
index index.html;
# 所有路由返回 index.html(SPA 路由支持)
location / {
try_files $uri $uri/ /index.html;
}
# 静态资源缓存
location ~* \.(js|css|png|jpg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
7.3 构建部署
bash
docker build -t my-frontend:1.0 .
docker run -d -p 80:80 --name frontend my-frontend:1.0
八、镜像发布到 Docker Hub
bash
# 1. 登录 Docker Hub
docker login
# 2. 给镜像打标签(username/repository:tag)
docker tag my-app:1.0 yourusername/my-app:1.0
# 3. 推送镜像
docker push yourusername/my-app:1.0
# 4. 其他机器拉取使用
docker pull yourusername/my-app:1.0
docker run -d -p 3000:3000 yourusername/my-app:1.0
九、常用镜像速查
bash
# MySQL
docker run -d \
--name mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=mydb \
-p 3306:3306 \
-v mysql-data:/var/lib/mysql \
mysql:8.0
# Redis
docker run -d \
--name redis \
-p 6379:6379 \
redis:7-alpine
# MongoDB
docker run -d \
--name mongo \
-e MONGO_INITDB_ROOT_USERNAME=root \
-e MONGO_INITDB_ROOT_PASSWORD=123456 \
-p 27017:27017 \
mongo:6
# Nginx
docker run -d \
--name nginx \
-p 80:80 \
-v $(pwd)/html:/usr/share/nginx/html \
nginx:alpine
# PostgreSQL
docker run -d \
--name postgres \
-e POSTGRES_PASSWORD=123456 \
-e POSTGRES_DB=mydb \
-p 5432:5432 \
postgres:15
十、清理命令
bash
# 删除所有停止的容器
docker container prune
# 删除未使用的镜像
docker image prune
# 删除未使用的数据卷
docker volume prune
# 删除所有未使用的资源(镜像、容器、网络、缓存)
docker system prune -a
# 查看磁盘占用
docker system df
十一、常见问题
Q: 容器内无法访问外部网络?
bash
# 检查 DNS 配置
docker run --dns 8.8.8.8 nginx
Q: 端口被占用?
bash
# 查看端口占用(Mac/Linux)
lsof -i :8080
# Windows
netstat -ano | findstr 8080
Q: 容器时区不对?
bash
docker run -e TZ=Asia/Shanghai nginx
# 或在 Dockerfile 中
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime
Q: 镜像拉取慢?
配置国内镜像加速(Docker Desktop → Settings → Docker Engine):
json
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
]
}
文档版本:2026-05 | 覆盖 Docker 安装、基础命令、Dockerfile、Compose、项目部署全流程