Skip to content
On this page

Docker 入门指南

环境准备

在开始使用 Docker 之前,需要确保系统满足以下要求:

系统要求

  • Windows: Windows 10 64位: Pro, Enterprise, or Education (Build 15063 or later)
  • macOS: macOS 10.13 或更高版本
  • Linux: 内核版本 3.10 或更高

安装 Docker

Windows/macOS

  1. 访问 Docker 官网
  2. 下载 Docker Desktop
  3. 运行安装程序并按照提示完成安装
  4. 启动 Docker Desktop

Linux (Ubuntu)

bash
# 更新包索引
sudo apt-get update

# 安装 Docker
sudo apt-get install docker.io

# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker

# 将当前用户添加到 docker 组(避免每次使用 sudo)
sudo usermod -aG docker $USER

验证安装:

bash
docker --version
docker run hello-world

基本概念

镜像 (Image)

Docker 镜像是一个只读模板,包含运行应用程序所需的所有内容。

容器 (Container)

容器是镜像的运行实例,可以被启动、停止、移动和删除。

仓库 (Repository)

仓库是存储和分发镜像的服务。

第一个 Docker 应用

1. 创建简单的 Node.js 应用

创建项目目录:

bash
mkdir my-node-app
cd my-node-app

创建 package.json

json
{
  "name": "my-node-app",
  "version": "1.0.0",
  "description": "A simple Node.js app",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "express": "^4.18.0"
  }
}

创建 index.js

javascript
const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello Docker!');
});

app.get('/health', (req, res) => {
  res.json({ status: 'OK', timestamp: new Date().toISOString() });
});

app.listen(port, '0.0.0.0', () => {
  console.log(`App running at http://localhost:${port}`);
});

2. 创建 Dockerfile

创建 Dockerfile

docker
# 使用官方 Node.js 16 Alpine 镜像作为基础镜像
FROM node:16-alpine

# 设置工作目录
WORKDIR /app

# 复制 package.json 和 package-lock.json (如果存在)
COPY package*.json ./

# 安装依赖
RUN npm install

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 3000

# 定义容器启动时执行的命令
CMD ["npm", "start"]

3. 构建和运行

构建镜像:

bash
# 构建镜像,指定标签为 my-node-app:latest
docker build -t my-node-app:latest .

运行容器:

bash
# 运行容器,将本地端口 3000 映射到容器端口 3000
docker run -p 3000:3000 my-node-app:latest

在浏览器中访问 http://localhost:3000,应该能看到 "Hello Docker!"。

常用命令详解

镜像管理命令

bash
# 查看所有镜像
docker images

# 拉取镜像
docker pull nginx

# 删除镜像
docker rmi nginx

# 构建镜像
docker build -t app-name:tag .

# 查看镜像历史
docker history image-name

# 查看镜像详细信息
docker inspect image-name

容器管理命令

bash
# 运行容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

# 常用选项:
# -d: 后台运行
# -p: 端口映射
# -v: 卷挂载
# --name: 指定容器名称
# -e: 设置环境变量

# 示例
docker run -d -p 8080:80 --name my-nginx nginx

# 查看运行中的容器
docker ps

# 查看所有容器
docker ps -a

# 停止容器
docker stop container-name

# 启动容器
docker start container-name

# 重启容器
docker restart container-name

# 删除容器
docker rm container-name

# 强制删除运行中的容器
docker rm -f container-name

# 查看容器日志
docker logs container-name

# 实时查看容器日志
docker logs -f container-name

# 进入运行中的容器
docker exec -it container-name /bin/bash

# 查看容器详细信息
docker inspect container-name

# 查看容器资源使用情况
docker stats container-name

实用示例

运行一个 Nginx 服务器

bash
# 拉取并运行 Nginx
docker run -d -p 8080:80 --name my-nginx nginx

# 访问 http://localhost:8080

运行一个数据库

bash
# 运行 MySQL
docker run -d -p 3306:3306 --name mysql-db -e MYSQL_ROOT_PASSWORD=mypassword mysql:8.0

# 运行 Redis
docker run -d -p 6379:6379 --name my-redis redis:alpine

Dockerfile 详解

基本指令

docker
# 指定基础镜像
FROM node:16-alpine

# 设置环境变量
ENV NODE_ENV=production
ENV PORT=3000

# 设置工作目录
WORKDIR /app

# 复制文件
COPY package*.json ./
COPY . .

# 执行命令
RUN npm install
RUN mkdir -p /app/logs

# 暴露端口
EXPOSE 3000

# 添加用户(安全考虑)
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001

# 设置卷
VOLUME ["/app/logs"]

# 定义容器启动命令
CMD ["npm", "start"]

# 或者使用 ENTRYPOINT
ENTRYPOINT ["node", "server.js"]

最佳实践

1. 多阶段构建

docker
# 构建阶段
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 运行阶段
FROM node:16-alpine AS runner
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/index.js"]

2. 使用 .dockerignore

创建 .dockerignore 文件:

node_modules
npm-debug.log
.git
.gitignore
README.md
.env
.nyc_output
coverage
.env
.vscode

Docker Compose 入门

Docker Compose 用于定义和运行多容器的 Docker 应用。

安装 Docker Compose

Docker Desktop 已包含 Docker Compose。在 Linux 上:

bash
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

docker-compose.yml 示例

创建 docker-compose.yml

yaml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
    volumes:
      - .:/app
      - /app/node_modules
    depends_on:
      - redis
      - db

  redis:
    image: redis:alpine
    ports:
      - "6379:6379"

  db:
    image: postgres:13
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

常用 Docker Compose 命令

bash
# 构建并启动所有服务
docker-compose up

# 后台运行
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs

# 实时查看日志
docker-compose logs -f

# 停止服务
docker-compose down

# 重新构建并启动
docker-compose up --build

# 只启动特定服务
docker-compose up web

# 扩展服务实例
docker-compose up --scale web=3

实践项目:部署一个完整的应用

项目结构

my-fullstack-app/
├── frontend/
│   ├── Dockerfile
│   ├── package.json
│   └── src/
├── backend/
│   ├── Dockerfile
│   ├── package.json
│   └── src/
├── nginx/
│   └── nginx.conf
└── docker-compose.yml

后端 Dockerfile

docker
FROM node:16-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3001

CMD ["npm", "start"]

前端 Dockerfile

docker
FROM node:16-alpine AS builder

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

FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

docker-compose.yml

yaml
version: '3.8'

services:
  backend:
    build: ./backend
    ports:
      - "3001:3001"
    environment:
      - DB_HOST=db
      - REDIS_HOST=redis
    depends_on:
      - db
      - redis

  frontend:
    build: ./frontend
    ports:
      - "80:80"
    depends_on:
      - backend

  db:
    image: postgres:13
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis:alpine

volumes:
  postgres_data:

启动应用:

bash
docker-compose up --build

故障排除

常见问题

1. 容器无法启动

bash
# 查看容器日志
docker logs container-name

# 检查容器状态
docker inspect container-name

2. 端口冲突

bash
# 查看端口使用情况
docker port container-name

# 使用不同的端口映射
docker run -p 8080:80 image-name

3. 网络问题

bash
# 查看网络
docker network ls

# 创建自定义网络
docker network create my-network

# 在网络中运行容器
docker run --network my-network image-name

总结

通过本指南,您已经学会了:

  1. Docker 的基本概念和安装
  2. 创建和运行第一个 Docker 应用
  3. 编写 Dockerfile
  4. 使用 Docker Compose 管理多容器应用
  5. 常用的 Docker 命令

Docker 是现代应用开发和部署的重要工具,掌握它将大大提高您的开发效率和应用的可移植性。