Docker实战指南:从环境搭建到微服务编排的完整攻略
先交代一句这套整理是我结合自己多年用Docker做开发和部署时踩过的坑参考“狂神说docker最全笔记”的知识脉络重新梳理的。内容覆盖从零安装、常用命令、镜像原理、数据卷与网络、实战部署MySQL/Redis/GitLab、Docker Compose编排再到高频故障排查适合刚入门的后端开发、运维新手也适合已经用了一段时间但一直没把原理串起来的同学。1. Docker到底是什么为什么值得花时间学1.1 “环境地狱”是每个开发者的第一道坎我做后端开发大概第三年的时候遇到一个特别常见但特别折磨人的场景本地跑得好好的代码同事拉下来怎么都起不来问了一圈发现是JDK版本不一样好不容易统一了JDK测试环境又报依赖缺失等上了生产数据库密码、Redis地址、文件路径全都要重新配一遍。那段时间项目组“会上线半小时排查环境两小时”成了常态。Docker解决的就是这个问题。它把你的应用、依赖、配置、系统环境全部打包成一个标准化的东西这个标准化单元就是镜像。你本地跑起来什么样拿到服务器上跑就是什么样拿到同事电脑上跑还是什么样。说白了一句话把“环境地狱”变成“一次构建处处运行”。1.2 镜像、容器、仓库Docker的三块基石理解Docker先抓住三个词镜像Image、容器Container、仓库Repository。镜像是一个只读的模板里面装好了运行某个应用所需要的操作系统层、依赖库、应用代码和启动命令。它相当于一个“安装光盘”或者“类”是静态的。容器是镜像运行时的实例相当于你把光盘塞进光驱启动之后的样子是动态的。仓库则用来集中存放镜像方便你跟别人分享、拉取最常用的就是Docker Hub。这三个概念对应到实际使用你用docker pull mysql:8.0从仓库拉镜像用docker run启动一个MySQL容器容器里面跑的是实实在在的MySQL进程。整个过程跟“下载安装包→安装软件→使用软件”的思维模型是一样的熟悉起来并不难。1.3 为什么说Docker比虚拟机轻得多在Docker之前大家解决环境隔离的方式是虚拟机。虚拟机需要在物理机上再虚拟出一套完整的操作系统每个VM都要消耗大量CPU、内存和磁盘启动通常要几十秒甚至分钟级。Docker走的是“进程级隔离”路线多个容器共享宿主机的操作系统内核彼此之间通过内核的命名空间namespace做资源隔离通过cgroups做资源限制。结果就是启动一个容器通常只需要几百毫秒接近原生进程单个容器的额外资源开销极小一台机器能跑几十上百个容器镜像体积通常只有几十MB到几百MB而虚拟机动辄几个GB我自己的体会是同等配置的服务器以前只能部署两三个虚拟机应用现在用Docker可以轻松跑十几个服务这优势对个人开发机尤其明显。2. 环境准备Windows和Linux下安装Docker的完整流程2.1 Windows上安装Docker DesktopWindows下面装Docker我强烈建议直接用Docker Desktop别再折腾老旧的Docker Toolbox了那玩意儿依赖VirtualBox网络模式坑特别多。Docker Desktop目前推荐基于WSL 2后端运行工作表现比原来的Hyper-V方案更流畅文件挂载的速度也快很多。安装步骤其实非常傻瓜式从Docker官网下载Docker Desktop for Windows的安装包直接下一步安装。安装完成后第一次启动会提示需要启用WSL 2。这一步需要在PowerShell管理员里执行命令wsl --install然后重启电脑让WSL 2的内核组件生效。重启后打开Docker Desktop如果看到右下角鲸鱼图标转起来就说明已经在运行了。打开命令行输入docker version能看到Client和Server两段信息说明安装成功。这里要特别说明真正干活的是Server端如果只显示Client段、Server段报错或缺失说明Docker引擎没起来多半是虚拟化或WSL 2设置有问题。2.2 启动失败Virtualization support not detected怎么处理很多人在Windows上装完Docker Desktop启动时直接弹红框里面写着“Virtualization support not detected”或者“Docker Desktop failed to start because virtualisation support wasnt detected”。这个报错的本质是Docker Desktop检测不到CPU虚拟化能力Intel VT-x或者AMD-V。排查思路按下面顺序走打开任务管理器 → 性能 → CPU看右下角“虚拟化”这一项如果显示“已启用”就说明BIOS层面没关。如果显示“已禁用”需要重启电脑进BIOS找到“Intel Virtualization Technology”或者“SVM Mode”改成Enabled。不同品牌主板位置不一样一般在Advanced / CPU Configuration里面。如果BIOS已经打开了还不行检查Windows功能里“适用于Linux的Windows子系统”和“虚拟机平台”这两个可选功能有没有勾选上。我遇到过一个案例BIOS没问题就是没勾“虚拟机平台”WSL 2跑不起来导致Docker启动失败。实在不行试试命令行执行bcdedit /set hypervisorlaunchtype auto然后重启这个命令是确保Windows自带的Hyper-V引导层能正常加载。注意确认虚拟化前先判断你的CPU是否支持虚拟化。老一点的低压CPU比如某些赛扬可能硬件就不支持那就没辙了。2.3 Linux上安装DockerCentOS / Ubuntu服务器上用Docker主流还是CentOS 7或Ubuntu 20.04以上版本。两块系统我都装过命令差异不大。CentOS 7的安装推荐把这套镜像源切到国内的阿里云镜像源速度比官方源稳定得多也顺便能避免一些网络超时问题# 卸载旧版本如果有 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # 安装yum-utils和阿里云repo sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 编译缓存并安装 sudo yum makecache fast sudo yum install -y docker-ce docker-ce-cli containerd.io # 启动并设置开机自启 sudo systemctl start docker sudo systemctl enable dockerUbuntu这边官方推荐用apt的官方源证书方式但国内同样建议先换源。简便起见可以用阿里云的Ubuntu镜像源文档里的脚本装好后同样用systemctl启动。2.4 CentOS 7版本太旧导致Docker服务启动失败热词里有“centos7升级docker”这个场景特别常见。CentOS 7默认repo里的docker版本特别老甚至还是Docker 1.13而新版Docker要求的内核特性它都没有所以一定不要yum install docker要用上面的docker-ce源装新的Docker CE。如果已经装了老版本升级方式很简单# 停掉老服务 sudo systemctl stop docker # 按上面1.1的卸载命令移除老版本然后重新按docker-ce流程装装完新版本后执行docker info如果看到“Server Version: 2x.x.x”说明升级成功。这里提醒一句有些机器升级完启动报“iptables failed”之类的错误多半是老版本的残留配置用systemctl reset-failed docker清理一下再启动。2.5 阿里云镜像加速器配置解决镜像下载慢“docker镜像下载慢”是所有国内用户必踩的坑。Docker官方仓库在国外裸连拉一个几百MB的镜像经常断断续续。解决方案配置镜像加速器。国内云厂商都提供免费的容器镜像加速服务我一直在用的方案是阿里云容器镜像服务。登录阿里云控制台在“容器镜像服务” → “镜像加速器”页面能拿到专属加速地址然后在/etc/docker/daemon.json里写入{ registry-mirrors: [https://你的专属加速地址.mirror.aliyuncs.com] }写完重启sudo systemctl daemon-reload sudo systemctl restart docker注意这里说的是官方合规的容器镜像加速方式。不要从网上随便复制来路不明的加速地址既不稳定也不安全。3. Docker常用命令速查镜像、容器与日常操作3.1 镜像命令search/pull/images我平时用Docker的习惯是“先查、再拉、后看”。docker search 镜像名在Docker Hub里搜镜像。比如想装MySQL执行docker search mysql能看到官方镜像和其他人的镜像。注意看STARS数点赞数和OFFICIAL列优先选OFFICIAL的。docker pull 镜像名:标签拉取镜像。比如docker pull mysql:8.0。标签相当于版本号常见的有latest最新版、8.0、5.7等。我个人的建议是生产环境不要用latest因为版本不可控一旦上游更新部署的机器之间容易不一致。docker images列出本地已经有的镜像显示仓库名、标签、镜像ID、创建时间和大小。3.2 容器生命周期run/ps/stop/rm容器相关的命令是整个Docker里最核心、使用频率最高的部分。先看启动docker run -d -p 3306:3306 --name mysql-8 -e MYSQL_ROOT_PASSWORD123456 mysql:8.0拆开解释一下每个参数的含义这个很多人只记住会敲但不知道为什么要敲-d后台运行容器。不加的话终端会卡在前台退出终端容器就跟着停。-p 3306:3306端口映射。宿主机3306端口映射到容器内3306端口。容器里的MySQL默认监听3306宿主机可不一定所以一定要做映射。--name mysql-8给容器起个名字方便直接通过名字管理代替一串随机ID。-e MYSQL_ROOT_PASSWORD123456设置环境变量。MySQL官方镜像会读取这个变量来初始化root密码。mysql:8.0指定启动用的镜像。查看和管理容器docker ps查看正在运行的容器。docker ps -a查看所有容器包括已经停止的。docker stop 容器名/ID停止容器。docker start 容器名/ID启动已停止容器。docker restart 容器名/ID重启容器。docker rm 容器名/ID删除容器必须先停止。批量删除停止的容器可以docker container prune。docker rmi 镜像ID删除镜像。3.3 日志、进程与元数据排查三件套运行中的容器出了问题排查顺序我一般是 logs → top → inspect。docker logs 容器名查看容器日志。加-f参数可以像tail -f一样持续输出--tail指定查看最后N行。比如docker logs -f --tail 100 mysql-8就是看最近100行日志并持续跟随。docker top 容器名查看容器内正在运行的进程作用和ps类似。我排查“容器里MySQL为什么CPU飙高”时就用它看到底是哪个进程在吃资源。docker inspect 容器名查看容器的详细配置信息输出是一个超大的JSON包括挂载情况、网络配置、环境变量等。排查问题时超级有用比如想确认某个路径到底挂到宿主机哪个目录就用它。3.4 进入容器的两种方式exec还是attach需要进入容器内部操作时有docker exec和docker attach两种方式。它们的区别不少人搞混。docker exec是在容器里新起一个进程最常用的是docker exec -it 容器名 /bin/bash进入后打开一个bash交互终端在里面执行命令。退出用exit不会影响容器本身。docker attach是连接到容器的主进程上就像你直接看到了容器启动时那个前台进程的输入输出。它的特点是你用exit退出时会连同主进程一起退出也就是会把容器停掉。这不是想要的行为所以日常操作我几乎只用exec。经验分享容器内不一定有bash一些精简镜像只带sh。如果docker exec -it 容器名 /bin/bash报错换成/bin/sh试试。4. 镜像原理与Dockerfile实战从“怎么用”到“怎么写”4.1 联合文件系统与分层很多教程只让人拉镜像、跑容器但完全没讲镜像为什么能做到体积小、拉取快。核心就在于“分层”。Docker镜像由多层只读层组成每一层记录一次文件系统的变更。比如mysql:8.0这个镜像底层是一个精简的Linux发行版比如Oracle Linux基础层上面加了一层MySQL依赖库层再上面加一层MySQL安装层最上面可能还有一层配置初始化层。这种设计的好处有两个复用性极强。你本地已经有了基础层再拉基于同款基础层的其他镜像只需要下载增量层。节省磁盘空间。同一个基础层可以被多个镜像共享只存一份。对普通使用者来说理解分层的好处在于当你看到“Pulling fs layer”的时候你不会慌知道这是Docker在按层下载。4.2 不要随便用commit制作镜像刚学Docker的人容易“手痒”进容器装了一堆东西后用docker commit 容器名 新镜像名把当前容器保存成新镜像。这种方式能做镜像但我不建议日常使用原因是commit只记录容器当前文件系统与原始镜像的差异不记录你执行过的命令别人拿到的镜像根本无法复现构建过程。镜像内部会有很多临时文件、历史操作残留体积越来越大。所以commit只适合“快速保存现场做演示”正经做镜像一定用Dockerfile。4.3 Dockerfile核心指令写一个能用的最小DockerfileDockerfile就是一套构建镜像的“自动化脚本”。下面是我常用的一个Java后端服务Dockerfile示例# 基础镜像选择带JDK的Linux环境 FROM openjdk:8-jdk-alpine # 作者信息仅备注 LABEL maintaineryournameexample.com # 设置容器内的工作目录后面的命令默认在这个目录下执行 WORKDIR /app # 把宿主机target目录下的jar包复制进容器 COPY target/demo.jar /app/demo.jar # 声明端口仅起说明作用实际映射靠运行时-p EXPOSE 8080 # 启动命令 ENTRYPOINT [java, -jar, demo.jar]构建命令docker build -t my-demo:1.0 .注意最后那个点表示构建上下文build context是当前目录。这个目录下所有文件都会被发送给Docker客户端去构建所以不要放在一个包含大量无关节目的目录里构建会把构建过程拖慢。4.4 CMD与ENTRYPOINT到底有什么区别Dockerfile里CMD和ENTRYPOINT都用来指定容器启动时执行什么命令但行为差别很大CMD在被docker run时传入的命令覆盖。也就是说docker run my-image echo hello会把CMD指定的命令替换掉。ENTRYPOINT不会被docker run传入的普通参数覆盖传入的参数会作为它的额外参数拼在后面。举个实际场景在CMD模式下如果别人运行你的镜像时忘了加任何参数容器可能直接不干活用ENTRYPOINT时默认执行你写死的命令传入参数只是附加。我的经验是当容器启动命令本身没有歧义、不需要外部覆盖时用ENTRYPOINT更稳当希望镜像像“命令行工具”一样开放参数时用CMD配合ENTRYPOINT的混合形式。4.5 IDEA一键打包Docker镜像热词里出现“idea 打包docker镜像”这个场景后端开发经常遇到。IDEA装好Docker插件新版本IDEA自带配置方法如下打开IDEAFile → Settings → Build, Execution, Deployment → Docker。点加号选择Docker for Windows或者填远程Docker的TCP地址测试连接显示Connection successful就对了。在项目里写一个Dockerfile放到项目根目录。在IDEA里右键Dockerfile选择“Create Dockerfile Run Configuration”运行就能自动构建镜像也可以在Services面板里直接manage images。配置一次之后改完代码直接打包省得每次去命令行敲构建命令。不过生产环境上我通常还是走CI流水线IDEA这种方式开发自测足够。5. 容器数据卷与网络用好这两个机制容器才算真正落地5.1 为什么必须用数据卷新手最容易踩的坑是MySQL跑在容器里结果容器一删数据全没了。原因很简单容器是一种临时性的东西它的文件系统与镜像叠加容器停止或删除后这些改变如果没有持久化就会被丢掉。解决方式就是数据卷Volume。数据卷的本质是跳过容器的可写层把宿主机的一个目录直接挂载到容器里的某个目录。往容器写入的数据会实时写到宿主机目录上容器删了数据还在下次起新容器再挂载同一个目录数据就回来了。5.2 三种挂载方式Docker的挂载从操作方式上分三种匿名挂载-v /容器内路径Docker自动分配宿主机的一个目录但你没写宿主机路径管理和迁移都很麻烦不建议主动用。具名挂载-v 卷名:/容器内路径好理解也好管理方便在多个容器间共享数据。指定路径挂载-v /宿主机绝对路径:/容器内路径最直观推荐日常使用。MySQL和Redis我都用这种方式方便直接打开宿主机目录查看和备份。实战中挂载MySQL数据的命令docker run -d \ -p 3306:3306 \ --name mysql-8 \ -v /data/mysql/conf:/etc/mysql/conf.d \ -v /data/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD123456 \ mysql:8.0这样MySQL数据落在宿主机/data/mysql/data做备份、迁移直接拷目录就行。5.3 五大网络模式先分清再选择Docker默认提供几种网络模式常见的是bridge模式默认模式。每个容器分配一个虚拟IP容器间可以互通宿主机通过端口映射访问容器。host模式容器直接使用宿主机的网络栈没有网络隔离性能最好但端口会直接占用宿主机端口。none模式容器没有网络。container模式新容器共用另一个已存在容器的网络命名空间适合需要共享网络栈的场景。自定义网络bridge自定义强烈推荐。5.4 自定义网络别再手动连IP了容器之间互相访问如果靠IP容器重启后IP就会变配置就全乱了。解决办法是创建自定义网络让容器之间通过容器名互相解析。# 创建自定义网络 docker network create my-net # 两个容器都加入这个网络 docker run -d --name mysql-8 --network my-net mysql:8.0 docker run -d --name my-app --network my-net -p 8080:8080 my-app:1.0之后在my-app容器里直接访问mysql-8:3306就能连上MySQL不用关心MySQL容器的IP是多少。这套机制是我把多个服务做成容器编排时使用频率最高的功能没有它容器互联就是噩梦。6. 实战部署MySQL 8.0、Redis主从与GitLab6.1 安装MySQL 8.0并完成外部访问第二步里提过启动MySQL的命令现在补充一些细节。用MySQL 8.0时默认字符集是utf8mb4这点很好但连接方式有变化——8.0默认使用caching_sha2_password认证有些老客户端比如5.x的JDBC驱动连不上报错信息一般类似 “Unable to load authentication plugin caching_sha2_password”。解决办法是在容器启动时加参数docker exec -it mysql-8 mysql -uroot -p进MySQL后执行ALTER USER root% IDENTIFIED WITH mysql_native_password BY 新密码;或者建议新建一个专门的应用账号比如CREATE USER app% IDENTIFIED BY app123; GRANT ALL PRIVILEGES ON *.* TO app%; FLUSH PRIVILEGES;外部访问前用宿主机上执行docker ps看一下端口映射有没有起来。然后从宿主机用MySQL客户端或Navicat连接宿主机IP:3306能通说明部署成功。6.2 部署Redis单机和主从单机Redis一句命令就能起docker run -d \ -p 6379:6379 \ --name redis \ -v /data/redis/conf/redis.conf:/etc/redis/redis.conf \ -v /data/redis/data:/data \ redis:7.0 redis-server /etc/redis/redis.conf注意尾部的redis-server /etc/redis/redis.conf意思是覆盖默认启动命令改用我们挂载进去的配置。这一步很容易踩坑如果不加这个Redis会忽略挂载的配置文件。主从部署我需要起一个主节点、一个从节点。为了让从节点通过主节点容器名找到主节点我给两容器建在同一自定义网络里docker network create redis-net # 主节点 docker run -d --name redis-master --network redis-net -p 6379:6379 \ -v /data/redis-master/conf/redis.conf:/etc/redis/redis.conf \ redis:7.0 redis-server /etc/redis/redis.conf # 从节点 docker run -d --name redis-slave --network redis-net -p 6380:6379 \ -v /data/redis-slave/conf/redis.conf:/etc/redis/redis.conf \ redis:7.0 redis-server /etc/redis/redis.conf --slaveof redis-master 6379验证主从是否成功进从节点执行docker exec -it redis-slave redis-cli info replication看到role:slave并且master_link_status:up就说明主从正常。6.3 部署GitLab内存与端口的坑GitLab是个典型的重量级镜像内存占用不容小觑。参考官方推荐至少4GB可用内存少于这个数基本跑不起来。如果是个人服务器可以关掉一些组件docker run -d \ -p 8080:80 \ -p 2222:22 \ --name gitlab \ --restart always \ -v /data/gitlab/config:/etc/gitlab \ -v /data/gitlab/logs:/var/log/gitlab \ -v /data/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latestGitLab第一次初始化比较慢通常需要3到5分钟甚至更久用docker logs -f gitlab观察日志看到“GitLab is up and running”之类的提示再访问web。初次登录时root账号的初始密码存放在容器内/etc/gitlab/initial_root_password需要在容器起来后读取docker exec -it gitlab cat /etc/gitlab/initial_root_password这个文件在首次运行后24小时会自动删除所以要尽快记录下来。另外如果8080端口被占用了换一个宿主端口访问地址用http://宿主机IP:8080。6.4 镜像下载慢或拉取失败的处理思路除了前面说的配置镜像加速器之外再补充一个排查点。如果执行docker pull时经常卡在某一层或者报“unexpected EOF”往往是网络连接不稳定。建议配置加速器后重试一到两次。镜像标签不要用latest有些大镜像的latest会包含所有架构的清单体积大。明确指定标签如mysql:8.0.31更小也更稳。如果只在一台机器上慢换一台机器拉取后再docker save打包成tar文件拷贝到目标机器用docker load导入。7. 从单机到编排Docker Compose实战7.1 Compose解决什么问题用Docker之后你可能很快会遇到一个尴尬一个项目要跑MySQL、Redis、后端、前端好几个容器。每个都用docker run去启动参数又臭又长关键顺序还不能乱。真要这样操作几次就会意识到需要一枚“一键启动”的编排工具。Docker Compose就是干这个的。它通过一个YAML格式的配置文件把多个容器之间的镜像、端口、挂载、环境变量、依赖关系全部声明清楚。一条docker compose up -d全部搞定。热词里的“docker青龙 依赖管理”属于依赖容器管理场景用Compose也会方便很多因为依赖项的安装和启动顺序可以在Compose里定义。7.2 一个能直接抄的docker-compose.yml示例比如部署WordPress MySQL这是Compose官方经典示例也是我当年练手时跑通的第一个样例version: 3.8 services: db: image: mysql:8.0 restart: always environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: wordpress volumes: - db_data:/var/lib/mysql wordpress: depends_on: - db image: wordpress:latest restart: always ports: - 8080:80 environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: root WORDPRESS_DB_PASSWORD: root123 WORDPRESS_DB_NAME: wordpress volumes: db_data:注意两个点depends_on保证wordpress容器会在db容器之后启动但要注意它只控制启动顺序不保证db服务完全就绪。更严格的做法是在应用里做重试连接。服务名db在容器网络中就是一个域名wordpress里的WORDPRESS_DB_HOST直接写db:3306不用关心IP。7.3 Compose常用命令docker compose up -d后台启动编排中定义的所有服务。docker compose down停止服务并删除网络默认不删数据卷。docker compose ps查看编排服务的状态。docker compose logs -f跟随查看所有服务的日志。docker compose exec 服务名 命令进入某个服务容器执行命令。新版本Docker都内置了docker compose子命令老版本需要单独安装docker-compose。从某个时间点开始我统一用新版命令后再没碰过老版。7.4 微服务项目用Compose编排的典型结构热词里有“docker部署微服务项目”我简单说一下套路。微服务系统一般会有网关、注册中心、配置中心、若干个业务服务、MySQL、Redis、消息队列等组件。部署时把它们全部写进Compose文件服务间靠服务名互相调用。注意几点配置外置把数据库密码等敏感信息通过环境变量传入不用在代码里写死。挂载日志目录每个服务都把日志目录挂到宿主机统一路径下排查问题方便。加上restart: unless-stopped让服务在意外退出时能自动拉起。灰度发布时先构建新镜像再用docker compose up -d --build增量更新。8. 常见问题与排查技巧实录8.1 拉取镜像报 unexpected EOF这个报错是拉取镜像过程中网络中断导致的。常见场景是拉大镜像时网络闪断或代理不稳定。排查方法先看docker pull输出卡在哪一层记住那一层的哈希重试时看到同一层会继续相当于断点续传。检查磁盘空间df -h拉镜像时磁盘满了也会出现奇怪的EOF。配好加速器后再重试成功率显著提高。8.2 Docker Desktop启动失败与npipe连接报错Windows上另一个高频报错是failed to connect to the docker api at npipe:////./pipe/dockerDesktopLinuxEngine这是Docker引擎没启动。常见原因是Docker Desktop的Linux后端没起来。处理顺序右键点击Docker Desktop图标选择“Restart”。在PowerShell里执行wsl --shutdown彻底关闭WSL进程然后重新启动Docker Desktop。打开任务管理器看是否有残留的Docker进程有就结束掉再重启。检查Windows安全软件有没有拦截Docker相关进程。8.3 Docker服务启动失败LinuxLinux下systemctl start docker报错时一定先看详细原因systemctl status docker.service journalctl -xu docker.service --no-pager | tail -50常见原因iptables版本或配置问题尝试重启systemctl restart iptables。selinux导致挂载失败临时关闭测一下setenforce 0。磁盘空间不足。docker的 daemon.json 配置格式错误导致服务起不来。8.4 Docker权限错误permission denied刚装完Docker直接执行docker ps报Got permission denied while trying to connect to the Docker daemon socket是因为当前用户不在docker用户组里。解决办法sudo usermod -aG docker $USER然后退出终端重新登录或者newgrp docker再执行docker ps就不需要加sudo了。8.5 其他高频词的简要提醒热词里还有“docker registry 镜像”、“docker部署kodbox”、“docker部署milvus 单机版”、“人大金仓数据库docker”、“kali搭建dvwa靶场docker”等。这类镜像的部署方式其实都绕不开几个要点确认架构匹配、正确挂载数据目录、按官方文档设置环境变量、注意端口冲突。有了前面的基本功换任何镜像都只是参数不同而已。比如“人大金仓数据库docker”这种国产数据库镜像先docker pull或在官方仓库搜到镜像名再按官方给出的run命令启动遇到问题优先看日志。不会因为镜像不同命令体系就变一套。关于“龙芯 docker”这种非x86平台我要提醒一句Docker镜像分平台拉镜像时尽量用与宿主机架构匹配的标签比如loongarch64或arm64否则会提示“exec format error”或者运行起来直接报找不到可执行文件。用uname -m先确认架构。我个人在实际运维中的体会是Docker真正难的不是命令而是理解“层、卷、网络”这三个核心模型。命令忘了一查文档就回来了但模型理解不透出了错会连排查方向都找不到。刚上手的时候没必要追求一次性把所有高级特性都用上先把镜像拉得起、容器跑得顺、数据存得牢这三件事做扎实后面学什么都会很快。如果你正在学Docker建议从今天开始把自己电脑上常用的MySQL、Redis都换成容器方式跑一遍踩几个坑比看十篇笔记都管用。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →