ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Docker 常用命令与排查实战:从容器、镜像到日志与网络全解析

Docker 常用命令与排查实战:从容器、镜像到日志与网络全解析 Docker 这东西很多人一开始都会走弯路。我刚接触的时候照着教程敲命令镜像拉下来了容器也在跑但真到排查问题的时候就傻眼——日志在哪看容器怎么进不去数据怎么没了镜像怎么越积越大后来系统整理了一遍 Docker 常用命令又踩了不少坑才把这块彻底理顺。这篇文章就是把我学习 Docker 常用命令的过程、踩过的坑和验证过的排查思路做一次完整复盘适合刚入门的新手也适合用过一段时间但命令体系比较零散的开发者。我想先建立一个基本认知Docker 的命令看起来多但本质上是围绕几个核心对象来的——镜像、容器、网络、数据卷、Compose。只要搞清楚每个对象有哪些命令以及对象之间是怎么关联的学习成本会直线下降。下面我会按照“原理认知 - 命令拆解 - 场景实操 - 问题排查”的顺序把所有高频命令和真实遇到的坑整理出来。1. 学习 Docker 前的底层认知命令为什么这么设计1.1 镜像、容器、数据卷、网络的关系先建立最基本的认知镜像Image是一个只读的模板容器Container是镜像运行后的实例数据卷Volume是用来持久化数据的网络Network则是让容器之间、容器与宿主机之间通信的通道。这四个对象互相配合才是一个完整的 Docker 落地闭环。这个设计和面向对象编程很像镜像就是类定义容器就是类实例化出来的对象。同一个类可以创建无数个对象同一个镜像也可以启动无数个容器。数据卷是为了解决容器销毁后数据丢失的问题相当于给容器外挂了一个持久化存储。网络的作用则是让这些隔离环境之间能够互相访问。# 一条命令看清镜像与容器的关系 docker run -d --name web_demo -p 8080:80 nginx docker ps -a docker images启动一个 nginx 容器后你会在docker images列表里看到 nginx 镜像在docker ps -a列表里看到名为 web_demo 的容器。它们是两个东西但又有密不可分的关联。理解了这个关系后面所有命令都会变得好记很多。1.2 命令优先掌握哪几个我把 Docker 命令分成三个优先级来学这个顺序比直接背命令清单高效得多。第一优先级是安装、拉取镜像、创建容器、查看容器状态、查看日志这是你上手第一天就必须会的对应docker pull、docker run、docker ps、docker logs、docker exec。这类命令解决的是“让一个东西跑起来”的问题。第二优先级是停止、启动容器、删除容器、删除镜像、拷贝文件、查看资源占用对应docker stop、docker start、docker rm、docker rmi、docker cp、docker stats。这类命令解决的是“日常维护”的问题。第三优先级是网络创建、数据卷管理、镜像构建、Compose 编排对应docker network、docker volume、docker build、docker compose。这类命令解决的是“多个容器协同工作”以及“把本地项目打包成镜像”的问题。按照这个优先级去学就不会一上来被命令数量吓住。很多教程喜欢把几十条命令一次列完看上去很全但学完就忘。先掌握最常用的再逐步扩展才是真正的学习路径。2. 镜像相关命令拉取、查看、删除与导出2.1 镜像拉取与配置加速源docker pull是最常见的命令但新手往往在这里就卡住因为默认的 Docker Hub 在部分网络环境下速度很慢甚至直接超时。解决办法是配置镜像加速器。以 Linux 系统为例修改/etc/docker/daemon.json文件{ registry-mirrors: [ https://docker.mirrors.ustc.edu.cn, https://hub-mirror.c.163.com ] }修改完成后重启 Dockersudo systemctl daemon-reload sudo systemctl restart docker注意加速器地址经常会变化而且不同地区访问不同加速器的速度也不一样。如果你的加速器失效了换一个镜像源再试即可。另外国内很多云厂商都提供 Docker 加速服务可以优先选择你自己云服务商提供的加速地址速度往往更稳定。Docker DesktopWindows 和 Mac的用户配置路径不同一般在界面右上角设置里Docker Engine 标签页里直接编辑 JSON 内容。但这里要提醒一下Docker Desktop 在 Windows 上依赖 WSL2 或者 Hyper-V如果遇到虚拟化没开启首要解决的是虚拟化问题这个后面第 7 节会专门展开。2.2 查看和删除镜像查看本地镜像列表docker images docker image ls这两条效果一样。列表里会显示 REPOSITORY仓库名、TAG标签、IMAGE ID镜像ID唯一标识、CREATED创建时间、SIZE大小。注意同一个镜像可以打多个 TAG所以看到同一行 ID 出现多次是正常的。删除镜像docker rmi nginx:latest docker rmi IMAGE_ID删除时有一个非常常见的坑如果该镜像有正在运行的容器会报 “image is being used by running container” 的错误。解决办法是先停掉并删除使用了该镜像的容器docker rm -f $(docker ps -aq) docker rmi nginx:latest这里docker ps -aq表示列出所有容器 ID-a 包含已停止的-q 只显示 ID然后用docker rm -f强制删除。新手看到$(...)语法容易懵它的作用是把括号里命令的输出作为参数传给前面的命令这在 Linux 命令里是一个很基础也很常用的技巧。2.3 镜像的导入导出在生产环境或者内网环境无法直接拉取镜像时导出和导入就会派上用场# 导出 docker save -o nginx.tar nginx:latest # 导入 docker load -i nginx.tardocker save和docker export容易搞混。docker save导出的是镜像保留了镜像的所有历史层和元数据docker export导出的是容器的文件系统快照不保留历史层也不能完整还原镜像。在多数场景下跨环境迁移镜像用docker save更稳妥。如果你要迁移的是运行中的容器现场比如某个容器里手动改过不少文件那么先docker commit把容器提交成新镜像再docker save导出也能达到迁移效果。不过这种方式不推荐用于生产环境因为它会丢失容器原本的声明式配置信息只适合应急。2.4 构建镜像的基本姿势Dockerfile 构建镜像用的是docker build。一条最基本的构建命令docker build -t myapp:v1.0 .-t指定镜像名称和标签最后的点表示 Dockerfile 所在目录构建上下文。这里有个新手高频误区有人以为后面的点是“当前工作目录下的 Dockerfile”其实它代表的是整个构建上下文的路径Docker 会把该目录下的所有文件发送给 Docker 守护进程。所以目录里不要放无关的大文件否则构建会非常慢。我实际遇到过一个情况项目目录里有一个几百 MB 的备份压缩包忘记加进.dockerignore结果每次构建都要把压缩包传给守护进程构建时间从几十秒拖到几分钟。后来在.dockerignore里加上*.tar.gz和*.zip速度立刻恢复正常。构建上下文这个问题很多人用了一年 Docker 都没意识到。3. 容器生命周期run、ps、exec、cp 全拆解3.1 docker run 的常用参数docker run是使用频率最高的命令但参数也是最多的。我把最常用的参数整理成一个表参数作用示例-d后台运行容器docker run -d nginx-it交互式进入容器终端docker run -it ubuntu bash--name指定容器名称docker run --name web nginx-p端口映射docker run -p 8080:80 nginx-v / --volume数据卷挂载docker run -v /data:/data nginx--restart重启策略docker run --restartalways nginx-e设置环境变量docker run -e MYSQL_ROOT_PASSWORDroot mysql--rm容器退出后自动删除docker run --rm nginx-p 8080:80的意思是宿主机的 8080 端口映射到容器的 80 端口。这个顺序一定要记牢左边是宿主机右边是容器。我见过不少同事写反然后死活访问不了。--restartalways在生产环境基本是标配容器意外退出会自动重启。如果是开发环境临时测试--rm会方便很多容器退出就自动清理不会堆积垃圾容器。3.2 查看容器ps 与 docker topdocker ps只显示正在运行的容器想看所有容器包括已经停止的要加-adocker ps -a还有一个比较实用的技巧加上--format可以自定义输出字段docker ps --format table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}这样输出会非常干净只保留关心的列。docker top则类似于 Linux 的top命令用于查看容器内正在运行的进程列表docker top web_demo当怀疑容器内的进程异常或者 CPU 占用高时用这个命令看实时进程状态很有效。配合docker exec进入容器再用top、ps aux进一步排查基本能定位大部分问题。3.3 容器启停与删除docker start web_demo # 启动已停止的容器 docker stop web_demo # 优雅停止发送 SIGTERM 信号 docker restart web_demo # 重启 docker pause web_demo # 暂停不释放资源 docker unpause web_demo # 恢复 docker rm web_demo # 删除容器需先停止 docker rm -f web_demo # 强制删除无需先停止docker stop和docker kill是有区别的。stop会先发 SIGTERM给容器一个“体面退场”的机会超时后再发 SIGKILL 强杀kill是直接发 SIGKILL。除非容器卡死不退否则优先用stop。定期清理不需要的容器是保持开发环境整洁的好习惯docker rm -f $(docker ps -aq)这条命令会删除所有容器在开发测试环境比较实用但生产环境务必慎用先确认再执行。3.4 进入容器与执行命令进入正在运行的容器有两种流行方式docker exec -it web_demo /bin/bash docker attach web_demodocker exec -it是最推荐的因为它在容器里开启一个新的 shell 会话退出不会影响容器。docker attach则会直接连接到容器的主进程退出可能把容器也停掉不太建议日常使用。另外一个小技巧不进容器也能直接在容器里执行单个命令docker exec web_demo ls /etc/nginx这样批量操作容器时特别方便比如对多个容器执行同样的命令写个 for 循环即可。注意如果容器是精简的 Alpine 镜像里面多半没有 bash只有 sh这时候要用docker exec -it web_demo sh否则会报找不到 bash。3.5 容器与宿主机之间的文件拷贝docker cp可以双向拷贝# 宿主机 - 容器 docker cp /path/to/file web_demo:/etc/nginx/conf.d/default.conf # 容器 - 宿主机 docker cp web_demo:/var/log/nginx/access.log ./access.log这个命令在调试时非常实用。比如容器内没有 vim你可以在宿主机改好配置文件再拷进去然后 restart 容器生效。对于 Docker Desktop 用户文件拷贝可能是宿主机和容器互访最直接的方式比折腾文件共享更省心。我遇到过容器时间不对但宿主机时间正常排查日志又无从下手的情况。这时候用docker cp把容器内的日志拷出来在宿主机上分析比在容器里慢慢翻方便太多。4. 网络与数据卷容器之间怎么协同4.1 端口映射与网络模式Docker 容器默认是隔离的宿主机外部要访问容器内的服务必须通过-p做端口映射。除了默认的 NAT 网络Docker 还提供 host、none、bridge 等网络模式# 创建自定义网络 docker network create mynet # 查看网络列表 docker network ls # 指定网络运行容器 docker run -d --name redis --network mynet redis:6 # 连接 / 断开网络 docker network connect mynet web_demo docker network disconnect mynet web_demo自定义网络最实用的场景是容器间通过容器名互相访问。在同一个自定义网络中容器之间可以直接用容器名代替 IP 地址访问这比依赖固定 IP 更灵活因为容器重建后 IP 会变但容器名不变。举个实际例子你在 mynet 里跑了一个名为 mysql 的数据库容器另一个应用容器要连它直接用mysql:3306就能访问。如果不用自定义网络你就得查数据库容器的 IP容器一重启连接配置就失效非常麻烦。4.2 数据卷持久化不丢数据Docker 容器是“用完即走”的容器删除后容器内的数据默认也会一起消失。要持久化数据必须使用数据卷Volume或者绑定挂载Bind Mount。绑定挂载就是把宿主机的目录直接映射到容器内docker run -d -v /mydata:/var/lib/mysql mysql:8.0这样宿主机/mydata目录中的数据就是 MySQL 的存储目录即使容器删了数据依然在宿主机上。/mydata和/var/lib/mysql两个路径用冒号分隔左边是宿主机右边是容器。这个顺序和端口映射一样都是“宿主机在前容器在后”别弄反。命名卷则是 Docker 管理的目录不指定宿主机路径docker volume create mydata docker run -d -v mydata:/var/lib/mysql mysql:8.0命名卷有一个优点拷贝迁移数据的时候用docker volume命令比较方便而且不用担心宿主机路径不存在导致权限问题。4.3 数据卷备份与迁移有时需要把整个数据卷备份出来用这个经典的三步法# 先启动一个临时容器挂载数据卷再打包 docker run --name backup -v mydata:/data -v /backup:/backup ubuntu tar czf /backup/mydata.tar.gz -C /data . # 完成备份后删除临时容器 docker rm backup首次看到这种“用容器做临时工作台”的写法很多新手会懵。其实思路很简单利用容器做一次 tar 打包把数据卷的内容压缩到宿主机/backup目录用完即删。容器在这里只是工具不是目的。这种思维是玩 Docker 的重要进阶——容器可以按需创建、用完销毁它更像一个一次性的“作业环境”。5. 日志与资源监控出了问题先看哪里5.1 日志查看的高频用法docker logs是排查问题的第一入口docker logs web_demo # 查看全部日志 docker logs -f web_demo # 实时跟踪日志类似 tail -f docker logs --tail 200 web_demo # 只显示最近200行 docker logs --since 10m web_demo # 显示最近10分钟的日志在调试阶段加-f实时看日志反馈非常直观。如果容器启动失败第一时间docker logs 容器名比下载日志文件、找日志路径高效得多。这里有个容易被忽略的经验如果你的应用日志是写到文件而不是标准输出的docker logs可能看不到任何内容。尽量让应用把日志打到 stdout标准输出这样既能统一用docker logs查看也为以后接日志采集系统打下基础。我见过不少应用把日志写在/var/log/app.log容器一重启日志就丢了排查问题非常痛苦。5.2 资源占用与实时监控docker stats类似于 Linux 的top动态显示每个容器的 CPU、内存、网络 I/O、磁盘 I/Odocker stats docker stats --no-stream # 只显示一次不持续刷新docker system df可以查看 Docker 整体的磁盘占用docker system df它会分别展示镜像、容器、数据卷、构建缓存各自占用的空间。当磁盘空间告急时先跑这个命令定位问题可能只需一个清理命令就解决了。5.3 空间清理全家桶# 清理停止的容器、无用网络、悬挂镜像、构建缓存 docker system prune -a # 只清理停止的容器 docker container prune # 清理无用镜像 docker image prune # 清理无用数据卷 docker volume prune这里要特别提醒docker system prune -a会清理所有未被容器使用的镜像包括你辛苦拉下来、临时想留着的镜像。执行前一定要看清提示确认没问题再输y。数据卷的清理更要慎重volume prune会删除所有未被使用的数据卷一旦执行数据无法找回。6. 从命令到编排docker compose 的常用操作6.1 docker compose 的基本命令当项目包含多个服务时比如前端、后端、数据库、缓存一条条docker run显然不可行。docker compose通过一个docker-compose.yml文件把所有服务编排起来docker compose up -d # 后台启动所有服务 docker compose ps # 查看服务的运行状态 docker compose logs # 查看所有服务日志 docker compose logs -f web # 跟踪某个服务的日志 docker compose down # 停止并移除服务默认不删数据卷 docker compose down -v # 停止并移除服务同时删除数据卷慎用 docker compose restart # 重启所有服务我见过很多人把docker compose down -v当成“清理环境”的万能命令结果把数据库数据卷也删了教训惨痛。如果你的数据库数据存在命名卷里down不会删除数据卷但加-v会所以-v一定要明确知道后果才用。还要注意版本差异老版本的命令是docker-compose带横杠新版 Docker Compose 推荐使用docker compose空格分隔。两者核心功能一致但新写法是独立的 compose 子命令不需要单独安装。如果你的环境只支持老版本把命令里的空格换成横杠即可。6.2 compose 参数与 docker run 的对应关系对初学者来说docker-compose.yml里最常见的几个字段其实就是docker run参数的“翻译”docker run 参数compose 字段说明--namecontainer_name容器名称-pports端口映射-vvolumes卷挂载-eenvironment环境变量--restartrestart重启策略--networknetworks所属网络理解了对应关系即使不熟悉 YAML 语法也能很快读懂别人的 compose 文件。遇到 compose 文件报错优先检查缩进YAML 对空格极其敏感一个缩进错误会导致整个文件解析失败。拿一个常见的 MySQL 8.0 部署举例compose 文件的核心片段大致这样services: mysql: image: mysql:8.0 container_name: mysql8 restart: always ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: root volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:这段配置等价于一条很长的docker run命令。用 compose 之后你不需要记忆一长串参数改配置也只需要编辑 YAML 文件团队协作时把文件放进仓库大家拉下来直接docker compose up -d就能复现环境这就是编排的价值。7. Docker 常见问题与排查技巧实录这一节是重头戏我把自己和身边同事踩过的坑做个清单。这些问题在社区里反复被问但真实有效的排查思路往往散落在各个回答里这里我把它们集中整理出来。7.1 Docker Desktop 启动失败提示虚拟化未开启Windows 上安装 Docker Desktop 后启动常常报类似 “Docker Desktop failed to start because virtualization support was not detected” 的错。这个问题的核心是 WSL2 或者 Hyper-V 依赖的虚拟化功能没有正常开启。排查步骤打开任务管理器切换到“性能”标签确认 CPU 是否显示“虚拟化已启用”如果没有启用重启电脑进入 BIOS/UEFI找到 Intel VT-xIntel 平台或 SVM ModeAMD 平台开启后保存重启开启 Windows 功能里的“适用于 Linux 的 Windows 子系统”和“虚拟机平台”执行wsl --set-default-version 2确保 WSL 使用 2 代版本重启 Docker Desktop还有一个容易被忽略的点如果你在 VMware 或 VirtualBox 虚拟机里跑 Windows再装 Docker Desktop嵌套虚拟化也需要在宿主机虚拟机设置里开启。这个问题排查起来很绕我折腾过一下午才定位。7.2 无法连接 Docker APIWindows 下常见报错是类似 “failed to connect to the docker api at npipe:////./pipe/dockerdesktoplinuxen”。这个报错几乎所有 Docker Desktop 用户都会遇到。原因通常是 Docker Desktop 的后端服务没有正常启动或者 WSL2 后端切换出问题。解决思路确认 Docker Desktop 的鲸鱼图标状态是不是 Running绿色点击 Dashboard - Troubleshoot - Restart Docker Desktop如果还不行退出 Docker Desktop打开 PowerShell管理员身份执行wsl --shutdown强制关闭 WSL 再启动Windows 上有安全软件拦截 Docker 服务端的情况也出现过可以暂时退出安全软件测试这类问题没有一键万能解法核心是“重启 Docker Desktop 重置 WSL 后端”这套组合拳80% 的 npipe 连接问题都能解决。7.3 容器启动后立刻退出新手最容易碰到的问题docker run执行成功但docker ps看不到任何容器用docker ps -a却发现容器状态是 Exited。先看日志是最快的路径docker logs 容器名有几个高频原因前台进程在后台模式的镜像比如直接运行 ubuntu 镜像不带-it容器没有可持久的进程会立刻退出。解决加-it进入交互模式或者使用一个阻塞命令比如tail -f /dev/null环境变量配错比如 MySQL 镜像缺少必要的环境变量端口被占用容器绑定端口失败启动脚本里路径写错容器内不存在对应文件其中第一个原因最经典。很多人跑docker run -d ubuntu发现容器秒退就是因为 ubuntu 默认前台没有长驻进程。docker run -d的本质是要求容器有一个前台持续运行的进程没有的话容器启动后立刻退出属于正常现象。7.4 镜像拉取慢、超时除了配置加速器之外还可以换一下拉取方式# 先搜索再拉取 docker search nginx docker pull nginx:alpineAlpine 版本镜像通常比默认的 Debian 官版小很多nginx:alpine只有几十 MB而nginx:latest有上百 MB。对于不需要 glibc 兼容的普通服务优先选 alpine 标签能大幅减少下载时间和镜像体积。但要注意Alpine 镜像基于 musl libc某些依赖原生库的软件可能编译有问题。如果遇到奇怪的原生库兼容问题换回 Debian 底座的镜像试试往往就能解决。镜像体积和兼容性之间需要权衡不能一味追求小。7.5 容器内时间与宿主机不一致容器内默认时区是 UTC和北京时间差 8 个小时。查日志会发现时间错乱排查问题时相当困扰。解决办法是在run的时候挂载时区文件docker run -d \ -v /etc/localtime:/etc/localtime:ro \ -e TZAsia/Shanghai \ nginx老版本镜像里可能没有tzdata或者zoneinfo即使挂载也不能生效这种情况需要在镜像构建时安装时区数据属于镜像构建时需要考虑的问题。举个例子如果你的应用要定时上报数据容器时间不对会导致上报时间戳混乱这种问题排查起来非常隐蔽。7.6 磁盘空间被容器/镜像占满开发机子跑几个月 Docker磁盘动不动满。清理思路按优先级排序docker system df看哪类资源占用最多docker container prune清掉停止的容器注意docker ps -a里很多 Exited 的垃圾容器docker image prune清掉悬挂镜像没有标签也没有关联容器的镜像docker builder prune清掉构建缓存经常构建镜像的话构建缓存可能占好几个 Gdocker volume prune谨慎执行确认数据安全性后再手动删不要图省事一上来就docker system prune -a它会把停止的容器、未被使用的网络、悬挂镜像以及构建缓存全部清理掉可能误伤你暂时不想删的镜像。先看清楚占用再有目的地清理才是稳妥的做法。7.7 容器内无法访问宿主机服务容器内 localhost 指的是容器自己不是宿主机。如果容器需要访问宿主机上启动的 MySQL 或 Redis不能直接用localhost:3306在 Linux 下可以用宿主机 IP也可以使用 Docker 专门提供的特殊主机名host.docker.internal。在 Mac 和 Windows 的 Docker Desktop 中host.docker.internal可直接使用Linux 下部分版本的 Docker Engine 也支持但某些环境需要加--add-hosthost.docker.internal:host-gateway参数。这个问题排查起来非常隐蔽我遇到过应用服务死活连不上数据库最后才发现是 localhost 语义理解错了。7.8 修改了配置不生效很多人会直接进容器改配置文件然后发现重启后配置被还原或者部分镜像重启后自动重新生成配置。这其实是容器的不可变基础设施设计使然容器重启用的是镜像里的原始文件容器层写入的数据在容器重建后会消失。正确做法将配置文件或者数据目录用-v挂载到宿主机在宿主机改文件重启容器生效或者通过环境变量传入配置官方镜像通常支持丰富的环境变量如果是自定义应用建议把需要动态修改的配置放到配置中心或者外部文件理解了这一点很多“配置改了不生效”的问题都能迎刃而解。这不是 Docker 的 Bug而是使用方式的错误。官方提供的 nginx、MySQL、Redis 等镜像都推荐用环境变量或挂载的方式来配置进容器手改文件是临时调试手段不是正规操作。8. 实操阶段的自查清单与学习路径建议8.1 每天随手练的几个命令组合学习 Docker 最有效的方式就是反复手动创建、查看、清理。我自己练习时常用的组合包括# 练习拉取镜像并后台运行验证端口映射 docker pull nginx:alpine docker run -d --name n1 -p 8081:80 nginx:alpine curl http://localhost:8081 # 练习进入容器操作 docker exec -it n1 sh ls /usr/share/nginx/html exit # 练习创建自定义网络让两个容器互通 docker network create quick-net docker run -d --name n2 --network quick-net nginx:alpine docker run -d --name n3 --network quick-net nginx:alpine docker exec n2 ping n3 # 练习清理 docker rm -f n1 n2 n3 docker network rm quick-net docker image rm nginx:alpine这种“创建 - 验证 - 清理”的闭环比单纯看文档记忆效果好太多。等你形成肌肉记忆看到服务的部署需求时脑子里会自动映射出对应的run命令。关于 ping 练习Alpine 镜像默认可能没装ping工具如果报找不到命令先执行apk add iputilsAlpine 的包管理器命令再试。这个细节也是容器精简镜像的常见坑之一。8.2 一套可以直接抄走的避坑清单docker run前先确认端口是否被占用ss -lntp或netstat -ano挂载目录时宿主机目录路径尽量用绝对路径生产环境不要用latest标签锁定具体版本号否则更新后行为可能变化进入容器优先用docker exec不要用docker attach应用日志尽量打到 stdout方便docker logs集中查看删除数据卷前三思删除前再确认一次容器是否还需要这套清单是多次踩坑换来的。比如用latest标签的问题我就遇到过镜像更新后行为完全变样的尴尬排查了很久才发现是某个基础镜像的版本变了。锁版本、做缓存、写注释这些基本功虽然不酷但能省下大量线上事故的时间。9. 最后分享一点个人学习心得学 Docker 命令的过程本质上是在学“如何用容器的思维管理服务”。一开始我也是把 Docker 当成虚拟机的替代品往里装东西、手动配置后来才意识到容器应该是“用完即弃、不可变”的。理解了这一点后Docker 的很多设计就顺理成章了为什么容器重启配置会还原为什么数据一定要挂卷为什么日志建议输出到 stdout在实际使用中我最大的体会是不要妄想背下所有命令而是要把常用命令变成习惯把排查问题的思路变成直觉。遇到问题先看日志再定位网络、存储、配置最后再考虑是不是镜像本身的问题。这个顺序能帮你少走很多弯路。最后再分享一个小技巧可以给 Docker 命令配置 shell 别名比如把docker ps -a简化成dps或者用docker system prune这类清理命令时加个确认提示。如果愿意花点时间配置 zsh 的补全插件日常操作效率还能再上一个台阶。工具永远是放大器但前提是你自己已经掌握了核心原理。
返回列表