资讯详情

资讯详情

2025年Docker实战教程:从安装到部署的完整指南

1. 为什么2025年还值得重新学一遍Docker如果你现在打开任何一个技术社区搜Docker教程出来的结果大概率是2019年到2022年之间的内容。那些文章里用的命令今天还能跑但整个Docker的生态已经变了不少——Docker Desktop的授权模式改了WSL2成了Windows上的默认后端Compose V2把docker-compose这个带横杠的命令直接合并进了docker compose镜像加速的玩法也跟以前不一样了。我写这篇东西的起因很简单上个月帮一个朋友在他的Win11笔记本上装Docker Desktop结果卡在virtualization support not detected这个报错上整整一个下午。后来发现是Hyper-V和WSL2的功能开关没打开而网上大部分教程还在教你改BIOS里的VT-x——那个其实早就默认开启了。这件事让我意识到2025年确实需要一份跟上节奏的Docker实用教程。这篇内容适合三类人第一类是完全没有接触过Docker想从零开始把环境跑起来的新手第二类是以前用过一点但被各种报错劝退想系统梳理一遍的开发者第三类是需要在Linux服务器上部署MySQL、Redis、GitLab这类服务想用Docker简化运维的运维人员。我会从安装讲到常用命令再讲到Compose编排和实际部署案例中间穿插我自己踩过的坑和验证过的解决方案。需要提前说明的是Docker本身的概念并不复杂——它就是一个轻量级的容器工具把应用和它的依赖打包在一起走到哪都能跑。真正让人头疼的从来不是概念而是环境配置、网络、权限、镜像下载这些脏活。所以这篇教程的重点会放在这些实操细节上而不是花大篇幅讲什么是容器。2. 各平台安装Docker的完整路径与常见报错处理2.1 Windows 11上的安装WSL2才是关键Windows上装Docker2025年的标准做法是走WSL2后端。Docker Desktop for Windows现在默认就是用WSL2来跑Linux容器的性能比早期的Hyper-V方案好很多启动也快。安装步骤我按实际操作的顺序列一下先确认系统版本。Win11的话基本都没问题Win10需要21H2及以上。在设置-系统-关于里能看到版本号。打开WSL2功能。以管理员身份打开PowerShell运行wsl --install。这条命令会自动启用虚拟机平台和适用于Linux的Windows子系统两个功能然后下载一个默认的Ubuntu发行版。跑完之后必须重启电脑这一步不能省。重启后打开Microsoft Store搜索Ubuntu安装一个你喜欢的版本。装完后第一次启动会让你设置用户名和密码这个密码后面sudo的时候要用。去Docker官网下载Docker Desktop for Windows的安装包。双击安装安装过程中会问你要不要用WSL2而不是Hyper-V保持默认勾选就行。安装完成后启动Docker Desktop右下角托盘会出现一个小鲸鱼图标。等图标变成稳定的白色不再闪烁说明Docker引擎已经跑起来了。这里有个坑要重点说如果你在启动Docker Desktop时看到virtualization support not detected或者Docker Desktop failed to start because virtualisation support wasnt detected八成不是BIOS的问题。先检查任务管理器-性能-CPU右下角有没有虚拟化已启用。如果显示已启用那问题就在Windows功能上。打开控制面板-程序-启用或关闭Windows功能确认虚拟机平台和适用于Linux的Windows子系统这两个都打勾了。如果没打勾勾上重启。如果打勾了还报错就在PowerShell里跑wsl --update更新一下WSL内核。还有一个常见问题是failed to connect to the docker API at npipe:////./pipe/dockerdesktoplinuxengine。这个报错通常出现在Docker Desktop刚启动还没完全就绪的时候或者WSL2的集成没打开。解决办法是右键托盘图标选Settings-Resources-WSL Integration把你用的那个Ubuntu发行版打开。然后重启Docker Desktop。2.2 Ubuntu上安装Docker别用apt的默认版本Ubuntu上装Docker很多人直接sudo apt install docker.io这样装出来的版本往往比较旧。2025年推荐用Docker官方仓库来装版本新更新也方便。# 卸载可能存在的旧版本 sudo apt remove docker docker-engine docker.io containerd runc # 安装依赖 sudo apt update sudo apt install ca-certificates curl gnupg lsb-release # 添加Docker官方GPG密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 添加仓库 echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.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 docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin装完之后默认只有root能跑docker命令。每次都要sudo很烦把当前用户加到docker组里sudo usermod -aG docker $USER然后退出终端重新登录或者直接newgrp docker。这一步做完你跑docker ps就不会再报permission denied了。2.3 CentOS 7上升级Docker的注意事项CentOS 7自带的Docker版本很老而且CentOS 7本身已经停止维护了。如果你还在用CentOS 7升级Docker之前先确认一下内核版本uname -r至少要3.10以上。升级步骤跟Ubuntu类似只是仓库地址换成CentOS的sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-pluginCentOS 7上有个坑是firewalld和Docker的iptables规则会打架导致容器网络不通。如果你发现容器之间ping不通或者宿主机访问不了容器端口可以先停掉firewalld试试sudo systemctl stop firewalld。确认是这个问题的话要么换用ufw要么在firewalld里手动放行docker0网桥的流量。2.4 Windows离线安装Docker的思路有些内网环境没法直接下载Docker Desktop的安装包。离线安装的思路是在一台能上网的机器上下载好安装包和WSL2内核更新包拷贝到目标机器上。Docker Desktop的安装包本身是自包含的但WSL2的内核更新包需要单独下载。装的时候先装WSL2内核更新再装Docker Desktop。如果目标机器完全没法启用WSL2那就只能退回Hyper-V后端但Win11家庭版默认没有Hyper-V需要额外折腾。3. 镜像下载慢和镜像源配置的实战方案3.1 为什么你的docker pull总是卡住国内网络环境下直接从Docker Hub拉镜像速度慢是常态有时候还会超时。这不是Docker的问题是网络链路的问题。解决办法是配置镜像加速器。2025年可用的镜像源跟几年前不太一样了很多公共加速器已经关停或者限流。目前比较稳定的方案是使用云服务商提供的个人加速地址。比如阿里云的用户可以在容器镜像服务控制台里找到自己的专属加速地址格式类似https://xxxx.mirror.aliyuncs.com。腾讯云、华为云也有类似的服务。配置方法是在/etc/docker/daemon.json里加上{ registry-mirrors: [ https://your-mirror-address.mirror.aliyuncs.com ] }然后重启Dockersudo systemctl restart docker。Windows上是在Docker Desktop的Settings-Docker Engine里改这个JSON改完点Apply Restart。3.2 镜像源失效后的备选策略镜像源这东西有个特点今天能用明天可能就挂了。所以我的建议是配置两到三个备选源按顺序写进registry-mirrors数组里。Docker会依次尝试第一个不通就试第二个。如果所有公共加速器都不行还有一个办法是走代理。但这里要注意Docker守护进程的代理配置和终端的代理配置是两回事。你需要在/etc/systemd/system/docker.service.d/目录下创建一个http-proxy.conf文件内容大概是[Service] EnvironmentHTTP_PROXYhttp://your-proxy:port EnvironmentHTTPS_PROXYhttp://your-proxy:port然后sudo systemctl daemon-reload sudo systemctl restart docker。Windows上则是在Docker Desktop的Settings-Resources-Proxies里配置。3.3 拉取特定镜像的实用技巧有时候你只需要某个镜像的特定版本比如MySQL 8.0。直接docker pull mysql会拉latest标签但latest在生产环境里是个坑——你永远不知道它对应哪个版本。正确的做法是明确指定版本号docker pull mysql:8.0.36。如果你不确定有哪些标签可用可以去Docker Hub的网页上看或者用docker search命令。不过docker search返回的信息比较有限我一般还是直接开浏览器查。还有一个技巧是拉取镜像的时候加上--platform参数。比如你在M1/M2的Mac上想拉一个只支持amd64的镜像可以加--platform linux/amd64Docker会用模拟的方式跑起来虽然性能有损失但至少能跑。4. 容器生命周期管理与高频命令的实操拆解4.1 从run到rm一个容器的完整旅程Docker容器的生命周期可以用几个动词串起来create、start、run、stop、restart、rm。docker run其实是create和start的组合。理解这一点很重要因为很多人在排查问题时搞不清楚容器到底是创建了但没启动还是启动了但退出了。# 创建并启动一个Nginx容器映射宿主机8080到容器80 docker run -d --name my-nginx -p 8080:80 nginx:latest # 查看正在运行的容器 docker ps # 查看所有容器包括已停止的 docker ps -a # 停止容器 docker stop my-nginx # 启动已停止的容器 docker start my-nginx # 重启容器 docker restart my-nginx # 删除容器必须先停止 docker rm my-nginx # 强制删除运行中的容器 docker rm -f my-nginx这里有个经验docker run的时候一定要加--name给容器起个名字。不然Docker会随机分配一个名字过两天你根本记不住哪个是哪个。名字起得清楚一点比如mysql-prod、redis-cache后面维护的时候省心很多。4.2 进入容器和查看日志的正确姿势调试容器的时候最常用的两个命令是docker exec和docker logs。# 进入容器的bash docker exec -it my-nginx /bin/bash # 如果容器里没有bash用sh docker exec -it my-nginx /bin/sh # 查看容器日志 docker logs my-nginx # 实时跟踪日志 docker logs -f my-nginx # 只看最后100行 docker logs --tail 100 my-nginx # 带时间戳 docker logs -t my-nginxdocker exec和docker attach的区别值得说一下。exec是在容器里新开一个进程你退出的时候不会影响容器的主进程。attach是直接连到容器的主进程上你按CtrlC会把主进程也干掉容器就停了。所以调试的时候用exec别用attach。4.3 容器网络不通的排查链路容器网络问题是新手最容易卡住的地方。我总结了一个排查顺序按这个顺序走大部分问题都能定位先看容器本身有没有跑起来docker ps。如果容器状态是Exited那先看日志docker logs多半是应用启动失败。看端口映射对不对docker port 容器名。确认宿主机的端口和容器内的端口映射关系。在宿主机上测试curl localhost:映射的端口。如果不通可能是应用没监听在0.0.0.0上而是监听在127.0.0.1上。进容器内部测试docker exec -it 容器名 curl localhost:容器内端口。如果容器内能通宿主机不通那就是端口映射或者防火墙的问题。检查防火墙sudo iptables -L -n或者sudo ufw status。Docker会自己管理iptables规则但有时候跟系统的防火墙冲突。检查Docker网络docker network ls和docker network inspect bridge。默认的bridge网络里容器之间可以通过IP互相访问但不能通过容器名。要通
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →