什么是 Docker?为什么它改变了开发方式
在写代码的时候,你有没有遇到过这样的情况:
在本地运行得好好的项目,一放到服务器上就“爆红”?
错误信息五花八门:找不到某个库、版本不匹配、端口被占用……
这其实是“环境不一致”惹的祸。
而 Docker,就是为了解决这个问题而生的。
你可以把 Docker 想象成一个“虚拟的集装箱”——
它不只是装代码,而是把整个运行环境(操作系统、依赖库、配置文件、启动命令)全都打包进去。
无论你把它放到哪台机器上,只要这台机器装了 Docker,它就能原封不动地运行起来。
这种“一次构建,到处运行”的能力,正是现代开发流程的核心。
无论是前端、后端、数据科学,还是 DevOps,Docker 都是绕不开的工具。
所以,今天我们就来手把手带你完成一次完整的 Docker 教程,从安装到部署,全程实战,不讲废话。
安装 Docker:迈出第一步
在开始之前,你需要先安装 Docker。
它支持 Windows、macOS 和 Linux,安装过程非常简单。
在 macOS 上安装
打开终端(Terminal),执行以下命令:
brew install --cask docker
安装完成后,打开 Docker Desktop,等待它启动。
你会看到一个鲸鱼图标出现在菜单栏,表示服务已就绪。
在 Windows 上安装
下载并安装 Docker Desktop for Windows 。
安装时请确保启用 WSL2(Windows Subsystem for Linux 2),这是 Docker 在 Windows 上高效运行的关键。
在 Linux 上安装(以 Ubuntu 为例)
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker $USER
📌 注意:添加用户组后,需要重启终端或重新登录才能生效。
安装完成后,验证是否成功:
docker --version
如果输出类似 Docker version 24.0.6, build 28a7c31,说明安装成功!
Docker 核心概念:镜像、容器、仓库
理解这三个核心概念,是掌握 Docker 教程的关键。
镜像(Image)—— 代码的“模板”
镜像就像是一个“模板”或“快照”。
比如你有一个 Python 3.10 的环境,里面装了 Flask 框架,那么这个完整环境就是一张镜像。
你可以把它想象成一个“系统安装盘”——它本身不会运行,但能用来创建运行实例。
容器(Container)—— 镜像的“实例”
容器是镜像运行时的实例。
就像你从 U 盘复制系统到电脑,启动后就变成一个正在运行的系统。
容器就是运行中的镜像。
你可以同时运行多个相同镜像的容器,它们彼此隔离,互不影响。
仓库(Repository)—— 镜像的“存储库”
仓库是存放镜像的地方。
Docker Hub 就是最著名的公共仓库,就像 GitHub 之于代码。
你可以上传自己的镜像,也可以下载别人分享的镜像。
第一个 Docker 项目:用 Flask 搭建一个 Web 服务
现在我们来做一个真实的项目:用 Python + Flask 写一个“Hello, World!”网页服务,并用 Docker 打包它。
创建项目文件结构
mkdir flask-docker-demo
cd flask-docker-demo
touch app.py Dockerfile
编写 Flask 应用代码
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return '<h1>Hello, Docker!</h1>'
if __name__ == '__main__':
# 监听所有网络接口的 5000 端口
app.run(host='0.0.0.0', port=5000)
编写 Dockerfile
Dockerfile 是告诉 Docker 如何构建镜像的“说明书”。
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]
✅ 注释说明:
FROM指定基础镜像,这里是 Python 官方镜像。WORKDIR设置容器内工作目录,便于后续操作。COPY将本地文件复制到容器中,注意顺序。RUN在构建阶段执行命令,这里安装依赖。EXPOSE声明端口,但不实际开放,需运行时指定。CMD定义容器启动后默认运行的命令。
构建镜像
在项目根目录执行:
docker build -t flask-app:v1.0 .
📌
-t表示 tag,用来给镜像命名和版本标记。
.表示 Dockerfile 在当前目录。
构建成功后,用以下命令查看本地镜像:
docker images
你会看到类似输出:
REPOSITORY TAG IMAGE ID CREATED SIZE
flask-app v1.0 abc123def456 2 minutes ago 110MB
运行容器并访问服务
现在我们用刚才构建的镜像启动一个容器。
docker run -d -p 8000:5000 --name my-flask-app flask-app:v1.0
✅ 命令解释:
-d:后台运行(detached 模式)-p 8000:5000:将宿主机的 8000 端口映射到容器的 5000 端口--name my-flask-app:给容器起个名字,方便管理flask-app:v1.0:使用的镜像
打开浏览器,访问 http://localhost:8000,你应该能看到:
Hello, Docker!
🎉 成功了!你的第一个 Docker 应用上线了!
管理容器:查看、停止、删除
Docker 不只是运行,还支持灵活管理。
查看正在运行的容器
docker ps
输出示例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abc123def456 flask-app:v1.0 "python app.py" 2 minutes ago Up 2 minutes 0.0.0.0:8000->5000/tcp my-flask-app
查看所有容器(包括已停止的)
docker ps -a
停止容器
docker stop my-flask-app
删除容器
docker rm my-flask-app
删除镜像
docker rmi flask-app:v1.0
⚠️ 注意:删除镜像前,必须先删除使用它的容器。
Docker Compose:多容器应用的“指挥官”
当你的项目需要多个服务(比如前端 + 后端 + 数据库)时,一个一个运行容器太麻烦。
这时候,Docker Compose 就派上用场了。
创建 docker-compose.yml 文件:
version: '3.8'
services:
web:
build: .
ports:
- "8000:5000"
restart: unless-stopped
# 可选:添加一个 Redis 服务(用于缓存)
redis:
image: redis:7-alpine
restart: unless-stopped
然后运行:
docker-compose up -d
这会自动构建镜像(如果需要)、启动 web 和 redis 两个服务,全部在后台运行。
💡 优势:一键启动多个服务,配置集中管理,适合开发和测试环境。
结语:Docker 教程的终点,是起点
今天我们完成了从零开始的 Docker 教程:
从安装、核心概念,到实战项目部署,再到容器管理和多服务编排。
你已经掌握了现代开发中不可或缺的一环。
Docker 不只是工具,它是一种思维——
“环境即代码”,把运行环境也纳入版本控制,让协作更高效,部署更可靠。
无论你是前端、后端,还是运维,Docker 都值得你投入时间去掌握。
别再为“在我机器上能跑”而烦恼了,用 Docker,让代码“哪里都能跑”。
现在,就动手试试吧。
你的第一个 Docker 项目,可能就在今天诞生。