新闻详情

新闻详情

首页 / 资讯中心 / 详情

Linux与Docker初体验:从基础命令到容器部署的完整学习路线

发布时间:2026/9/15 3:53:32来源:尧图网络
Linux与Docker初体验:从基础命令到容器部署的完整学习路线
Linux、Docker初体验学习笔记这篇笔记拖了挺久。前阵子公司来了几个新人问我Linux和Docker怎么入门我说你把这两样合在一起学比分开学效率高得多。他们刚开始还不信后来照着这套路子走完反馈都说“早知道这么搭着学就好了”。今天把当时的学习路线、常用命令和踩过的坑整理出来给同样刚起步的朋友做个参考。无论你是刚接触Linux的小白还是准备尝试Docker容器化的开发者这篇文章都按“初体验”的视角来讲没有多少高深理论全是能直接落到命令行里的实操内容。我自己最早学Linux的时候被那一堆命令整得头皮发麻。今天装个软件要apt明天写个服务要systemctl后天改个权限又要chmod整个人是懵的。后来接触到Docker突然发现很多服务其实不用在Linux里从零折腾拉个镜像、起个容器就完事。那一刻才真正理解了一个道理Linux是地基Docker是建造在地基上的集装箱房。地基你得会用但不用自己一砖一瓦造楼。这篇笔记就是先把地基怎么踩实讲清楚再把集装箱怎么搬、怎么用讲明白。内容覆盖Linux系统安装、高频命令、Python和JDK安装再到Windows和Linux环境下安装Docker、Docker Desktop的经典坑以及用Docker部署MySQL 8.0、Redis主从、GitLab的实操记录。最后附上我遇到过的常见问题和排查思路争取让看完的你能少走几趟弯路。1. 为什么建议把Linux和Docker放在一起学1.1 两个工具的定位Linux是系统Docker是平台很多人一上来就问“Linux和Docker我该先学哪个”我的建议是不要分开学而要一起学。原因很简单Docker本身是跑在Linux内核之上的容器引擎它的底层依赖namespace、cgroup这些Linux内核特性。你在Linux上玩Docker很多概念是一通百通的而在Windows或macOS上装Docker Desktop底层其实还是通过虚拟机跑一个轻量Linux环境。我踩过最直观的坑是在Windows上装了Docker Desktop看到界面上有个容器列表觉得Docker不过如此。结果一深入了解发现端口映射、数据卷、网络模式这些概念全都要回到Linux的网络和文件系统上去理解。后来换了思路先老老实实用虚拟机装一个CentOS或Ubuntu再把Docker装上去很多问题瞬间就通了。这就是“Linux是地基Docker是盖在地基上的房子”这个类比的意义——你绕不开地基。1.2 初学者的最佳组合路径我自己总结出来的学习路径比较适合零基础的人一共四步第一步装一个能用的Linux环境不纠结发行版。新手不要一上来就折腾Arch、Gentoo选Ubuntu或者CentOS、Rocky Linux都行。关键是稳定、资料多、装软件方便。我当年用虚拟机装的是Ubuntu Server版没有图形界面全程SSH连上去操作这逼着我从第一天就开始用命令行收获非常大。第二步每天用Linux做日常工作而不是死记命令。比如用find找文件、用grep过滤日志、用systemctl管理服务这些命令不是背出来的是“用”出来的。你只要真的在一台Linux机器上完成过“安装JDK并配置环境变量”“写个Python脚本并定时执行”自然就记住了。第三步在Linux里装Docker。先不用管Docker Desktop那些花哨的图形界面直接在命令行里敲docker run、docker ps、docker logs把镜像、容器、仓库这三个概念用熟。第四步找几个经典项目练手把Linux和Docker串起来。比如部署一个MySQL再用Redis做缓存最后塞一个GitLab进来。整个过程你会发现Linux命令是“服务跑起来之后要用的”Docker命令是“服务是怎么跑起来的”。两条线交叉着学效率翻倍。我的体会是任何教程都不如你亲手在一台服务器上从一个空系统搭出一套服务来。这种成就感很刺激而且伴随着踩坑记忆知识会扎根得更牢。2. Linux起步选型、安装与高频命令2.1 虚拟机装Linux具体怎么选版本新手学Linux我不推荐直接拿物理机装双系统也不建议一开始就买云服务器。最稳妥的方式是在自己电脑上用虚拟机软件装一台Linux虚拟机。VMware Workstation和VirtualBox我都用过个人觉得VMware对新手的友好度更高但VirtualBox免费开源、没那么多授权问题。你要是只是想体验一把VirtualBox完全够用。镜像文件这块我推荐下载Ubuntu 22.04 LTS的Server版镜像。为什么选Server版因为它默认不装图形界面逼你用命令行。LTS是长期支持版本遇到问题搜到的资料最多。虚拟机配置方面内存给2GB起步、磁盘给20GBCPU给2核跑基础服务是绰绰有余的。装的时候有一个细节容易被忽略引导方式选择UEFI还是BIOS。现在新版本的Ubuntu都默认UEFIVirtualBox创建虚拟机时可以把“启用EFI”选项打开不打开也能跑但将来你如果想在上面装Docker等容器服务UEFI兼容性更好一些。2.2 高频Linux命令清单新手先掌握这些就够网上流传的“Linux常用命令大全”动辄几百条着实吓人。实际上对一个初学Docker的人来说高频命令就那么二三十条。我把它们按场景分好了你在终端里逐个敲一遍比看十篇命令大全都有效。文件与目录操作是每天都会用到的ls查看目录内容cd切换目录pwd查看当前路径mkdir创建目录cp复制mv移动或重命名rm删除。这里要特别提醒一下rm -rf真的会删得干干净净尤其是后面跟了路径变量的时候一个空格没写对删库跑路不是玩笑。我见过有人写rm -rf / var/log这种命令幸好发现得早不然系统直接报废。系统与进程管理是另一个高频场景ps -ef查看进程top或htop看系统负载systemctl start/stop/status管理服务df -h看磁盘空间free -h看内存使用kill结束进程。用Docker之后你会发现Docker容器里的日志查看、进程管理跟Linux原生命令完全是同一套心智模型。我自己习惯把这些命令做成一个速查文档需要的时候直接瞄一眼。2.3 在Linux上安装Python和JDK的实操记录在Linux上装Python和JDK是绕不开的活。先说PythonUbuntu系统自带Python 3但版本往往不是最新的而且系统自带的Python不能随便动否则可能影响系统的包管理工具。正确做法是用apt安装独立的Python环境或者用编译源码的方式装到/usr/local目录下。这里我踩过一个坑直接用apt install python3装完pip装包时老提示“Externally Managed Environment”后来发现新版Ubuntu对系统Python做了严格保护要用venv虚拟环境才行。JDK的安装相对简单但要注意区分OpenJDK和Oracle JDK。我自己用的是OpenJDK 17命令如下sudo apt update sudo apt install openjdk-17-jdk -y java -version如果项目对JDK有特殊要求比如要装jdk8可以在安装后手动配置JAVA_HOME环境变量。编辑/etc/profile或~/.bashrc加入一行export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64然后source ~/.bashrc。这个操作虽然基础但新手经常卡在环境变量不生效上我建议每次改完配置都执行echo $JAVA_HOME确认一下。2.4 Linux踩坑记录解压乱码和DNS配置Linux下解压Windows传过来的zip文件经常中文文件名会乱码。原因很简单Windows默认用GBK编码压缩文件名而Linux默认用UTF-8解码。我试过直接unzip文件名确实一片乱码。后来找到两个方法一个是装unzip时指定编码另一个是改用7zsudo apt install unzip p7zip-full unzip -O gbk 中文文件.zip另外还有个高频坑是DNS配置。有次我改了/etc/resolv.conf里的DNS重启网络后发现又被系统重置了。这是因为新版系统用systemd-resolved管理DNS直接改/etc/resolv.conf是无效的。正确做法有两种一种是用nmcli改NetworkManager的配置另一种是编辑/etc/systemd/resolved.conf里的DNS字段然后systemctl restart systemd-resolved。这个问题在Docker环境里也容易遇到容器里解析不了域名时先想想宿主机的DNS是不是有问题。3. Docker基础与安装实战3.1 镜像、容器、仓库我用三个生活场景讲明白Docker有三个基础概念镜像、容器、仓库。很多教程从技术角度解释看得人犯困。我更喜欢这样类比镜像就像一个光盘里的游戏安装包容器就是你装好并打开的游戏进程仓库则是存放各种安装包的网上商店。具体来说镜像是一个只读的模板它包含了运行某个应用所需的一切代码、运行时、系统工具、库文件、配置。容器是镜像的运行实例你可以启动、停止、删除容器也可以在容器里写临时数据。仓库则是集中存放镜像的地方像Docker Hub就是最大的公共镜像仓库。每次docker pull mysql:8.0就是从这个仓库里把MySQL的镜像拉到本地。这三个概念对应三条命令新手务必先打熟docker search去仓库找镜像docker pull拉镜像docker run用镜像起容器。理解好这三个概念的层次关系后面所有操作都会顺理成章。3.2 Windows上安装Docker Desktop从启动失败到跑通的完整过程Docker Desktop的安装在Windows上算是新手遇到的第一道坎。我当时的报错是“Docker Desktop failed to start because virtualisation support wasn’t detected”在网上搜到一堆英文回答试了好几种方法才通。整个过程我复盘下来其实核心就三个前置条件。第一步开启Windows的虚拟化功能。打开任务管理器看“性能”标签页CPU下方会显示“虚拟化已启用”还是“已禁用”。如果是禁用状态需要进BIOS/UEFI把Intel VT-x或AMD-V打开。不同主板设置位置不一样但一般在Advanced、CPU Configuration或者Security菜单里。这个操作做完重启电脑再看。第二步启用Windows功能里的虚拟机平台和WSL 2。在“控制面板-程序-启用或关闭Windows功能”中勾选“虚拟机平台”和“适用于Linux的Windows子系统”。这一步必须在管理员权限下操作。完成后重启再打开终端执行wsl --set-default-version 2把WSL默认版本设为2。第三步安装并配置WSL 2内核。到微软官网下载最新版本的WSL 2内核更新包并安装然后打开Powershell执行wsl --status如果显示内核版本正常就可以重新启动Docker Desktop了。这三个步骤顺序不能乱。我当时的错误在于直接装Docker Desktop忽略了Windows虚拟化功能没有开启。另外很多教程让用户安装Docker Desktop时勾选“Use WSL 2 instead of Hyper-V”这个选项在新版本里已经是默认推荐一般不用手动改。装好之后在设置里把“General”下的“Start Docker Desktop when you log in”打开以后开机就能直接用。3.3 Ubuntu上安装Docker Engine一条龙命令参考如果你听进去了前面建议在虚拟机或服务器上用的是纯Linux环境那么直接安装Docker Engine比用Docker Desktop更干净。以Ubuntu 22.04为例当前官方推荐的安装方式是从Docker的APT源安装而不是用系统自带的docker包那个老版本坑很多。整套流程我整理如下sudo apt update sudo apt install ca-certificates curl gnupg lsb-release -y 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 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-compose-plugin -y安装完成后先别急着用docker run先用systemctl status docker确认服务在线再用sudo docker run hello-world验证整个链路是否通畅。如果你不想每次敲docker都加sudo把当前用户加到docker用户组里然后重新登录sudo usermod -aG docker $USER这一步做完新手最容易犯的错误就是忘了重新登录结果执行docker ps还是报权限错误。别问我怎么知道的。3.4 Docker Desktop和Docker Engine到底选哪个这个问题很多新手都会纠结我简单说下结论如果你主力是Windows或macOS日常开发想用容器跑中间件MySQL、Redis、Nginx图省事就装Docker Desktop如果你手上有Linux服务器或者想锻炼真正的运维能力直接用Docker Engine如果你在Windows上做深入开发又想要Linux环境Docker Desktop配合WSL 2的组合效率最高因为容器直接跑在WSL 2的轻量虚拟机里性能损耗比旧版Hyper-V方案小很多。有一点要提前说清楚Docker Desktop对个人和小型企业免费但大型企业使用需要订阅这一块网络上有争议但对我们学习者来说不构成障碍。真要练生产级技能还是LinuxDocker Engine最纯粹。4. Docker经典项目实操MySQL、Redis、GitLab4.1 用Docker安装MySQL 8.0并使用看这一篇就够MySQL的Docker部署是很多人的第一个实战项目。网上教程满天飞但不少是老版本的照着敲完在8.0上直接报错。我把自己验证过的一套流程写出来。第一步拉镜像docker pull mysql:8.0第二步创建数据目录并启动容器。为什么先建目录因为容器是可销毁的如果MySQL数据写在容器内部容器一删数据就全丢了。正确做法是把宿主机的目录挂载到容器里mkdir -p /data/mysql/conf /data/mysql/data /data/mysql/logs docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDRoot123456 \ -v /data/mysql/data:/var/lib/mysql \ -v /data/mysql/conf:/etc/mysql/conf.d \ -v /data/mysql/logs:/var/log/mysql \ --restartalways \ mysql:8.0这里几个参数必须理解-d是后台运行--name是给容器起名-p 3306:3306是把宿主机的3306端口映射到容器的3306端口-e是设置环境变量--restartalways是让容器在退出或服务器重启后自动拉起。新手经常忘加--restartalways结果服务器重启后MySQL没跟着起来排查半天。第三步验证连接docker ps docker exec -it mysql8 mysql -uroot -p进入MySQL后如果发现用root无法远程连接需要手动创建一个远程用户并授权。MySQL 8.0的授权语句和5.7不太一样直接用老语法会报语法错误。正确写法是CREATE USER root% IDENTIFIED BY Root123456; GRANT ALL PRIVILEGES ON *.* TO root% WITH GRANT OPTION; FLUSH PRIVILEGES;还有个小细节MySQL 8.0默认的认证插件是caching_sha2_password如果你的客户端比较老比如一些老版本的Navicat可能会连接报错。如果在测试环境可以把认证方式改成mysql_native_password具体语句是ALTER USER root% IDENTIFIED WITH mysql_native_password BY Root123456;这个坑非常典型遇到“Client does not support authentication protocol requested by server”就是这儿的问题。4.2 用Docker搭建Redis主从命令和配置一次到位Redis主从是缓存方案里的基本功用Docker搭更是简单到让人怀疑是不是漏了步骤。我用的镜像版本是redis:7.0先创建自定义网络docker network create redis-net然后启动主节点docker run -d \ --name redis-master \ -p 6379:6379 \ --network redis-net \ -v /data/redis/master:/data \ redis:7.0 \ redis-server --appendonly yes这里把redis.conf简化为启动参数主节点开启AOF持久化数据写到容器内的/data目录再映射到宿主机的/data/redis/master。从节点启动时加一个--replicaof参数指定主节点地址。在同一个自定义网络里容器名可以直接当主机名用docker run -d \ --name redis-slave \ -p 6380:6379 \ --network redis-net \ -v /data/redis/slave:/data \ redis:7.0 \ redis-server --appendonly yes --replicaof redis-master 6379验证主从是否生效进入从节点容器执行redis-cli info replicationdocker exec -it redis-slave redis-cli -p 6379 info replication输出里role:slave、master_link_status:up就说明连接成功。我遇到过一种情况是主从都在跑但master_link_status一直显示down排查下来发现是防火墙没放行6379端口。在Docker里这个问题不那么明显因为容器网络是隔离的但如果你在宿主机开了防火墙还是会在端口映射那层把流量拦掉。4.3 用Docker部署GitLab内存和端口的那些坑GitLab是典型的重量级选手官方推荐至少4GB内存。如果你用2GB内存的虚拟机跑启动后大概率会卡成PPT。部署命令我放在下面但先提醒三件事内存不够别硬上启动等待时间很长看日志要耐心第一次访问会让你设置root密码千万别关掉页面就找不到了。sudo mkdir -p /data/gitlab/config /data/gitlab/logs /data/gitlab/data sudo docker run -d \ --name gitlab \ -p 9443:443 -p 9080:80 -p 9022:22 \ --restartalways \ -v /data/gitlab/config:/etc/gitlab \ -v /data/gitlab/logs:/var/log/gitlab \ -v /data/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest这里端口为什么要映射成9080:80因为宿主机上的80端口很可能会被其他Web服务占用直接用9080避免冲突。启动完成后第一次访问http://服务器IP:9080等它初始化几分钟浏览器刷一下才会出现登录页。GitLab的初始root密码存放在/etc/gitlab/initial_root_password文件里有效期24小时。查看方式sudo docker exec -it gitlab cat /etc/gitlab/initial_root_password整个部署过程最让人崩溃的就是“明明镜像拉完了容器也起来了但页面一直打不开”。原因是GitLab内部要做很多初始化动作比如数据库迁移、编译静态资源跑完可能需要十几分钟。这种情况下用sudo docker logs -f gitlab看日志比瞎等更高效。4.4 Docker常用命令速查建议存下来命令不在多在于常用。我整理了一个简约版速查表覆盖日常90%的操作场景。场景命令说明拉取镜像docker pull 镜像名:标签标签不写默认latest查看镜像docker images列出本地镜像启动容器docker run -d --name xxx -p 3306:3306 镜像名-d后台运行-p端口映射查看容器docker ps -a-a包含已停止的容器进入容器docker exec -it 容器名 /bin/bash退出用exit不会停止容器查看日志docker logs -f 容器名-f跟踪输出停止容器docker stop 容器名发送停止信号删除容器docker rm 容器名先停止才能删可用-f强制删除镜像docker rmi 镜像名有容器引用时删不掉查看网络docker network ls容器间通信常用清理资源docker system prune小心使用会删停止的容器和悬空镜像这些命令配合前面几个实战项目反复敲几遍基本就进入肌肉记忆了。对比一下Linux命令和Docker命令你会发现思路很像一个管理进程一个管理容器。5. 容器化的下一步Compose、镜像打包与应用部署5.1 用docker-compose编排多容器一条命令拉起整套环境到了这个阶段你已经能用Docker单容器跑服务了但真实项目往往需要多个容器协作前端Nginx、后端Java应用、数据库MySQL、缓存Redis要是一个个docker run启动顺序和参数管理都是灾难。这时候docker-compose就派上用场了。Compose的核心是写一个docker-compose.yml文件把要启动的服务、镜像、端口映射、数据卷、网络全部声明式地写进去然后一条docker compose up -d全部启动。我以同时启动MySQL和Redis为例version: 3.8 services: mysql: image: mysql:8.0 container_name: compose-mysql restart: always environment: MYSQL_ROOT_PASSWORD: Root123456 ports: - 3306:3306 volumes: - /data/compose/mysql:/var/lib/mysql redis: image: redis:7.0 container_name: compose-redis restart: always ports: - 6379:6379 volumes: - /data/compose/redis:/data command: redis-server --appendonly yes在存放这个文件的目录里执行docker compose up -d docker compose ps docker compose logs -f如果哪天想全部停掉并删除docker compose down。这个利器最大的好处是“环境即代码”换一台服务器把docker-compose.yml和挂载目录复制过去一条命令环境就起来了不用再手动敲几十条命令。5.2 IDEA打包Docker镜像Java开发者的实用姿势后端开发用Java的话把Spring Boot应用打成Docker镜像是个必备技能。这里分享一种在IDEA里直接打包的方式而不需要额外装插件就能实现。第一步在项目根目录创建DockerfileFROM openjdk:17-jdk-slim WORKDIR /app COPY target/*.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar]第二步在IDEA的Run/Debug Configurations里新增Docker配置或者在项目里通过Maven插件构建mvn clean package docker build -t myapp:1.0 . docker run -d -p 8080:8080 --name myapp myapp:1.0这里有一个经验大多数人第一次打包都会在COPY target/*.jar app.jar这一步失败报找不到文件。原因是还没有先执行mvn packagetarget目录下根本没有jar包。所以Docker打包的前提一定是先构建出可运行的jar包。如果项目依赖了MySQL或Redis启动容器的时候还要注意网络配置。最简单的方式是让应用容器加入已有的Docker网络比如docker run --network redis-net就能用容器名连接Redis。这也解释了为什么前面特意创建了自定义网络——容器间通信不能靠localhost。5.3 用青龙面板部署定时任务顺便聊聊依赖管理青龙面板是很多人用来跑定时任务的工具其实它相当于一个调度中心能管理脚本、设置定时规则、查看日志。部署本身非常简单一条命令拉起来docker run -d \ --name qinglong \ -p 5700:5700 \ -v /data/qinglong/config:/ql/config \ -v /data/qinglong/log:/ql/log \ -v /data/qinglong/data:/ql/data \ --restartalways \ whyour/qinglong:latest但真正让人头疼的是依赖管理。面板里的脚本很多依赖Python或Node.js的第三方库如果不在系统里装好脚本跑起来就报ModuleNotFoundError。青龙面板的依赖管理界面虽然可以一键安装但很可能会装失败或装错环境。我的经验是先在面板的“依赖管理”里选好语言环境Python3、Node.js、Linux再逐个装脚本需要的包不要图省事一键全装。脚本跑挂了优先看日志里的报错缺什么就手动装什么比盲目装几十个包更有针对性。6. 常见问题与排查技巧实录6.1 Docker Desktop启动失败最典型的两个原因及解法Docker Desktop在Windows上启动失败十个案例里有九个出在虚拟化和WSL 2上。一个典型的报错是开篇提到的“virtualization support wasn’t detected”另一个是“WSL 2 installation is incomplete”。第一个报错的排查路径在上面已经详细写过核心是三步确认BIOS中虚拟化已开启确认Windows功能里的“虚拟机平台”和“适用于Linux的Windows子系统”已勾选确认WSL 2内核已更新。我遇到过一种特殊情况BIOS里虚拟化开着Windows功能也勾了但Docker Desktop依然报这个错。后来发现是电脑开了Windows Sandbox或Credential Guard这两个功能跟Hyper-V抢虚拟化资源关掉就好了。第二个报错多半是WSL 2内核还没更新。执行wsl --update然后wsl --set-default-version 2再重启Docker Desktop。如果家里网络不好导致内核下载失败可以到微软官网手动下载内核安装包装上之后再执行wsl --status确认。6.2 WSL里删了文件但磁盘空间没释放怎么办这个问题的现象是在WSL里删了几个G的文件Windows上的ext4.vhdx文件却一点没变小。原因是WSL 2把整个Linux文件系统放在一个动态扩展的虚拟磁盘镜像里删除文件只是把块标记为可用并不会自动缩小磁盘镜像。解决办法是手动压缩。首先在Windows的Powershell里执行wsl --shutdown然后找到发行版对应的ext4.vhdx文件默认路径在%LOCALAPPDATA%\Packages\下发行版不同路径略有差异。用管理员身份打开Powershell执行DiskPart命令diskpart select vdisk fileC:\Users\你的用户名\AppData\Local\Packages\...\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exit执行完再看文件大小空间就收回来了。这一步不是必须的但如果你经常在WSL里做大数据量操作磁盘镜像膨胀到几十个G压缩一下能省出不少磁盘空间。6.3 容器起不来、服务连不上先按这个顺序排查我遇到新手排查容器问题时往往一上来就纠结代码或配置其实大多数问题出在更基础的层面。建议按下面的顺序来第一步看容器状态。docker ps -a如果容器是Exited状态用docker logs 容器名看最后一屏日志里面往往直接写了异常原因。比如端口被占用、权限不足、配置文件格式错误都会在这里暴露。第二步看端口映射。宿主机上执行ss -lntp或netstat -lntp确认端口是否真的在监听。如果容器起了但端口没监听多半是容器内进程启动失败或者映射写错了。第三步看网络连通。在宿主机上ping容器IP在容器里ping宿主机IP逐段排查是网络隔离问题还是防火墙问题。尤其用云服务器时安全组规则可能没放行端口这时候宿主机端口监听正常但外部就是连不上。第四步看资源限制。df -h看宿主机磁盘是否满了free -h看内存是否耗尽。容器写日志把磁盘撑爆的场景非常常见这时候容器会报“no space left on device”清理日志后重启容器即可。6.4 容器数据持久化最容易被忽视的一个细节很多入门教程为了演示方便直接docker run跑容器也不挂载数据卷。等到容器删了才发现数据全没了这才明白持久化的重要性。我的习惯是凡是有状态的服务数据库、缓存、对象存储启动时必挂数据卷凡是无状态的组件Nginx、应用服务可以不挂但日志目录最好也挂出来方便排查。数据卷有三种用法优先级最高的是命名卷和绑定挂载。命名卷用-v 卷名:/容器目录适合不想关心宿主机路径的场景绑定挂载用-v /宿主机绝对路径:/容器目录适合需要直接操作配置文件、查看日志的场景。我偏向绑定挂载因为我能直接ls查看到底写入什么内容对排查很有帮助。还有一个小坑如果挂载目录是新建的空目录镜像里原有的文件会被覆盖为空的。比如MySQL镜像在/var/lib/mysql里有一些初始化文件你在宿主机挂了个空目录上去MySQL启动时可能无法完成初始化。解决办法是让Docker先用自己的默认路径初始化完成再改挂载或者用--mount给数据卷指定subpath方式处理。最后分享一点我的个人体会这一路学下来我最深的体会是不要试图把所有命令都背下来而是要理解命令背后的设计逻辑。Linux的做法是“一切皆文件”配置文件是文件、设备是文件、进程信息也是文件Docker的做法是“把应用连同环境一起打包”镜像就是文件系统的快照容器就是快照的运行状态。这两套思想一旦打通你面对新工具、新命令时完全可以举一反三。如果你也刚开始接触Linux和Docker我的建议很简单找一台Linux虚拟机装好Docker然后认真部署一遍MySQL、Redis和GitLab期间遇到的所有报错都记录下来。这个过程走完你收获的绝对不止是几个命令而是一整套“排查问题、验证结果、复盘改进”的做事方式。这也是我觉得初体验阶段最值得投入时间和耐心的原因。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Flink安装与配置实战:从单机到集群部署详解 2026/9/15 4:50:36

