ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Docker从入门到实战:安装部署、常见报错与高频用法全解析

Docker从入门到实战:安装部署、常见报错与高频用法全解析 1. docker到底是个什么东西先别急着装你得先搞清楚docker是干什么的不然装上也是瞎折腾。我见过太多人一听说docker很火转头就去下载安装装完打开界面一脸懵然后跑来问“这是什么啊怎么用啊”——所以这节先说人话。1.1 没有docker的时候你是咋部署的回想一下传统的部署流程。你写了一个网站本地跑得好好的然后要上线到服务器上。你打开一台全新的服务器发现啥都没有。于是你开始装Java、装Tomcat、装MySQL、装Redis改配置文件调环境变量折腾两三个小时终于跑起来了。这时候运维跟你说换台机器你内心是崩溃的。这里面最坑的是什么是环境不一致。你本地Windows上开发服务器是CentOS同事那边是Mac同一个代码在不同地方跑出不同的结果经典台词就是“我机器上明明好好的啊”。1.2 docker把“环境”打包成了快递docker的思路特别朴素把程序、依赖、配置、运行环境、库文件甚至连操作系统的基础层全部打成一个标准化的包。这个包docker里叫镜像。你用这个镜像去启动一个容器容器里跑起来的东西和构建时一模一样。打个比方传统部署就像你搬家到了新家要重新买家具、接水电、装电器而且每家的房东要求还不一样。docker的玩法是把整个房间连同家具一起打包到任何地方一运行拆开就是一模一样的生活环境连墙纸都没变过。所以docker解决的核心痛点就三个环境一致、隔离运行、秒级部署。这也解释了为什么现在企业里微服务、DevOps、CI/CD这些实践基本都绕不开docker。注意容器和虚拟机不一样。虚拟机是虚拟出一套硬件再装一个完整系统启动慢、占资源。容器是直接复用宿主机的操作系统内核只把应用和依赖包进去启动是毫秒级的。docker容器里跑的进程本质上是宿主机上的一个隔离进程。1.3 你需要的是docker还是docker desktop这里要先弄清楚两个东西因为它们经常被混淆。docker引擎真正干活的进程负责管理镜像、容器、网络等像一台机器的发动机。docker desktop一个图形化桌面应用自带docker引擎还内置了k8s集群、可视化界面主要面向Windows和Mac用户。如果你是Linux服务器直接装docker引擎就完事了。如果你是Windows或Mac本机开发建议直接上docker desktop因为它帮你解决了跨平台的底层虚拟化问题尤其是Windows省得自己折腾Hyper-V和WSL2。咱们这篇先讲清楚安装但更重要的是讲明白安装之后的那些坑。因为我实测下来docker安装本身不算难真正容易栽跟头的地方全在后半段——镜像下载慢、桌面版起不来、权限报错、容器连不上网……后面都给你一一道来。2. Windows下安装docker desktop完整实操大部分新手用户用的是Windows这块我写细一点。2.1 安装前必须要检查的两项配置先提个醒Windows装docker desktop最怕的不是安装包坏而是你的系统底子没准备好。官方对Windows有两个硬性要求CPU虚拟化必须在BIOS里开启。很多电脑这一步是默认关的尤其是品牌机。你打开任务管理器切到“性能”标签看右下角“虚拟化”那一栏显示“已启用”才是OK的。如果显示“已禁用”需要重启电脑进BIOS找到类似“Intel Virtualization Technology”或“SVM Mode”的选项改成Enabled保存重启。Windows 10/11必须是64位专业版、企业版或教育版。家庭版可以用但需要安装WSL2后面细说。顺便回答热搜词里那个特别经典的报错docker desktop failed to start because virtualisation support wasnt detected。字面意思是没检测到虚拟化支持。我处理过的案例里80%是BIOS虚拟化没开10%是Hyper-V功能没启用剩下10%是安全软件拦截了虚拟化组件。解决顺序就是先查BIOS再开Windows功能最后重置WSL。2.2 推荐先装好的WSL2WSL2是Windows Subsystem for Linux的第二个版本本质上是一个轻量级Linux虚拟机。docker desktop在Windows上其实不是直接跑的它是借助WSL2的后端来跑Linux容器的。就算你只用Windows容器用得少官方现在也默认优先走WSL2。安装WSL2的姿势很简单。以管理员身份打开PowerShell执行wsl --install执行完会自动下载并安装WSL2内核装完重启电脑。然后确认一下默认版本是2wsl --set-default-version 2提示如果你之前装过WSL1需要先升级到2。可以用wsl -l -v查看当前发行版版本。如果显示是1执行wsl --set-version 发行版名 2原地升级。不升级的话docker desktop会启动失败或者性能极差。2.3 docker desktop的下载安装去docker官网下安装包地址是www.docker.com/products/docker-desktop/点Download for Windows。现在有四个渠道Intel芯片和ARM芯片要选对别下错了。下载完双击安装一路Next就行。有两个选项值得说一下Use WSL 2 instead of Hyper-V建议勾上WSL2比Hyper-V内存占用小、启动快。Add shortcut to desktop随意看你习惯。装完启动首次打开会让你接受协议然后登不登录都可以直接跳过。登录账号只是用来同步配置和拉取个人仓库权限不登录完全不影响本地使用。启动后右下角托盘会出现一个鲸鱼图标等它变成稳定状态就说明引擎起来了。怎么验证装好了呢打开终端执行docker version看到Client和Server两段版本信息就说明docker引擎和命令行都能正常工作了。如果只看到Client、Server那边报错说明引擎没起来去查docker desktop的日志。2.4 docker desktop修改存储路径这个热搜词太真实了。docker默认把镜像和容器数据存在C盘位置大概是C:\Users\你的用户名\AppData\Local\Docker\wsl。用着用着你会发现C盘从蓝色变成红色然后所有容器开始报磁盘空间不足。改存储路径的姿势是这样的打开docker desktop的设置找到Resources资源里面有个Advanced高级能看到一个名为Disk image location的选项点Browse选一个你有大把空间的盘点Apply Restart。docker会自动把现有的数据迁移过去这个过程根据你已有镜像的量可能要等几分钟期间别强制关机。注意这个操作有个前置要求docker引擎必须处于运行状态不然Apply按钮是灰的。还有迁移完以后旧目录里的文件不会自动删除需要你手动清理确认没问题后再删免得数据丢了哭都来不及。3. Linux服务器上安装dockerUbuntu和CentOS服务器场景才是docker的主场因为大多数人的线上环境都是Linux而且没有图形界面全命令行操作。这里以最常见的两个发行版为例。3.1 Ubuntu/Debian系安装先别急着直接apt install docker.io虽然这样也能装上但版本往往比较旧而且得一版一版手动补工具链麻烦。我推荐用官方镜像源安装最新版。# 1. 卸载可能存在的旧版本 sudo apt-get remove docker docker-engine docker.io containerd runc # 2. 更新软件索引 sudo apt-get update # 3. 安装依赖工具 sudo apt-get install ca-certificates curl gnupg lsb-release # 4. 添加docker官方GPG密钥 sudo install -m 0755 -d /etc/apt/keyrings 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 # 5. 写入软件源 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 # 6. 更新并安装 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin装完以后启动并设置开机自启sudo systemctl enable docker --now验证sudo docker run hello-world看到Hello from Docker!那一段英文输出就说明安装成功了。3.2 CentOS/RHEL系安装CentOS 7/8的用户在装docker时经常遇到一个问题直接用yum install docker装的是老古董版本跑新镜像动不动报invalid argument。建议用官方推荐的yum-config-manager方式# 卸载旧版本 sudo yum remove docker docker-client docker-common docker-selinux docker-engine # 安装依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加docker源 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装 sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # 启动 sudo systemctl start docker sudo systemctl enable docker提示CentOS 7的默认内核是3.10跑docker会有一些已知的兼容性坑比如iptables的问题。升级到较新的内核版本能省很多事。另外从CentOS 8开始官方推荐使用dnf代替yum写法基本一样。如果你在CentOS上遇到docker服务启动失败的报错优先查journalctl -u docker日志十有八九是存储驱动或者iptables没就绪。3.3 免sudo权限配置Linux下刚装完docker你敲docker ps大概率会报这个错permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock原因是docker守护进程绑定在Unix socket上默认只有root用户有权限访问。解决方法是把你的用户加入docker组sudo usermod -aG docker $USER newgrp docker然后重新执行docker ps就不会报权限错了。注意这个操作会授予该用户等同于root的权限因为能控制docker基本就能控制整个系统别在多人共用的服务器上乱加人。4. 装完之后必做的三件事docker装好了不等于万事大吉。按我过去几年的经验接下去第一件事就是把一些基础配置弄好不然你会在不知不觉中被各种小问题折磨。4.1 配置镜像加速器解决下载慢这个热搜词我太有感触了。docker默认从官方仓库Docker Hub拉镜像服务器在国外国内网络下载一个几百MB的镜像慢的时候能让你等到怀疑人生。解决办法是配置国内镜像加速器。现在的做法是修改docker守护进程的配置文件/etc/docker/daemon.jsonLinux服务器或者docker desktop里的Settings - Docker EngineWindows/Mac{ registry-mirrors: [ https://docker.m.daocloud.io, https://dockerproxy.com, https://docker.nju.edu.cn ] }写完保存重启dockersudo systemctl restart docker验证是否生效docker info | grep -A 5 Registry Mirrors看到你配置的镜像源就说明生效了。以后拉镜像速度会有质的提升几百MB的镜像可能一两分钟就拉完了。注意镜像加速器只对Docker Hub官方仓库的镜像生效如果你用的是私有仓库或者第三方仓库比如代码部署里的自有镜像仓库加速器是不管的。还有一点网上那些加速源挂了又起、起了又挂是常态多配几个备用别只写一个。4.2 跑通hello-world和常用命令安装验证是最基础的但新手对docker的“用”还没概念。我建议按这个顺序过一遍# 拉镜像并运行容器 docker run hello-world # 查看本地有哪些镜像 docker images # 查看当前运行的容器 docker ps # 查看所有容器包括已停止的 docker ps -a # 进入一个正在运行的容器交互终端 docker exec -it 容器名 /bin/bash这几个命令是最高频的相当于你认识了一个新朋友得先会打招呼、知道名字、能找到人。至于更复杂的命令比如docker build、docker compose up后面用到再说。docker的命令设计得很符合直觉大部分时候你猜一下参数的意思就能用对。4.3 搞懂镜像和容器的关系很多人卡在这里。我打个比方镜像是“菜谱”容器是“照着菜谱做出来的一道菜”。菜谱可以反复使用做一次就得到一道菜。同一个菜谱可以做出多道菜每道菜的口味都是独立的——改一道菜不会影响菜谱也不会影响其他菜。所以你拉一个mysql:8.0镜像可以从它启动N个容器每个容器可以有不同的端口映射、不同的数据目录、不同的密码。删掉容器镜像还在下次还能再启动新的。这个思想懂了docker的用法基本就理解了一半。接下来真正要面对的是“怎么用好它”而不是“怎么装它”。5. 实战用docker装一个mysql 8.0空谈无用我拿docker安装MySQL 8.0来演示完整流程。这个场景太典型的覆盖了镜像拉取、端口映射、数据持久化、环境变量、容器管理这些核心操作。5.1 写命令之前先理解参数直接上命令docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD123456 \ -e TZAsia/Shanghai \ -v /data/mysql8/conf:/etc/mysql/conf.d \ -v /data/mysql8/data:/var/lib/mysql \ --restartalways \ mysql:8.0一行行拆开说-d后台运行别让进程卡住你的终端。--name mysql8给容器起个名字以后操作用名字而不是那串随机ID。-p 3306:3306端口映射。宿主机3306端口映射到容器内3306端口这样外部程序就能通过localhost:3306访问容器里的MySQL了。左边是宿主机端口右边是容器端口别写反了。-e MYSQL_ROOT_PASSWORD123456环境变量这里是设置MySQL root的初始密码。注意只有在容器第一次初始化数据目录时生效如果数据卷里已经有旧数据这个变量不会改变已有密码。-e TZAsia/Shanghai设置时区不设的话MySQL默认UTC时间和北京时间差8小时号称史上最坑时间问题。-v /data/mysql8/data:/var/lib/mysql数据持久化。把容器里MySQL的数据文件挂载到宿主机目录这样删掉容器、重新创建容器数据还在。这一步极其重要不然docker一删你的数据库全没了。--restartalwaysDocker服务重启时自动拉起这个容器服务器重启后MySQL不用手动开。5.2 走一遍完整的拉取和验证流程执行完上面的命令docker会先拉取mysql 8.0镜像然后创建并启动容器。查看状态docker ps | grep mysql8看到STATUS是Up就说明起来了。然后验证能不能正常连接docker exec -it mysql8 mysql -uroot -p123456能进入MySQL命令行就说明一切正常。提示如果你用的是云服务器还得去安全组放行3306端口不然外部客户端连不上。本地测试可以忽略这一步。5.3 用docker compose管理多容器当你需要同时跑MySQL和Redis或者微服务一堆模块的时候一条条敲docker run命令就太原始了。这时候用docker compose把容器编排写在一个YAML文件里。创建一个目录比如~/dev-stack里面新建docker-compose.ymlversion: 3.8 services: mysql: image: mysql:8.0 container_name: mysql8 restart: always ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: 123456 TZ: Asia/Shanghai volumes: - /data/mysql8/data:/var/lib/mysql - /data/mysql8/conf:/etc/mysql/conf.d redis: image: redis:7 container_name: redis7 restart: always ports: - 6379:6379 command: redis-server --requirepass 123456 volumes: - /data/redis7/data:/data然后在目录里执行docker compose up -d它会自动拉镜像、创建网络、启动容器从此MySQL和Redis一键起停。再也不用记那一大串docker run参数了。以后要加服务比如加个Nginx往YAML文件里加一段重新执行一次compose就行。6. 那些高频报错和软件坑这个部分是我最想写的因为几乎每个报错我都亲眼见过有人掉进去。我用表格整理一下高频报错的处理方式。6.1 高频报错速查表报错现象根本原因解决思路docker desktop failed to start because virtualisation support wasnt detectedBIOS虚拟化没开或Hyper-V/WSL2没启用检查BIOS里Intel VT-x/AMD-V是否开启启用Windows功能里的“适用于Linux的Windows子系统”和“虚拟机平台”permission denied while trying to connect to the Docker daemon socket当前用户不在docker组执行sudo usermod -aG docker $USER重新登录镜像下载慢或超时没有配置国内加速器配置registry-mirrors多写几个备用源Error response from daemon: Conflict. The container name ... is already in use容器已存在通常是之前没删掉docker rm -f 容器名强制删除后重建Cannot connect to the Docker daemon at unix:///var/run/docker.sockdocker守护进程没启动Linux下sudo systemctl start dockerWindows下检查docker desktop托盘图标状态no space left on device磁盘满了常见是日志或镜像占用清理悬空镜像docker system prune清理构建缓存docker builder prune检查磁盘占用docker服务启动失败存储驱动或iptables问题查看日志journalctl -u dockerCentOS 7内核太旧建议升级内核或设置storage-driver为overlay26.2 关于docker desktop的“Failed to start”细致排查这个报错太常出现展开讲。它一般有几种情况你可以按顺序排查点开docker desktop它在启动过程中如果看到WSL2相关报错去Windows设置里确认“适用于Linux的Windows子系统”和“虚拟机平台”两个功能有没有开。控制面板 - 程序和功能 - 启用或关闭Windows功能勾上重启。如果功能已经开了但WSL2没有默认发行版docker desktop同样起不来。执行wsl --list如果没输出说明你没有装任何WSL发行版装一个wsl --install -d Ubuntu。如果以上都正常但docker desktop还是起不来检查服务。WinR运行services.msc找到LxssManager和WSLService看有没有停止。右键启动它们。还不行的话重置WSL网络管理员PowerShell里执行netsh winsock reset重启电脑。提示Windows上跑docker desktop最怕的是装过其他虚拟化软件比如VirtualBox、VMware它们和WSL2/Hyper-V会抢CPU虚拟化资源。这不是不能共存但需要额外配置新手阶段建议先只保留一种。6.3 镜像和容器的日常清理用久了docker你会发现磁盘空间越来越小。这很正常因为每次构建或者拉新镜像都不会自动清理旧版本。查看用量docker system df清理悬空资源停止的容器、无用的网络、悬空的镜像docker system prune -a注意这个命令是很暴力的加了-a会把所有没有被容器引用的镜像都删掉包括你没在用但以后可能要用的。执行之前确认清楚或者不加-a只清悬空镜像。还有一个我特别想提的坑容器的日志文件会无限增长。MySQL容器如果跑一年不管理日志动辄几个G甚至几十个G磁盘就是这么被占满的。解决方式是在docker启动参数里加日志配置--log-opt max-size50m --log-opt max-file3compose里对应写法logging: driver: json-file options: max-size: 50m max-file: 36.4 关于青龙面板之类的全套部署不知道多少个热搜词跟“青龙”绑在了一起。青龙面板以前是个定时任务管理面板常被用来挂各种脚本。这里我不展开脚本内容只从docker部署角度看这套东西特别适合作为docker入门练手项目。它的部署就是这么简单git clone https://github.com/whyour/qinglong.git cd qinglong docker compose up -d然后浏览器访问http://服务器IP:5700就能看到界面了。整个过程不超过五分钟。这类一键面板类的部署它能火的一个核心原因就是docker把部署门槛降到了几乎为零。以前你要装Node.js、装数据库、配反向代理现在一条命令全部搞定。这就是docker的巨大价值。7. 再聊几个docker高频场景装好了docker我猜你接下来会碰到的场景大概是这些。7.1 kali搭建DVWA靶场安全测试圈的朋友会经常用DVWADamn Vulnerable Web Application做Web漏洞练习。以前在kali里装DVWA要配Apache、MySQL、PHP一套流程走下来至少半小时还有人会在环境兼容性上卡一晚上。用docker解决就是一条命令docker run -d -p 80:80 vulnerables/web-dvwa等它启动完访问http://localhost就进去了。数据库初始化点一下就行。这就是镜像封装的力量——别人把环境折腾好了封装成镜像你直接拿来用。7.2 微服务项目的docker部署如果你是一个开发完微服务项目的程序员想把项目部署到服务器上不用docker的方案是一台台服务器装环境、部署应用、维护依赖一个微服务一个环境工作量是灾难级的。用docker加docker compose一切变得特别顺每个服务写一个Dockerfile定义好运行环境本地构建镜像推送镜像到私有仓库服务器上写一个docker-compose.yml把nginx、后端、数据库、Redis全部编排起来docker compose up -d一键启动。以前需要运维配置半天的事现在开发自己就能干。这也是docker成为现在后端开发必备技能的根本原因。7.3 搭建kodbox或者个人网盘面向个人用户的场景docker也有非常成熟的玩法。比如kodbox可道云就支持一条命令部署docker run -d \ --name kodbox \ -p 8080:80 \ -v /data/kodbox:/var/www/html \ kodbox/kodbox之后你访问http://IP:8080就能用了。装一个个人网盘、企业内的文档协作工具半小时搞定。这在以前的方案里需要配置Web服务器、PHP运行时、数据库工作量不是一个量级的。这种“一键安装一个应用”的模式是docker在个人场景下最大的魅力。你不需要懂PHP、不需要懂Nginx、不需要懂MySQL你只要知道docker怎么跑起来就能在自己的机器上部署无数个本来很复杂的软件。最后的实操心得要说我装了这么多年docker、帮人排了这么多年错最想嘱咐的就一句话docker本身不难难的永远是对底层原理缺少敬畏。很多问题都是在不懂WSL2、不懂虚拟化、不懂Linux权限的情况下硬装结果装完起不来或者跑起来各种怪问题。所以我的建议是如果你是本机开发先花半小时把WSL2和docker desktop装扎实别急着一口气跑多少个容器先跑一个hello-world、跑一个nginx、跑一个mysql把“镜像”“容器”“端口映射”“数据卷”这些概念用实操作验证一遍后面再上docker compose节奏会顺很多。还有个小技巧也是我踩过几次坑之后养成的习惯所有重要的容器都要加--restartalways和把数据目录挂载出来。很多人的容器跑着跑着“莫名其妙消失了”其实就是没加restart策略、服务器重启后没有自动拉起加上数据没挂载出来容器一删就全没了。这两行参数远比多学几个命令重要。最后分享一个我自己的使用习惯能用docker compose一步到位的绝不写一堆docker run命令。YAML文件放Git仓库里换新机器拉下来直接docker compose up -d十几分钟就能把一整套开发环境恢复出来。这种体验可以让你彻底告别手动配置环境的痛苦。
返回列表