Docker 入门指南:从零开始掌握容器化技术
什么是 Docker?
Docker 是一个开源的容器化平台,它允许开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中,然后在任何支持 Docker 的环境中运行。简单来说,Docker 解决了”在我机器上能运行”的经典问题。
为什么选择 Docker?
- 环境一致性:开发、测试、生产环境完全一致
- 快速部署:秒级启动,比传统虚拟机快得多
- 资源高效:容器共享主机内核,占用资源少
- 易于扩展:轻松实现应用的水平扩展
- 版本控制:镜像可以像代码一样进行版本管理
核心概念
1. 镜像 (Image)
镜像是一个只读的模板,包含了运行应用所需的所有内容:代码、运行时、库、环境变量和配置文件。
2. 容器 (Container)
容器是镜像的运行实例。你可以创建、启动、停止、移动或删除容器。
3. Dockerfile
一个文本文件,包含了构建 Docker 镜像所需的所有指令。
4. Docker Hub
Docker 的官方镜像仓库,你可以在这里找到和分享镜像。
安装 Docker
Windows/Mac
访问 Docker Desktop 下载并安装。
Linux (Ubuntu)
1 2
| curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh
|
验证安装:
基本命令
1. 拉取镜像
1 2 3 4 5
| docker pull nginx
docker pull nginx:1.21
|
2. 查看镜像
1 2 3 4 5
| docker images
docker inspect nginx
|
3. 运行容器
1 2 3 4 5 6 7 8 9 10
| docker run hello-world
docker run -d -p 8080:80 --name my-nginx nginx
|
4. 管理容器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 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
|
5. 容器交互
1 2 3 4 5 6 7 8
| docker exec -it my-nginx bash
docker logs my-nginx
docker logs -f my-nginx
|
6. 清理资源
1 2 3 4 5 6 7 8
| docker container prune
docker image prune
docker system prune -a
|
实战案例:运行一个 Node.js 应用
1. 创建应用文件
app.js
1 2 3 4 5 6 7 8 9 10 11
| const express = require('express'); const app = express(); const PORT = 3000;
app.get('/', (req, res) => { res.send('Hello from Docker!'); });
app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); });
|
package.json
1 2 3 4 5 6 7 8 9 10
| { "name": "docker-node-app", "version": "1.0.0", "dependencies": { "express": "^4.18.0" }, "scripts": { "start": "node app.js" } }
|
2. 编写 Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
|
3. 构建和运行
1 2 3 4 5 6 7 8
| docker build -t my-node-app .
docker run -d -p 3000:3000 --name node-app my-node-app
curl http://localhost:3000
|
Docker Compose:管理多容器应用
当应用需要多个容器协同工作时(如前端 + 后端 + 数据库),使用 Docker Compose 可以简化管理。
docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| version: '3.8'
services: web: build: . ports: - "3000:3000" environment: - NODE_ENV=production - DB_HOST=db depends_on: - db db: image: postgres:14 environment: - POSTGRES_PASSWORD=secretpassword - POSTGRES_DB=myapp volumes: - postgres_data:/var/lib/postgresql/data
volumes: postgres_data:
|
运行多容器应用:
1 2 3 4 5 6 7 8 9 10 11
| docker-compose up -d
docker-compose ps
docker-compose logs -f
docker-compose down
|
数据持久化:使用 Volume
容器删除后数据会丢失,使用 Volume 可以持久化数据:
1 2 3 4 5 6 7 8 9 10 11
| docker volume create my-data
docker run -d -v my-data:/app/data --name my-app nginx
docker volume ls
docker volume rm my-data
|
最佳实践
1. 优化镜像大小
- 使用轻量级基础镜像(如 alpine)
- 合并 RUN 指令减少层数
- 使用
.dockerignore 排除不必要的文件
.dockerignore
node_modules
npm-debug.log
.git
.env
*.md
2. 多阶段构建
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| FROM node:18 AS builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build
FROM node:18-alpine WORKDIR /app COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules CMD ["node", "dist/index.js"]
|
3. 安全建议
- 不要以 root 用户运行容器
- 定期更新基础镜像
- 扫描镜像漏洞
- 不在镜像中存储敏感信息
4. 健康检查
1 2
| HEALTHCHECK --interval=30s --timeout=3s \ CMD curl -f http://localhost:3000/health || exit 1
|
常见问题
1. 端口已被占用
1 2 3 4 5 6
| netstat -ano | findstr :8080 lsof -i :8080
docker run -p 8081:80 nginx
|
2. 容器无法访问
- 检查端口映射是否正确
- 确认防火墙规则
- 查看容器日志排查错误
3. 镜像构建慢
- 使用国内镜像源
- 优化 Dockerfile 层缓存
- 使用 BuildKit 加速
学习资源
总结
Docker 是现代应用开发和部署的必备工具。通过本文,你应该已经掌握了:
- Docker 的核心概念
- 基本命令和操作
- 如何编写 Dockerfile
- 如何使用 Docker Compose
- 最佳实践和常见问题