Flink安装与配置实战:从单机到集群部署详解

1. Flink核心定位与安装价值解析作为分布式流处理框架的标杆,Apache Flink在实时计算领域占据着不可替代的位置。我亲历过从Storm到Spark Streaming再到Flink的技术演进,Flink之所以能成为行业标准,关键在于其独特的架构设计:基于…

阅读更多 →
基于Python+Vue的培训机构管理系统:排课与课消实战解析 2026/9/15 4:50:36

基于Python+Vue的培训机构管理系统:排课与课消实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
等保2.0防火墙选型与配置全解析:华为、深信服、H3C、锐捷对比与避坑指南 2026/9/15 4:50:36

等保2.0防火墙选型与配置全解析:华为、深信服、H3C、锐捷对比与避坑指南

做安全或者做运维的朋友这两年应该都有同感:只要牵扯到合规,防火墙永远是排在最前面的采购项目。特别是等保2.0落地之后,“防火墙到底该怎么选、怎么配”这个原本偏采购的话题,已经变成了直接决定测评能不能过的技术问题。我过去几…

阅读更多 →
Java Swing黄金矿工游戏开发实战:从主循环到碰撞检测 2026/9/15 4:50:36

Java Swing黄金矿工游戏开发实战:从主循环到碰撞检测

简介:基于 Java 8 与 Idea 2021 开发环境整理的黄金矿工游戏源码包,面向 Java 初学者、对 Swing 桌面应用开发感兴趣的人员,以及需要完成毕业设计的在校大学生。资源定位在通过一个完整可运行的游戏项目,帮助读者掌握 Swing 组件、…

阅读更多 →
Tomcat底层探究:从启动脚本到Servlet容器完整链路 2026/9/15 4:50:35

Tomcat底层探究:从启动脚本到Servlet容器完整链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
微信小游戏开发实战:一人工作室的高效工作流 2026/9/15 4:47:35

微信小游戏开发实战:一人工作室的高效工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