windows电脑WSL下本地构建docker镜像

没问题!在 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 镜像完整教程

前提条件:

  1. Windows 已安装 WSL2(不是WSL1)
  2. WSL 内部已经装好 Docker(Docker Desktop Windows 或者 WSL内原生docker)
  3. 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/c Windows磁盘,否则构建速度极慢。

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:给容器起名字

测试访问:

  1. 在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访问,看到新输出,完成镜像迭代。

相关推荐
%KT%5 小时前
ubuntu系统部署docker
运维·docker·容器
十二同学啊5 小时前
Docker 容器化技术详解:镜像、容器、网络与应用部署设计
网络·docker·eureka
I'mChloe5 小时前
不再逐台装Docker:我用Ansible Playbook批量统一服务器环境
服务器·docker·ansible
江湖有缘6 小时前
Docker实战 | 使用Docker部署Readeck书签管理工具
java·docker·eureka
十二同学啊6 小时前
Python FastAPI 项目使用 Docker 部署并映射端口(完整教程)
python·docker·fastapi
flytalei6 小时前
Kubernetes健康检查探针
云原生·容器·kubernetes
java_logo7 小时前
Docker 部署 Halo:轻松搭建开源个人博客
docker·容器·开源·博客·开源博客·halo·轩辕镜像
Linux实战笔记7 小时前
Docker多阶段构建优化生产配置手记:镜像瘦身最佳实践
ci/cd·docker·生产环境·多阶段构建·镜像瘦身
誰能久伴不乏7 小时前
QT工业上位机一次「指令静默丢失」的排查
qt·docker·github
TTATTC7 小时前
定时增量每 5 秒全表扫一遍?我用 DBSyncer 跑了三组对照实验才找到原因
docker·开源