Docker 是当今最流行的容器化技术,它改变了软件开发、测试和部署的方式。本文将带你从零开始学习 Docker,掌握容器化的核心技能。
什么是 Docker
Docker 是一个开源的容器化平台,它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中,然后在任何环境中运行。
Docker 的核心概念
- 镜像(Image):只读模板,包含运行应用所需的所有内容(代码、库、环境)
- 容器(Container):镜像的运行实例,可以启动、停止、删除
- 仓库(Repository):存储和共享镜像的地方,如 Docker Hub
- Dockerfile:描述如何构建镜像的文本文件
Docker 与虚拟机的区别
- 虚拟机:每个虚拟机包含完整的操作系统,启动慢、占用资源多
- Docker 容器:共享宿主机内核,启动快、占用资源少
- 隔离性:虚拟机隔离更强,Docker 隔离足够大多数场景
- 性能:Docker 接近原生性能,虚拟机有一定损耗
Docker 安装
Windows 安装
- 下载 Docker Desktop
- 确保启用 WSL 2(Windows Subsystem for Linux)
- 运行安装程序,按提示完成安装
- 启动 Docker Desktop,等待 Docker 引擎启动
Mac 安装
- 下载 Docker Desktop for Mac
- 根据芯片选择 Intel 或 Apple Silicon 版本
- 将 Docker 拖入 Applications 文件夹
- 启动 Docker 应用
Linux 安装(Ubuntu)
1 2 3 4 5 6 7
| sudo apt update
sudo apt install docker.io
sudo usermod -aG docker $USER
|
验证安装
Docker 常用命令
镜像管理命令
1 2 3 4 5 6 7 8 9 10
| docker search nginx
docker pull nginx:latest
docker images
docker rmi nginx:latest
|
容器管理命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| docker run -d --name mynginx -p 80:80 nginx
docker ps
docker ps -a
docker stop mynginx
docker start mynginx
docker rm mynginx
|
其他常用命令
1 2 3 4 5 6 7 8
| docker logs mynginx
docker exec -it mynginx bash
docker stats
|
Dockerfile 详解
Dockerfile 是构建 Docker 镜像的核心,它描述了如何一步步构建镜像。
基本示例
1 2 3 4 5 6 7 8 9 10 11 12 13
| FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
|
常用指令说明
- FROM:指定基础镜像
- WORKDIR:设置工作目录
- COPY:复制文件到镜像中
- RUN:在构建时执行命令
- ENV:设置环境变量
- EXPOSE:声明容器运行时监听的端口
- CMD:容器启动时执行的命令
- ENTRYPOINT:配置容器入口程序
构建镜像
1 2 3 4
| docker build -t myapp:1.0 .
docker run -d -p 8000:8000 myapp:1.0
|
Docker Compose
Docker Compose 用于定义和运行多容器 Docker 应用,通过 YAML 文件描述服务之间的关系。
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: - "8000:8000" volumes: - .:/app depends_on: - db environment: - DATABASE_URL=postgres://user:pass@db:5432/mydb
db: image: postgres:15 environment: POSTGRES_USER: user POSTGRES_PASSWORD: pass POSTGRES_DB: mydb volumes: - pgdata:/var/lib/postgresql/data
volumes: pgdata:
|
Compose 常用命令
1 2 3 4 5 6 7 8 9
| docker-compose up -d
docker-compose ps
docker-compose logs -f
docker-compose down
|
Docker 实际应用场景
1. 开发环境统一
团队成员使用相同的 Docker 镜像,避免"在我机器上能运行"的问题。
2. CI/CD 流水线
- 代码提交后自动构建 Docker 镜像
- 在容器中运行自动化测试
- 将通过测试的镜像推送到镜像仓库
- 在生产环境拉取新镜像并重启容器
3. 微服务部署
每个微服务打包成独立的容器,实现服务隔离和独立部署。
4. 数据库服务
1 2 3 4 5
| docker run -d \ --name mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -p 3306:3306 \ mysql:8.0
|
5. Nginx 反向代理
1 2 3
| docker run -d \ --name nginx \ -p 80:80 \ -v /path/to/nginx.conf:/etc/nginx/nginx.conf \ nginx:latest
|
Docker 最佳实践
1. 镜像优化
- 使用官方镜像作为基础
- 选择 alpine 或 slim 版本减小镜像体积
- 合并 RUN 指令,减少镜像层数
- 使用 .dockerignore 排除不必要文件
2. 安全实践
- 不要在镜像中硬编码密码
- 使用非 root 用户运行容器
- 定期更新基础镜像
- 扫描镜像漏洞
3. 数据管理
- 使用数据卷(Volume)持久化数据
- 不要在容器中存储重要数据
- 使用命名卷方便管理
4. 网络管理
1 2 3 4 5
| docker network create mynet
docker run -d --network mynet --name app myapp
|
常见问题与解决方案
1. 容器无法启动
1 2 3
| docker logs <container_id>
docker inspect <container_id>
|
2. 端口冲突
修改宿主机映射端口,或停止占用端口的进程。
3. 磁盘空间不足
总结
Docker 已经成为现代软件开发不可或缺的工具,掌握 Docker 能够:
- 简化部署:一次构建,到处运行
- 环境一致:开发、测试、生产环境统一
- 提升效率:快速启动、易于扩展
- 资源利用:比虚拟机更轻量高效
学习 Docker 的关键在于多实践,从简单的单容器应用开始,逐步掌握多容器编排和 CI/CD 集成。希望本文能帮助你快速入门 Docker,在容器化的道路上越走越远!