Docker 使用完整指南

Docker 使用完整指南

从安装到项目部署的完整流程


一、安装 Docker

1.1 Windows 安装

  1. 前往官网下载:https://www.docker.com/products/docker-desktop
  2. 下载 Docker Desktop Installer.exe
  3. 双击安装,勾选 Use WSL 2 instead of Hyper-V
  4. 安装完成后重启电脑
  5. 打开 Docker Desktop,等待启动完成(任务栏图标变绿)

前置要求(Windows):

powershell 复制代码
# 以管理员身份运行 PowerShell,启用 WSL2
wsl --install
wsl --update
wsl --set-default-version 2

1.2 macOS 安装

  1. 前往官网下载 Docker Desktop for Mac
  2. 根据芯片选择版本:
    • Apple Silicon(M1/M2/M3)→ Apple Chip 版
    • Intel → Intel Chip 版
  3. 拖拽到 Applications 文件夹
  4. 启动 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、项目部署全流程

相关推荐
Yana.nice2 小时前
history 显示时间戳操作(Bash)
运维
正经教主2 小时前
【docker基础】第九周:Docker安全与镜像优化
运维·docker·容器
时佃鹏3 小时前
银河麒麟 V10 重装打印服务 (CUPS)+ 打印机驱动完整教程
运维·银河麒麟系统
Shepherd06193 小时前
【IT 运维】Apache 使用 mod_remoteip 恢复 Cloudflare 后的真实访客 IP
运维·tcp/ip·apache
王二端茶倒水3 小时前
智慧园区网络运营:认证、分权、运维和安全闭环
运维·物联网·架构
爱就是恒久忍耐3 小时前
现代CMake的build方式
linux·运维·服务器
三8444 小时前
重定向/管道符/通配符/转义字符/VI/VIM
运维·服务器
CodeStats4 小时前
【虚拟机】 从 CPU 指令到虚拟机隔离:虚拟机就是一个“模拟了完整硬件的普通进程”
java·docker
小坏蛋至尊宝4 小时前
如何优化文件传输的性能?
运维·服务器