Docker 是一个轻量级容器化平台,通过将应用及其依赖打包到容器中,实现快速部署和环境一致性。以下是 Docker 的实践与应用场景举例,结合具体操作步骤:
一、基础实践
1. 快速启动一个容器
# 运行一个Nginx容器,映射宿主机80端口到容器80端口
docker run -d -p 80:80 --name my-nginx nginx
-d
: 后台运行-p
: 端口映射--name
: 容器名称
2. 查看容器状态
docker ps -a # 查看所有容器
docker logs my-nginx # 查看容器日志
3. 进入容器内部
docker exec -it my-nginx /bin/bash
二、应用场景举例
1. Web 服务部署
场景:部署一个 Python Flask 应用
步骤:
- 编写
Dockerfile
:dockerfile">FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
- 构建镜像:
docker build -t my-flask-app .
- 运行容器:
docker run -d -p 5000:5000 my-flask-app
2. 数据库容器化
场景:运行 MySQL 数据库并持久化数据
# 创建数据卷
docker volume create mysql_data# 启动MySQL容器
docker run -d \--name mysql-db \-e MYSQL_ROOT_PASSWORD=my-secret-pw \-v mysql_data:/var/lib/mysql \-p 3306:3306 \mysql:8.0
-v
: 将容器内的/var/lib/mysql
挂载到宿主机卷mysql_data
,实现数据持久化。
3. 多容器协作(Docker Compose)
场景:部署一个包含 Web 应用、Redis 缓存的完整服务
- 编写
docker-compose.yml
:version: '3' services:web:build: .ports:- "5000:5000"depends_on:- redisredis:image: redis:alpinevolumes:- redis_data:/data volumes:redis_data:
- 启动服务:
docker-compose up -d
4. 持续集成(CI/CD)
场景:在 GitLab CI 中运行测试
示例 .gitlab-ci.yml
:
test:image: node:16script:- npm install- npm test
三、进阶实践
1. 自定义网络
# 创建自定义网络
docker network create my-network# 将容器连接到网络
docker run -d --network my-network --name app1 my-app
docker run -d --network my-network --name app2 my-app
2. 镜像优化
- 使用多阶段构建减少镜像体积:
dockerfile"># 构建阶段 FROM golang:1.18 AS builder WORKDIR /app COPY . . RUN go build -o myapp# 运行阶段 FROM alpine:latest COPY --from=builder /app/myapp / CMD ["/myapp"]
四、常见问题解决
- 容器时区问题:
在Dockerfile
中设置时区:dockerfile">RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
- 容器内存限制:
docker run -m 512m --memory-swap 1g my-app
五、应用场景总结
场景 | 工具/技术 | 核心优势 |
---|---|---|
微服务部署 | Docker Compose | 环境隔离,一键启动 |
开发环境统一 | Docker镜像 | 消除“在我机器上能运行”问题 |
快速原型验证 | 预构建镜像(如Jupyter) | 秒级启动,无需安装依赖 |
蓝绿部署 | Docker Swarm/K8s | 无缝切换,零停机更新 |
通过 Docker 可以实现:
- 环境一致性:开发、测试、生产环境完全一致
- 快速部署:镜像秒级启动,无需配置依赖
- 资源隔离:每个容器独立运行,避免依赖冲突
- 弹性伸缩:结合 Kubernetes 实现自动扩缩容