没问题!在 WSL 里从零构建 Docker 镜像,是学习容器化最好的方式。我们不走捷径(不直接用 docker pull),而是亲手写配置文件、打包应用、构建并运行。
跟着下面 5 步走,你就能拥有自己构建的第一个镜像。
第 1 步:确认 WSL 环境就绪
先确保 Docker 能在 WSL 里运行(不需要在 Windows 装 Docker Desktop,WSL 内可直接安装引擎)。
bash
# 检查 Docker 是否安装
docker --version
# 如果没安装,一键安装(适用于 Ubuntu/Debian)
sudo apt update && sudo apt install docker.io -y
# 关键:给当前用户权限,免 sudo 运行(需要重启终端生效)
sudo usermod -aG docker $USER
安装后如果提示服务未启动,执行
sudo service docker start即可。
WSL2 从零本地构建 Docker 镜像完整教程
前提条件:
- Windows 已安装 WSL2(不是WSL1)
- WSL 内部已经装好 Docker(Docker Desktop Windows 或者 WSL内原生docker)
- WSL终端可以正常执行
docker info、docker --version,没有报错
小提示:如果你用的是 Windows Docker Desktop,记得开启Settings → Resources → WSL Integration,打开你所用发行版的开关,WSL里面就可以直接用windows的docker引擎。
第一步:确认docker环境正常
打开你的WSL终端(Ubuntu等)
bash
# 查看版本
docker --version
# 查看服务状态,确认没有报错
docker info
如果这里报错,先解决docker启动问题,再往下。
第二步:创建项目文件夹(全部操作在WSL内部,不要在Windows资源管理器操作)
⚠️重要:代码、Dockerfile建议放在WSL文件系统内(
~/下面),不要挂载到/mnt/cWindows磁盘,否则构建速度极慢。
bash
# 创建工作目录并进入
mkdir ~/docker-demo
cd ~/docker-demo
我们做一个极简示例:一个简单的 Python web 小应用,用来练习构建镜像。
1. 写简单应用代码 app.py
bash
cat > app.py << 'EOF'
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello Docker! Build image locally from WSL\n"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
EOF
2. 依赖文件 requirements.txt
bash
cat > requirements.txt << 'EOF'
flask==2.3.3
EOF
3. 核心文件:Dockerfile(没有后缀!文件名就叫 Dockerfile)
Dockerfile 是镜像构建脚本,docker 靠这个文件一步步生成镜像。
bash
cat > Dockerfile << 'EOF'
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
# pip指定清华pypi源
RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]
EOF
现在目录里面应该有3个文件:
~/docker-demo/
├── app.py
├── requirements.txt
└── Dockerfile
可以用 ls 确认文件都存在。
第三步:本地构建 docker 镜像
更换可用的镜像源
bash
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<'EOF'
{
"registry-mirrors": [
"https://docker.nju.edu.cn",
"https://docker.m.daocloud.io",
"https://mirror.baidubce.com"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
然后:
语法:docker build -t <镜像名:标签> .
末尾那个 . 代表构建上下文是当前文件夹,千万不能丢。
bash
docker build -t my-flask-demo:v1 .
执行后你会看到 docker 按顺序执行 Dockerfile 每一行步骤:
Step 1/6 : FROM python:3.11-slim
Step 2/6 : WORKDIR /app
Step 3/6 : COPY requirements.txt .
Step 4/6 : RUN pip install ...
Step 5/6 : COPY app.py .
Step 6/6 : EXPOSE 5000
Step 7/7 : CMD ["python","app.py"]
每一个Step都会生成一层镜像层,docker会做缓存;修改代码重新构建,不变的步骤会直接复用缓存,速度很快。
查看本地已经构建好的镜像
bash
docker images
你可以看到列表里出现 my-flask-demo,TAG是 v1。
第四步:用自己构建出来的镜像启动容器测试
bash
docker run -d -p 5000:5000 --name demo-container my-flask-demo:v1
参数说明:
-d:后台运行-p 5000:5000:宿主机(WSL)端口5000映射容器内部5000--name demo-container:给容器起名字
测试访问:
- 在WSL里面访问:
bash
curl http://127.0.0.1:5000
看到输出 Hello Docker! Build image locally from WSL 代表成功。
如果你是Docker Desktop,Windows浏览器直接打开
http://localhost:5000也可以访问。
查看正在运行容器:
bash
docker ps
第五步:修改代码,重新构建,体验镜像更新
修改 app.py:
bash
cat > app.py << 'EOF'
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "✅我修改了代码,重新build本地镜像成功!\n"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
EOF
重新构建,换一个版本标签 v2:
bash
docker build -t my-flask-demo:v2 .
停止旧容器,用新版本镜像启动:
bash
# 停止旧容器
docker stop demo-container
# 删除旧容器
docker rm demo-container
# 启动v2版本
docker run -d -p 5000:5000 --name demo-container my-flask-demo:v2
curl访问,看到新输出,完成镜像迭代。