Docker的安装与使用

本文最后更新于 2026年3月10日 晚上

本文主要介绍了Docker的安装与使用。

安装

Get Docker | Docker Docs

Windows 11

系统要求

  1. 我应该使用 Hyper-V 还是 WSL?

    Docker Desktop 的功能在 WSL 和 Hyper-V 上保持一致,没有对任何一种架构的偏好。 Hyper-V 和 WSL 各有优缺点,具体取决于您的具体设置和计划的用例。

  2. 要运行 Windows containers,您需要 Windows 10 或 Windows 11 专业版或企业版。 Windows 家庭版或教育版仅允许您运行 Linux containers。

安装步骤

  1. 安装WSL。

    https://learn.microsoft.com/en-us/windows/wsl/install

    1. 管理员模式打开 PowerShell 或 Windows 命令提示符:

      1
      wsl --install

      使用wsl --install命令安装的新 Linux 安装将默认设置为 WSL 2。要查看您的 Linux 发行版是设置为 WSL 1 还是 WSL 2,请使用命令: wsl -l -v

    2. 重启计算机。

    3. 计算机重启后会自动打开终端安装Ubuntu,提示创建用户名和密码后可正常使用。(第一次启动新安装的 Linux 发行版时,将打开一个控制台窗口,系统会要求您等待文件解压缩并存储在您的计算机上。未来所有的启动都将花费不到一秒的时间。)

    4. (可选)遵循设置 WSL 开发环境的最佳实践指南,逐步了解如何为已安装的 Linux 发行版设置用户名和密码、使用基本 WSL 命令、安装和自定义 Windows 终端、设置 Git 版本控制、使用 VS Code 远程服务器进行代码编辑和调试、文件存储的良好实践、设置数据库、安装外部驱动器、设置 GPU 加速等。

    5. (可选)运行wsl --list --online以查看可用发行版的列表,并运行wsl --install -d <DistroName>以安装发行版。

      要更改版本,请使用以下命令: wsl --set-version <distro name> 2<distro name>替换为您要更新的 Linux 发行版的名称。例如, wsl --set-version Ubuntu-20.04 2 将设置您的 Ubuntu 20.04 发行版以使用 WSL 2。

    6. (可选)要卸载 WSL,请参阅卸载旧版本的 WSL取消注册或卸载 Linux 发行版

  2. 开始虚拟化。

    1. 启用 Hyper-V 虚拟化平台。

      Windows 11 家庭版和专业版:启用 Hyper-V 虚拟化平台的步骤

      Hyper-V 预安装在 Windows 11 专业版、企业版和教育版中,只需启用即可。但是,在其他版本(如 Windows 11 家庭版)中,缺少启用 Hyper-V 的选项。

      并非所有计算机硬件都设计为运行虚拟机管理程序。因此,您必须首先确认您的硬件是否支持它。打开终端,输入:

      1
      systeminfo

      这将生成一个列表,您将在列表末尾找到“Hyper-V 要求”部分,如果满足这些要求,结果将显示为“是”。但是,如果您发现“在固件中启用虚拟化”状态为“否”,则需要使用下面的指南启用它。

      1. 在 Windows 11 电脑上安装/启用 Hyper-V 之前,请确保已从系统 BIOS 启用它。在上面的步骤中,如果您发现“在固件中启用虚拟化”状态为“否”,则需要启用它。操作方法如下:

        1. 重新启动计算机并使用热键进入 BIOS 设置。
        2. 在 Bios 中查找“虚拟化”选项卡并单击它以启用。不同主板 Bios 选项不同,您可以搜索不同品牌 Bios 中启用虚拟化教程。
        3. 保存新设置并退出 BIOS。系统现在将正常重新启动。
      2. 如果你有 Windows 11 家庭版,请按照以下步骤安装 Hyper-V。复制以下批处理代码,新建空白文本后保存,保存更改文本 .txt 后缀为 .bat 格式,这样就能变为批处理脚本。右键以管理员身份运行即可。

        1
        2
        3
        4
        5
        6
        7
        8
        pushd "%~dp0"
        dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
        for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
        for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
        del hyper-v.txt
        Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
        Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
        pause

        重新启动后,Hyper-V 将在您的 Windows 上安装并自动启用。

    2. 在电脑上打开“控制面板”->“程序”-> “启动或关闭Windows功能”。

    3. 勾选:

      • Hyper-V
      • Windows虚拟机监控程序平台
      • 适用于Linux的Windows子系统
      • 虚拟机平台
    4. 重启计算机。

  3. 安装Docker。

    【Docker】掌握 Docker魔法:Windows 11 平台上的完美容器部署终极指南

    1. 下载Docker Desktop for Windows-x86 64
    2. 双击Docker Desktop Installer.exe进行安装。
      1. OK -> Close and log out
    3. 重新登录后自动打开了Docker界面 -> Accept -> Sign up or Sign in。
  4. 测试。

    Docker 入门教程

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    docker version  # 查看版本

    docker pull hello-world # 拉取

    docker image ls # 列出本机的所有 image 文件。
    docker ps # 列出 Docker 容器
    # docker container run命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取。
    docker container run hello-world # 输出这段提示以后,hello world就会停止运行,容器自动终止。
    # 有些容器不会自动终止,因为提供的是服务。比如,安装运行 Ubuntu 的 image,就可以在命令行体验 Ubuntu 系统。
    docker container run -it ubuntu bash
    exit # 退出容器且关闭

    # 对于那些不会自动终止的容器,必须使用docker container kill 命令手动终止。
    docker container kill [containID]

    docker image rm [imageName] # 删除 image 文件
  5. 完成。

