多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Docker安装与基础操作全攻略:从环境准备到核心命令实战

Docker安装与基础操作全攻略:从环境准备到核心命令实战 1. 从“Docter”到Docker一个常见的拼写错误与容器技术的入门如果你在搜索引擎里输入“Docter的安装和基础操作”大概率是想找“Docker”的相关内容。这其实是一个非常普遍且有趣的拼写错误就像把“Git”打成“Get”一样。这个小小的拼写差异恰恰反映了Docker技术已经像医生Doctor一样成为现代软件开发和运维领域中不可或缺的“诊断”和“治疗”工具。它通过容器化技术为应用提供了一致的运行环境从根本上解决了“在我机器上能跑到你那就出问题”的经典难题。无论你是刚接触后端开发的新手还是希望优化现有部署流程的运维工程师掌握Docker的安装和基础操作都是迈入云原生和现代化应用部署世界的第一步。这篇文章我就以一个过来人的身份和你聊聊在Windows、macOS和Linux这三大主流操作系统上如何避开那些常见的坑把Docker稳稳当当地装好并带你上手最核心的几个操作让你能立刻用起来。2. 安装前的“体检”理解虚拟化与系统要求在真正动手安装之前我们必须先给电脑做个“体检”。Docker的核心依赖于操作系统的虚拟化技术但不同系统下的实现方式和前置条件截然不同。盲目安装你很可能会卡在Virtualization support not detected或Docker Desktop failed to start这样的错误上白白浪费几个小时。2.1 Windows系统Hyper-V与WSL2的抉择对于Windows用户尤其是Win10和Win11你有两条主要路径传统的Hyper-V和现代的WSL 2Windows Subsystem for Linux 2。为什么是WSL 2这是目前微软和Docker官方共同推荐的首选方案。它不是一个完整的虚拟机而是一个在Windows内核上运行的Linux兼容层。相比Hyper-VWSL 2启动更快、资源占用更少并且能实现与Windows文件系统的高性能互操作。Docker Desktop for Windows可以无缝集成到WSL 2中让你感觉像是在用Linux原生Docker一样顺滑。必须完成的“体检”步骤确认CPU虚拟化已开启重启电脑进入BIOS/UEFI设置通常是开机时按F2、Del或F12找到“Intel Virtualization Technology (VT-x)”或“AMD-V”选项确保其状态为“Enabled”。这是所有虚拟化技术的硬件基础。检查Windows版本Docker Desktop要求Win10 2004内部版本19041或更高版本以及Win11。低于此版本的系统会遇到win10版本低无法安装docker的错误唯一的升级路径就是更新系统。启用“Windows虚拟机监控程序平台”和“WSL”功能在Windows搜索栏输入“启用或关闭Windows功能”打开对话框。你需要勾选“适用于Linux的Windows子系统”这是WSL 1安装WSL 2的先决条件。“虚拟机平台”这是WSL 2和Hyper-V的底层支持。 勾选后重启电脑。这一步是解决virtualisation support wasn’t detected错误的关键。2.2 macOS系统利用原生虚拟化框架macOS的情况相对简单。从2010年后的Intel Mac到现在的Apple SiliconM1/M2/M3MacDocker Desktop都能很好地支持。它的底层利用的是macOS自带的Hypervisor.framework虚拟化框架无需用户手动配置。需要注意的细节芯片架构确保你下载的Docker Desktop安装包与你的芯片匹配Intel或Apple Silicon。安装错误版本虽然可能通过Rosetta 2运行但性能和稳定性会打折扣。系统权限安装后首次运行时系统会请求安装网络助手和权限提升务必点击“允许”并输入密码。很多新手卡在这里以为安装失败了。2.3 Linux系统最原生的体验在Linux上安装Docker是最直接、最“原生”的体验因为容器技术本就源于Linux。主流发行版如Ubuntu、CentOS、Debian都有成熟的安装方式。但即便如此也有坑点。关键准备卸载旧版本如果你的系统上存在可能叫做docker、docker.io或docker-engine的旧版本软件包务必先彻底卸载它们。残留的旧配置和新版本冲突是启动失败的常见原因。sudo apt-get remove docker docker-engine docker.io containerd runc存储驱动选择对于生产环境需要根据你的文件系统如ext4, xfs和需求选择合适的存储驱动如overlay2。不过对于初学者使用Docker官方仓库安装的默认配置通常就是最优解。完成上述针对你操作系统的“体检”后我们才算是拿到了安装Docker的“健康证明”可以进入正式的安装环节了。3. 分步安装指南从下载到验证这里我将以目前最主流、对新手最友好的WindowsWSL 2后端和LinuxUbuntu为例为例详解安装过程。macOS的安装过程近乎“下一步到底”遇到问题可参考官网文档。3.1 Windows平台Docker Desktop安装详解下载安装包访问 Docker 官网的 Docker Desktop for Windows 下载页。如果你已完成2.1节的体检系统会自动推荐适合你硬件的版本通常是带有WSL 2后端的稳定版。直接下载.exe安装文件。运行安装程序双击安装文件。安装过程中安装向导会提示你选择是否使用WSL 2而非Hyper-V作为默认后端。请务必勾选这个选项除非你有明确的理由必须使用Hyper-V比如要同时运行VMware Workstation但两者通常不兼容。关键配置安装后首次启动安装完成后从开始菜单启动“Docker Desktop”。它会先进行初始化可能需要几分钟。首次启动成功时通常会弹出一个庆祝界面并可能提示你创建Docker Hub账户。你可以选择跳过这不会影响本地使用。在系统托盘右下角找到Docker的鲸鱼图标右键点击选择“Settings”。在“General”设置中建议勾选“Start Docker Desktop when you log in”方便日常使用。在“Resources” - “WSL Integration”中确保你常用的WSL发行版比如Ubuntu后面的开关是打开的。这允许你在WSL终端里直接使用docker命令。验证安装打开 PowerShell 或 WSL 终端输入以下命令docker --version docker run hello-world如果第一行输出了Docker版本号如Docker version 24.0.7, build afdd53b第二行命令下载了一个镜像并运行最后打印出“Hello from Docker!”等信息那么恭喜你安装成功了。注意如果启动失败Docker Desktop通常会给出明确的错误提示。最常见的依然是虚拟化问题。此时应返回2.1节仔细检查BIOS虚拟化开关和Windows功能是否已启用。另一个常见问题是与杀毒软件或防火墙冲突可尝试暂时禁用后再启动Docker。3.2 Linux平台Ubuntu使用官方仓库安装在Linux上我强烈建议使用Docker提供的官方仓库进行安装而不是使用发行版自带的旧版本软件包。官方仓库能确保你获得最新的稳定版本和及时的安全更新。卸载旧版本如有如前所述先清理可能存在的旧版本。安装依赖工具sudo apt-get update sudo apt-get install ca-certificates curl gnupg添加Docker官方GPG密钥和仓库# 创建密钥环目录 sudo install -m 0755 -d /etc/apt/keyrings # 下载并导入Docker的GPG公钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg # 添加稳定版仓库到APT源列表 echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release echo $VERSION_CODENAME) stable | \ sudo tee /etc/apt/sources.list.d/docker.list /dev/null这一长串命令的目的是安全地配置软件源。GPG密钥用于验证下载的软件包是否来自Docker官方防止被篡改。安装Docker引擎sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin这里安装了核心的Docker引擎、客户端、容器运行时以及两个非常实用的插件Buildx用于多架构镜像构建和Compose插件用于编排多容器应用。验证安装sudo docker run hello-world由于Linux下默认需要sudo权限才能运行Docker命令你会被要求输入密码。同样看到“Hello from Docker!”即表示成功。可选但重要以非root用户身份管理Docker每次都要输入sudo很麻烦也不安全。可以将你的用户加入docker组sudo usermod -aG docker $USER执行此命令后你必须完全注销当前用户并重新登录或者重启电脑这个组权限变更才会生效。之后你就可以直接使用docker命令了。4. 镜像与容器理解Docker的核心概念安装成功只是开始要玩转Docker必须理解两个最核心的概念镜像Image和容器Container。你可以把它们类比成“程序安装包”和“正在运行的程序”。镜像一个只读的模板里面包含了运行某个软件所需的所有内容——代码、运行时环境、库、环境变量和配置文件。nginx:alpine、mysql:8.0、python:3.11-slim这些都是镜像。它类似于虚拟机中的.iso系统镜像但更轻量。容器是镜像的一个运行实例。当你执行docker run时Docker会从镜像创建一个可写的容器层然后在这个隔离的环境里启动进程。容器是轻量级、可移植的并且彼此隔离。一个关键比喻镜像就像是盖房子用的蓝图和预制件而容器则是根据这份蓝图实际搭建起来并正在居住的房子。你可以用同一份蓝图镜像盖出无数个房子容器它们初始结构一样但内部生活产生的数据各不相同。理解了这一点我们再来看操作命令就不会混乱了。所有命令基本都围绕“获取镜像”、“运行/管理容器”展开。5. 必须掌握的Docker基础操作命令下面这些命令是你每天都会用到的“生存技能”。我按照使用场景来分组并解释每个参数常见的用法。5.1 镜像相关操作获取与管理你的“蓝图”搜索镜像当你不知道确切镜像名时可以到Docker Hub默认的公共镜像仓库搜索。docker search nginx这会列出所有包含“nginx”关键词的官方及个人镜像。OFFICIAL列为[OK]的是官方维护的镜像通常更可靠。拉取镜像从仓库下载镜像到本地。docker pull nginx:alpinenginx是镜像名alpine是标签Tag通常用来指定版本或变体如latest,1.25,alpine精简版。强烈建议总是显式指定标签而不是依赖默认的latest因为latest可能随时指向新版本导致你的环境不稳定。列出本地镜像docker images # 或使用更强大的新命令 docker image ls这里你会看到镜像的仓库名、标签、ID、创建时间和大小。删除镜像docker rmi image_id或image_name:tag # 示例删除所有名为nginx的镜像 docker rmi nginx如果镜像有对应的容器存在即使容器已停止你需要先删除容器才能删除镜像或者使用-f强制删除不推荐。5.2 容器生命周期管理让你的“房子”运转起来运行容器这是最核心的命令。docker run -d --name my-nginx -p 8080:80 nginx:alpine-d后台运行detached mode。--name给容器起个名字方便后续管理。不用名字的话Docker会分配一个随机名字。-p 8080:80端口映射将宿主机的8080端口映射到容器的80端口。这样你访问http://localhost:8080就能看到容器内的Nginx页面了。最后是镜像名。这个命令会先检查本地是否有nginx:alpine镜像没有则自动拉取然后创建并运行容器。列出容器docker ps # 查看正在运行的容器 docker ps -a # 查看所有容器包括已停止的停止/启动/重启容器docker stop my-nginx docker start my-nginx docker restart my-nginx进入运行中的容器有时需要排查问题或执行临时命令。docker exec -it my-nginx /bin/sh-it-i保持标准输入打开-t分配一个伪终端合起来让我们可以交互式操作。/bin/sh或/bin/bash指定要启动的shell。Alpine镜像默认用shUbuntu等用bash。查看容器日志这是排查应用问题的第一现场。docker logs my-nginx # 查看历史日志 docker logs -f my-nginx # 实时跟踪日志输出类似 tail -f删除容器docker rm my-nginx # 删除已停止的容器 docker rm -f my-nginx # 强制删除运行中的容器5.3 数据持久化与端口映射让容器变得有用容器本身是临时的停止删除后其内部产生的所有数据都会丢失。要让数据持久化必须使用卷Volume或绑定挂载Bind Mount。使用命名卷这是Docker管理数据的最佳实践数据存储在宿主机的特定区域与容器生命周期分离。docker run -d --name mysql-demo \ -v mysql_data:/var/lib/mysql \ # mysql_data是卷名/var/lib/mysql是容器内路径 -e MYSQL_ROOT_PASSWORDmy-secret-pw \ mysql:8.0即使删除了mysql-demo容器名为mysql_data的卷依然存在下次启动新容器时挂载它数据就恢复了。使用绑定挂载将宿主机的一个目录直接挂载到容器内适合开发时同步代码。docker run -d --name nginx-dev \ -p 80:80 \ -v /home/user/my-website:/usr/share/nginx/html:ro \ # 宿主机路径:容器路径:只读 nginx:alpine这样你修改/home/user/my-website下的HTML文件Nginx容器内能立即生效。6. 实战演练运行一个简单的Web应用栈光说不练假把式。我们用一个最简单的例子把上面的命令串起来运行一个Python Flask应用并用Nginx做反向代理。这里我们用docker run命令直接完成更复杂的编排会用到docker-compose。准备一个简单的Flask应用app.pyfrom flask import Flask app Flask(__name__) app.route(/) def hello(): return Hello from Flask inside Docker! if __name__ __main__: app.run(host0.0.0.0, port5000)为Flask应用编写DockerfileDockerfile# 使用官方Python精简镜像 FROM python:3.11-slim # 设置工作目录 WORKDIR /app # 复制依赖文件并安装 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 声明容器运行时监听的端口 EXPOSE 5000 # 启动命令 CMD [python, app.py]同时创建requirements.txt文件内容为Flask2.3.3。构建Flask应用镜像docker build -t my-flask-app .这个命令会在当前目录.寻找Dockerfile并构建一个名为my-flask-app的镜像。运行Flask容器docker run -d --name flask-container -p 5000:5000 my-flask-app访问http://localhost:5000你应该能看到“Hello from Flask inside Docker!”。运行Nginx容器并配置反向代理简化版使用默认配置docker run -d --name nginx-container -p 8080:80 nginx:alpine访问http://localhost:8080看到Nginx欢迎页。要让它代理到Flask需要修改Nginx配置并挂载进去这涉及到进入容器修改文件或使用自定义镜像是下一步的学习内容。通过这个简单的流程你实践了镜像构建、容器运行、端口映射。虽然两个容器还没联动起来但你已经完成了单容器应用的部署闭环。7. 避坑指南与进阶学习路径在学习和使用Docker的过程中我踩过不少坑这里分享几个最常见的权限错误在Linux上最常见的错误是Got permission denied while trying to connect to the Docker daemon socket。这就是因为你没有将用户加入docker组或者加了组但没有重新登录会话。务必记得执行usermod后要注销重登。端口冲突docker run -p 80:80失败提示端口被占用。用netstat -tulnp | grep :80找出谁占用了宿主机的80端口停止该服务或改用其他端口如-p 8080:80。磁盘空间不足Docker镜像、容器和卷会占用大量磁盘空间。定期清理无用资源docker system prune -a # 清理所有未使用的镜像、容器、网络和卷慎用会删掉停止的容器和没被引用的卷 docker image prune # 仅清理悬空镜像未被任何容器引用的镜像镜像拉取慢默认从Docker Hub拉取镜像在国内可能很慢。为Docker Daemon配置国内镜像加速器Registry Mirror是必做操作。在Docker Desktop的设置中Linux在/etc/docker/daemon.json添加如https://registry.docker-cn.com或阿里云、腾讯云等提供的加速地址。掌握了安装和这些基础命令你已经可以应对80%的日常场景。接下来我建议你沿着这个路径深入学习Dockerfile编写掌握FROM,RUN,COPY,CMD,ENTRYPOINT等指令学会构建自己的镜像。使用Docker Compose当你需要管理多个关联容器如Web应用数据库缓存时用docker-compose.yml文件来定义和启动整个应用栈比一堆docker run命令高效得多。理解Docker网络学习桥接网络、主机网络等让容器之间、容器与外部能够按需通信。深入存储卷理解Volume Driver、备份恢复等。Docker的世界很大但入门并不难。从解决“安装”这个拼写错误开始你已经打开了这扇门。剩下的就是在实际项目中不断实践和探索。记住容器化的核心思想是“一次构建处处运行”以及“基础设施即代码”。当你开始用Dockerfile和Compose文件来定义你的环境时你就真正开始享受它带来的可重复性和便利性了。
返回列表