Docker解决什么问题
开发环境一切正常,部署到服务器就报错——依赖版本不对、缺少系统库、路径差异。Docker把应用和它所需的一切打包成一个容器镜像,开发环境和生产环境运行完全相同的容器,彻底消除环境差异带来的问题。
第一步:安装Docker
Windows/Mac用户下载Docker Desktop安装包,按向导安装。Linux用户:
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
安装完成后验证:docker –version 和 docker run hello-world。如果hello-world容器成功运行,说明安装正确。
第二步:编写Dockerfile
Dockerfile是镜像的构建脚本。以Python Flask应用为例:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install –no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD [python, app.py]
逐行解释:FROM指定基础镜像,WORKDIR设置工作目录,COPY复制文件,RUN执行命令,EXPOSE声明端口,CMD设置启动命令。
优化技巧:把requirements.txt单独COPY并提前安装依赖,这样代码改动时不会重新安装依赖,利用Docker缓存加速构建。
第三步:构建与运行镜像
在Dockerfile所在目录执行:
docker build -t myapp:1.0 .
-t指定镜像名称和标签,.表示使用当前目录的Dockerfile。
运行容器:
docker run -d -p 5000:5000 –name myapp myapp:1.0
-d后台运行,-p映射端口(主机5000映射到容器5000),–name指定容器名。
常用管理命令:
- docker ps ——查看运行中的容器
- docker logs myapp ——查看容器日志
- docker exec -it myapp bash ——进入容器内部
- docker stop myapp ——停止容器
第四步:Docker Compose多服务编排
实际应用通常需要多个服务:Web应用+数据库+缓存。docker-compose.yml定义多服务:
version: ‘3.8’
services:
web:
build: .
ports: [5000:5000]
depends_on: [db]
environment:
DATABASE_URL: postgresql://user:pass@db:5432/mydb
db:
image: postgres:15
volumes: [postgres_data:/var/lib/postgresql/data]
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
volumes:
postgres_data:
启动所有服务:docker-compose up -d。停止:docker-compose down。这个配置让Web应用和数据库一键启动,而且数据通过volume持久化保存。
第五步:生产部署最佳实践
开发环境和生产环境的配置差异:
- 使用多阶段构建减小镜像体积——构建阶段用完整镜像,运行阶段用alpine精简镜像
- 非root用户运行容器——在Dockerfile中添加RUN useradd -m myuser和USER myuser
- 健康检查——添加HEALTHCHECK指令,让Docker自动检测应用是否正常运行
- 日志管理——配置日志驱动,避免容器日志占满磁盘
- 资源限制——运行时用–memory和–cpus限制容器资源使用
多阶段构建示例:
FROM python:3.11 AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install –user -r requirements.txt
FROM python:3.11-alpine
WORKDIR /app
COPY –from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
CMD [python, app.py]
常见问题与误区
- 镜像体积过大——使用alpine或slim基础镜像,多阶段构建,清理缓存
- 数据丢失——容器是临时的,重要数据必须用volume或bind mount持久化
- 端口冲突——检查主机端口是否被占用,用docker ps查看已有映射
- 时区问题——容器默认UTC时间,需要挂载/etc/localtime或设置TZ环境变量
效率数据
实测:一个新成员加入项目,传统方式配环境(安装Python、数据库、依赖)约2小时,用Docker只需安装Docker并运行docker-compose up -d,5分钟搞定。部署到生产环境,传统方式手动上传文件、安装依赖、配置服务约30分钟,用Docker推送镜像+服务器拉取运行约5分钟。环境一致性带来的收益更难量化——以前约30%的生产bug是环境差异导致,Docker化后接近0%。核心建议是:任何有多个服务、多人协作、需要部署的项目,都应该容器化。