Ubuntu 18.04

TODO

报错

WSL integration with distro 'Ubuntu' unexpectedly stopped. Do you want to restart it?

解决:

下面是一套从低风险到“重置”的排查顺序。建议按顺序做;每一步做完都尝试重新启动 Docker Desktop。

  1. 先确认:你的发行版名是不是 Ubuntu 还是 ubuntu:

    1. Docker 的日志里出现了 -d ubuntu,但你系统里发行版名称可能是 Ubuntu(大写 U)。在 PowerShell(管理员或普通都行)执行:

      1
      wsl -l -v

      看列表里 Ubuntu 的 NAME 是不是 UbuntuUbuntu-22.04Ubuntu-24.04 等。

    2. 如果你根本没有名为 ubuntu 的发行版,而是 Ubuntu(或别的名字),那 Docker Desktop 可能绑定了错误的 distro 名称。

    3. 解决:Docker Desktop → Settings → Resources → WSL integration,把对应的 Ubuntu 勾选取消再勾上,必要时对正确的发行版启用集成。

  2. 完全关闭 WSL 和 Docker Desktop 后重启:

    1. 退出 Docker Desktop(托盘右键 Quit)。

    2. PowerShell 执行:

      1
      wsl --shutdown
    3. 再启动 Docker Desktop。

    4. 很多“WSL integration unexpectedly stopped”是 WSL 内部残留进程/挂载没清理干净,这一步就能恢复。

  3. 检查 Ubuntu 在 WSL 里是否能正常启动、root 是否可用:

    1. Docker 用的是 -u root。如果你的 Ubuntu 被你改坏了(比如 /etc/wsl.conf、root 被锁、文件系统错误等),就会导致它启动命令失败。

    2. 测试:

      1
      2
      3
      wsl -d Ubuntu
      # 以及 root:
      wsl -d Ubuntu -u root -e sh -lc "id && uname -a && ls -la /"

      把上面命令里的 Ubuntu 替换成你在 wsl -l -v 里看到的实际名字。

    3. 如果 Ubuntu 进不去root 执行就失败:先把 Ubuntu 修好(例如文件系统、wsl.conf、发行版损坏)。

    4. 如果你看到输出正常,继续下一步。

  4. 检查并修复 WSL 组件:

    1. Windows 11 上 Docker Desktop 对 WSL2 依赖很重。你可以直接更新/修复:

      1
      2
      wsl --update
      wsl --status
    2. 然后重启电脑,再试 Docker Desktop。

  5. 是否开启了 systemd / 自定义了 wsl.conf(会引发 Docker 集成异常):

    1. 如果你在 Ubuntu 里启用了 systemd 或做过特殊配置,有时会影响 Docker Desktop 的代理启动。

    2. 在 Ubuntu 里检查:

      1
      cat /etc/wsl.conf 2>/dev/null || true
    3. 如果你看到类似:

      1
      2
      [boot]
      systemd=true
    4. 建议先临时关闭验证(把 systemd=true 注释/改为 false),然后在 Windows 执行:

      1
      wsl --shutdown
    5. 再试 Docker Desktop。

  6. 重置 Docker Desktop 的 WSL 发行版(最有效,但会清掉镜像/容器数据):

    1. 如果上面都正常,最常见的最终修复是:docker-desktop 或 docker-desktop-data 这两个 WSL 发行版坏了。重置它们通常立刻解决,但代价是 Docker 数据会被清空(镜像、容器、volume 等会丢)。

    2. 先看看它们是否存在:

      1
      wsl -l -v
    3. 如果看到:

      • docker-desktop
      • docker-desktop-data
    4. 执行(会清数据):

      1
      2
      3
      wsl --shutdown
      wsl --unregister docker-desktop
      wsl --unregister docker-desktop-data
    5. 然后重新启动 Docker Desktop,它会自动重建这两个发行版。

  7. 如果你不想清数据:先导出再重置(保守方案):

    1. 如果你很在意 docker-desktop-data 里的数据,可以先 export(需要磁盘空间):

      1
      2
      wsl --shutdown
      wsl --export docker-desktop-data "$env:USERPROFILE\Desktop\docker-desktop-data.tar"
    2. 然后再执行上一步 unregister,之后理论上也可以 --import 恢复,但恢复路径和 Docker Desktop 的期望布局可能不完全兼容;通常更推荐接受“重置数据”,或者改走 Docker Desktop 自带的备份/镜像仓库方案。

  8. 完成。

