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持久化保存。

第五步:生产部署最佳实践

开发环境和生产环境的配置差异:

  1. 使用多阶段构建减小镜像体积——构建阶段用完整镜像,运行阶段用alpine精简镜像
  2. 非root用户运行容器——在Dockerfile中添加RUN useradd -m myuser和USER myuser
  3. 健康检查——添加HEALTHCHECK指令,让Docker自动检测应用是否正常运行
  4. 日志管理——配置日志驱动,避免容器日志占满磁盘
  5. 资源限制——运行时用–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%。核心建议是:任何有多个服务、多人协作、需要部署的项目,都应该容器化。