为什么你的开发环境总在“坑”里?
💡 推荐阅读:云服务器推荐前,先搞懂这4个“坑”!附保姆级选购与排错指南
相信不少朋友都有过这样的经历:代码在本地跑得好好的,一到同事电脑上就报错;或者新买一台电脑,光是配置 JDK、Node、Python 环境就得折腾一下午。这种“水土不服”的痛点,根源就在于应用运行环境的不一致。
而 Docker 的出现,正是为了解决这个问题。它就像一个集装箱,把你的代码和它需要的所有依赖(系统库、运行时、配置文件)打包在一起,无论搬到哪台机器上,都能保证环境完全一致。今天,站长就带大家从零开始,手把手写一份能直接落地的 Docker 开发实操教程,让你彻底告别“环境地狱”。
动手前的准备:这些前置条件你得有
💡 延伸阅读:Linux 服务器安全上云实操指南:从裸奔到堡垒机的进阶之路
在开始敲命令之前,我们需要确认两件事:硬件和软件。
- 操作系统:Windows 10/11 专业版(建议开启 WSL2)、macOS 或任意主流 Linux 发行版(如 Ubuntu 22.04)。
- 云服务器(可选但强烈推荐):如果你打算部署到公网,或者本地配置较低(内存小于 8G),站长建议你购买一台 2核4G 以上的云服务器。毕竟 Docker 本身比较吃内存,本地跑太吃力会影响开发效率。选择靠谱的云厂商,按量付费或包年都行,这是性价比最高的投入。
- 安装 Docker:请前往 Docker 官网下载对应平台的 Docker Desktop。安装完成后,打开终端(Terminal)验证一下:
docker --version
# 输出示例:Docker version 24.0.7, build afdd53b
看到版本号,说明 Docker 已经成功安装。如果你在 Linux 服务器上,记得将当前用户加入 docker 组,避免每次都要 sudo:
sudo usermod -aG docker $USER
# 执行后需重新登录终端生效
核心实操:从零构建你的第一个镜像
💡 深度技术指南:Nginx反向代理配置参数深度拆解:从入门到生产级调优的完整SOP
环境准备好了,我们直接进入正题。这里我们不搞复杂的业务,而是从一个最简单的 Python Flask 应用入手,走一遍完整的 “编写代码 -> 编写 Dockerfile -> 构建镜像 -> 运行容器” 流程。
第一步:创建项目文件
新建一个名为 my-flask-app 的目录,并在其中创建两个文件:app.py 和 requirements.txt。
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, Docker! 站长亲测有效。"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
# requirements.txt
Flask==3.0.0
第二步:编写 Dockerfile(自动化构建脚本)
在同一个目录下,创建一个没有后缀名的文件,命名为 Dockerfile。这是 Docker 的“施工图纸”。
# 使用官方 Python 3.11 运行时作为基础镜像
FROM python:3.11-slim
# 设置工作目录,后续命令都在此目录下执行
WORKDIR /app
# 将本地的 requirements.txt 复制到容器内
COPY requirements.txt .
# 安装依赖,--no-cache-dir 可以减少镜像体积
RUN pip install --no-cache-dir -r requirements.txt
# 将当前目录下的所有文件复制到容器内
COPY . .
# 声明容器运行时监听的端口
EXPOSE 5000
# 指定容器启动时执行的命令
CMD ["python", "app.py"]
这里有几个细节值得注意:先复制 requirements.txt 再复制源码,是为了利用 Docker 的缓存机制。只要依赖没变,重新构建镜像时就不会重复安装,速度会快很多。
第三步:构建并运行容器
在 my-flask-app 目录下打开终端,执行以下命令:
# 构建镜像,-t 参数是给镜像起名字和标签
docker build -t my-flask-app:v1 .
# 查看镜像是否构建成功
docker images
看到 my-flask-app 出现在列表里,说明构建成功。接下来,我们运行容器并做端口映射:
# -d 表示后台运行,-p 将宿主机的 5000 端口映射到容器的 5000 端口
docker run -d -p 5000:5000 --name my-flask-container my-flask-app:v1
# 查看运行中的容器
docker ps
此时,打开浏览器访问 http://localhost:5000,你应该能看到 “Hello, Docker!” 的字样。至此,你的第一个 Docker 容器已经成功跑起来了。
进阶实战:用 Docker Compose 编排多容器应用
单个容器只是开胃菜,实际开发中我们经常需要同时启动多个服务(比如 Web 应用 + Redis 缓存 + MySQL 数据库)。如果手动一个个启动,管理起来非常麻烦。这时候,Docker Compose 就派上用场了。
编写 docker-compose.yml
我们沿用上面的 Flask 项目,增加一个 Redis 服务。在项目根目录新建 docker-compose.yml 文件:
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- redis
# 环境变量示例,实际开发中可通过 .env 文件管理
environment:
- REDIS_HOST=redis
redis:
image: redis:7-alpine
ports:
- "6379:6379"
注意,我们需要修改 app.py 来连接 Redis,以验证多容器通信是否正常:
# app.py (修改版)
from flask import Flask
import redis
import os
app = Flask(__name__)
# 连接 Redis,host 直接写服务名 redis
r = redis.Redis(host=os.getenv('REDIS_HOST', 'localhost'), port=6379, decode_responses=True)
@app.route('/')
def hello():
# 计数器,每次刷新 +1
count = r.incr('visits')
return f"Hello, Docker! 这是你第 {count} 次访问本站。"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
一条命令启动整个项目
执行以下命令,Compose 会自动构建镜像、拉取 Redis 镜像并启动所有服务:
# 启动所有服务(-d 后台运行)
docker compose up -d
# 查看服务状态
docker compose ps
# 查看日志(用于排错)
docker compose logs -f web
再次访问 localhost:5000,每次刷新页面,计数都会 +1,说明 Flask 和 Redis 已经成功通过 Docker 内部网络通信了。这就是 Compose 的魅力:一份配置文件,搞定整个开发环境。
避坑清单:站长替你踩过的那些“雷”
实操过程中,有几个高频问题很容易让新手卡壳,这里集中说一下:
| 常见报错 | 原因分析 | 解决方案 |
|---|---|---|
port is already allocated |
宿主机端口被占用 | 换一个映射端口,如 -p 5001:5000,或使用 docker ps 查看占用情况,docker rm -f <容器名> 强制删除旧容器。 |
Cannot connect to the Docker daemon |
Docker 服务未启动或权限不足 | Linux 下执行 sudo systemctl start docker;mac/win 检查 Docker Desktop 是否已启动。 |
exec: "python": executable file not found |
基础镜像中没有 Python | 确保 Dockerfile 中的 FROM python:3.11-slim 写对,不要误用 alpine 等精简镜像(除非你手动安装 Python)。 |
| 构建速度极慢 | 未配置国内镜像加速器 | 在 Docker Desktop 的 Settings -> Docker Engine 中配置 registry-mirrors,填入国内加速地址(如 https://docker.mirrors.ustc.edu.cn)。 |
写在最后:让 Docker 成为你的开发“肌肉记忆”
通过本文的实操,你应该已经掌握了 Docker 最核心的两个技能:构建自定义镜像和使用 Compose 编排服务。这不仅是开发效率的提升,更是团队协作规范化的基础——新同事入职,只需要 git clone 代码,然后 docker compose up -d,十分钟内就能拥有和线上完全一致的开发环境。
当然,Docker 的世界远不止于此,比如数据卷(Volume)持久化、网络模式配置、K8s 集群编排等,都是进阶的方向。但只要你把今天这份教程里的基础打牢,后续的学习就会顺畅很多。如果在实操中遇到任何问题,欢迎在评论区留言,站长看到后会第一时间回复。
最后提醒一句:如果你打算把 Docker 部署到云端,一定要选择正规的云服务商,数据安全比省那几十块钱重要得多。祝大家都能早日摆脱环境配置的折磨,把精力花在真正有价值的代码上。
相关技术专题与延伸阅读
- 云服务器推荐前,先搞懂这4个“坑”!附保姆级选购与排错指南
- Linux 服务器安全上云实操指南:从裸奔到堡垒机的进阶之路
- Nginx反向代理配置参数深度拆解:从入门到生产级调优的完整SOP
- 天天用 Docker 却不知道它是不是开源?关于许可证、免费商用和“禁折腾”的真相,一次讲透
📦 【资源免费领】本文全套实操配置文件与避坑手册下载
本文涉及的全套 Docker Compose 配置文件、服务器运维避坑清单及 AI 提效指令库已完整打包,可免费极速转存:
💡 提示:推荐使用手机【夸克网盘 App】打开保存,新用户首月免费赠送 1TB 超大空间与免流量极速下载特权。