docker: Error response from daemon: ports are not available

核心原因:端口 3000 被占用了,或者更具体地说,Windows 系统保留了一段端口范围(Hyper-V / WSL2 动态端口),而 3000 恰好落在这个范围内,导致 Docker 无法绑定该端口。

解决:

  1. 方案一:重启 Windows NAT 服务(最快,临时有效):

    1. 以 管理员身份 打开 PowerShell 或 CMD。

    2. 依次执行以下两条命令:

      1
      2
      net stop winnat
      net start winnat
    3. 重新运行你的 Docker 启动命令。

    如果重启后过一段时间又出现这个问题,说明系统再次将 3000 划入了保留范围,请尝试方案二。

  2. 方案二:修改 Docker 映射端口(最稳妥):

    1. 既然 3000 被系统占用了,最简单的办法是换一个宿主机端口。

    2. 如果你的命令是:

      1
      docker run -p 3000:3000 ...
    3. 将其改为其他端口(例如 3001):

      1
      docker run -p 3001:3000 ...
    4. 然后通过 http://localhost:3001 访问即可。

  3. 方案三:排除保留端口范围(永久解决):

    1. 如果你必须使用 3000 端口,且方案一无效,你需要告诉 Windows 不要保留 3000 这个端口。

    2. 查看当前保留的端口范围:在管理员 PowerShell 中运行:

      1
      netsh interface ipv4 show excludedportrange protocol=tcp

      你会看到类似这样的输出:

      1
      2
      3
      4
      5
      6
      Protocol tcp Port Exclusion Ranges

      Start Port End Port
      ---------- --------
      3000 3099 <-- 如果 3000 在这里面,就是问题所在
      ...
    3. 添加排除项(将 3000 从保留区移除):我们需要先保留一个临时的范围覆盖住 3000,然后重启 WinNAT 服务来重置随机分配,最后删除临时范围。

      步骤 A:强制保留 3000(防止系统随机分配它)

      1
      netsh int ipv4 add excludedportrange protocol=tcp startport=3000 numberofports=1

      步骤 B:重启 WinNAT 服务(应用更改并清除之前的随机保留)

      1
      2
      net stop winnat
      net start winnat

      步骤 C:现在 3000 应该可用了。你可以选择删除刚才添加的排除项(可选,通常不需要删,留着也没事)

      1
      netsh int ipv4 delete excludedportrange protocol=tcp startport=3000 numberofports=1

      有些情况下,只要执行完步骤 A 和 B,Docker 就能正常启动了,不需要执行步骤 C。

    4. 完成。

  4. 方案四:检查是否有其他程序占用

    1. 虽然概率较小(因为报错是 "forbidden by access permissions" 而不是 "address already in use"),但也可能是某个程序真的占用了 3000。

    2. 查找占用端口的进程:

      1
      netstat -ano | findstr :3000
    3. 如果有输出,记下最后的 PID(进程ID),然后在任务管理器中结束该进程,或者使用 taskkill /PID <进程ID> /F

  5. 完成。

使用

概述

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 Ubuntu 16.04 就包含了完整的一套 Ubuntu 16.04 最小系统的 root 文件系统。

  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
docker images -a  # 列出所有镜像
docker images --digests # 显示镜像的摘要信息
docker ps # 显示正在运行的容器
docker ps -a # 显示所有(包括已停止)容器

docker commit --pause=false <container_id> <new_image_name> # (在不暂停容器的情况下)将容器的当前状态保存为新的Docker镜像

# 打标签
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

# 拉取
docker pull [OPTIONS] NAME[:TAG|@DIGEST] # 增量更新:第二次拉取或更新镜像时速度很快的原因
# 旧image:确实还留在硬盘上。Docker 不会删除它们,因为 Docker 的机制是“追加新层”,而不是“原地修改”。
# 但是,如果您没有提前执行 docker tag 且 不记得Image ID,则无法再使用旧image。
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] # (可选)打标签备份当前版本

# 运行
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run -d # 后台运行容器。关闭终端后容器继续正常运行
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] # (可选)打标签备份当前版本

# 更新
docker tag ghcr.io/open-webui/open-webui:main ghcr.io/open-webui/open-webui:v1.1.1 # (可选)备份当前image版本
docker pull ghcr.io/open-webui/open-webui:main # 只需要重新拉取新的image即可(增量更新)
docker tag ghcr.io/open-webui/open-webui:main ghcr.io/open-webui/open-webui:v1.1.2 # (可选)标记更新后的image版本
# 停止并删除旧容器
docker stop open-webui
docker rm open-webui
# 重新创建新容器
docker run -d --name open-webui ... (完整命令)

# 删除
docker stop container_name_or_id
docker rm container_name_or_id
docker rmi <image_1_id_or_name> <image_2_id_or_name> <image_3_id_or_name>
docker image prune # 移除没有标签(docker images --digests)并且没有被容器引用(docker ps -a)的镜像,这种镜像被称为 dangling(摇晃的) 镜像
# -a: Deletes all images not used by any container, not just dangling ones.

# 日志
docker logs -f CONTAINER # docker run 输出 和 docker logs 内容来源相同,但受缓冲、驱动、配置等影响,实际输出可能有差异。生产环境建议依赖 docker logs 更可靠!

推荐“删容器再新建”主要是因为 Docker 容器本质上更适合当作不可变运行实例(immutable runtime):你想变更的大多数东西(端口映射、挂载、--add-host、很多环境变量)在容器创建后基本都改不了或改起来很别扭。重建反而最简单、最可控。

restart参数

1
docker run(/create) --restart no
策略 容器崩溃 Docker 重启 系统重启 手动 stop 后 Docker 重启后 推荐场景
no(默认) 临时测试
on-failure 开发环境
always ✅ 自动启动 生产服务器
unless-stopped ❌ 保持停止 个人使用⭐

容器的使用

只要你没有删除容器,关闭(停止)后再次启动同一个容器,你在容器内部所做的更改(包括文件的增删改、软件的安装等)都会被保留。如需持久化重要数据,建议用挂载卷(volume),这样即使容器被删数据也不会丢失。最佳实践建议:

  • 开发/实验阶段:可以直接启动旧 container,方便调试和保留现场。
  • 生产/团队协作/备份:建议将修改后的容器提交为新的 image,日后新建 container。这样环境可复现、易于管理。
  • 长期维护:推荐用 Dockerfile 管理镜像,所有更改都写进 Dockerfile,这样环境最可控、最易于维护和升级。

重新挂载目录

在现有的 Docker 容器中无法直接重新挂载一个新的目录。Docker 的挂载点(即 -v--mount 参数所指定的挂载)是在容器创建时确定的,并且一旦容器启动后,挂载配置就无法更改。

如果你需要修改挂载配置,有以下几种方法:

删除旧容器并重新创建

这是最常见的方法,删除旧容器并使用新的挂载配置重新创建一个容器。

1
2
3
4
docker stop <container_name>  # 停止现有容器
docker commit <container_name> <new_image_name> # (可选)保存容器状态为新镜像
docker run -v /path/to/dir_2:/workdir <other-options> <new_image_name> # 重新创建容器并挂载新的目录
docker rm <container_name> # (可选)删除旧容器

使用 docker cp 复制数据

如果你只需要将新的目录内容注入现有容器,而不需要重新挂载,可以使用 docker cp 命令来复制文件或目录。

1
2
docker cp /path/to/dir_2 <container_name>:/workdir
docker restart <container_name>

直接修改挂载的解决方法(不推荐)

通过底层工具(如 nsentermount),可以尝试在运行中的容器中手动挂载目录,但这非常复杂且容易出错,通常不推荐。

迁移 Docker 环境

  1. 迁移 Docker 镜像。

    1. 在源机器导出镜像:

      1
      2
      3
      docker images    # 查看所有镜像
      docker save -o my_images.tar 镜像名1:tag 镜像名2:tag ...
      # docker save -o all_images.tar $(docker images -q)
    2. 拷贝到目标机器(比如用 scprsync):

      1
      scp my_images.tar user@dest_ip:/path/to/
      1
      rsync -av my_images.tar user@dest_ip:/path/to/
      • -a:归档模式,保留文件属性。
      • -v:显示详细过程。
    3. 在目标机器导入镜像:

      1
      docker load -i my_images.tar
    4. 完成。

  2. 迁移数据卷(Volumes)。

    1. 找到你用的卷名或挂载目录:

      1
      2
      docker volume ls
      docker inspect 卷名
    2. 导出卷内容(假设卷名为 mydata):

      1
      docker run --rm -v mydata:/volume -v $(pwd):/backup alpine tar czf /backup/mydata.tar.gz -C /volume . 
    3. 拷贝 mydata.tar.gz 到目标机器并恢复:

      1
      2
      3
      4
      5
      # 在目标机器新建同名卷
      docker volume create mydata

      # 恢复数据
      docker run --rm -v mydata:/volume -v $(pwd):/backup alpine sh -c "cd /volume && tar xzf /backup/mydata.tar.gz"
    4. 完成。

  3. 迁移 Docker Compose 配置(如有)。

    1. 直接把 docker-compose.yml 及相关 .env 配置文件复制到目标机器即可。

    2. 在目标机器上运行:

      1
      docker-compose up -d
    3. 完成。

  4. 迁移容器(可选)。

    一般只迁移镜像和数据卷即可,容器本身建议在新机器用相同参数重建。

    1
    2
    3
    4
    5
    6
    docker commit <container_name_or_id> my_temp_image:latest
    docker save -o my_temp_image.tar my_temp_image:latest
    # 拷贝到新机器
    scp my_temp_image.tar user@new_host:/path/
    # 新机器上导入
    docker load -i my_temp_image.tar
  5. 迁移网络(如有特殊网络配置)。

    1. 可用 docker network lsdocker network inspect 查看配置,必要时在新机器用 docker network create 手动创建。
  6. 完成。


Docker的安装与使用
http://zeyulong.com/posts/2c867817/
作者
龙泽雨
发布于
2024年12月4日
许可协议