Docker文件与本地文件,系统

我问你这样的设置的话以后的作业比如和计算机系统交互那就是和我本机的系统交互对吧? 它只是docker只是提供了一个Linux terminal交互方案那个bash这个语言交互方案, 而不是Windows的语言对吧? 实际上它交互的任何东西都在我自己本机上对不对?

不对! 你的理解有偏差,这是 Docker 的关键概念需要澄清:

重要区别:容器 vs 虚拟机

❌ 错误理解:

"Docker 只是提供一个 Linux terminal,所有操作都在我本机"

✅ 正确理解:

Docker 容器是一个独立的 Linux 系统环境,但可以通过挂载目录访问你的文件。

具体分析:

1. 文件系统隔离性

复制代码
你的 Windows 文件系统              Docker 容器文件系统
C:\Users\你\Documents\...          /home/cit595/
D:\...                             /tmp/
                                   /etc/
                                   /usr/bin/
  • 默认情况:容器看不到 Windows 文件,Windows 也看不到容器文件
  • 只有挂载的目录 :你通过 -v 参数指定的目录是共享的

2. 系统交互对象

python 复制代码
# 在容器中运行 Python:
import os
print(os.system("ls /"))  # 看到的是容器的根目录,不是 Windows 的 C:\
print(os.system("apt-get update"))  # 修改的是容器的软件包,不是 Windows

3. 网络隔离

bash 复制代码
# 在容器中:
ping google.com  # 使用容器的网络栈
python -m http.server 8080  # 监听容器的 8080 端口
# 需要 -p 8080:8080 映射才能在 Windows 浏览器访问

实际场景示例:

场景 1:安装软件

bash 复制代码
# 在容器中:
sudo apt install postgresql  # ✅ 安装在容器里
# 在 Windows:❌ 不会出现 PostgreSQL

场景 2:运行数据库

bash 复制代码
# 在容器中:
sudo service postgresql start  # ✅ 启动容器的数据库
# 数据文件保存在:/var/lib/postgresql(容器内)

场景 3:文件操作

bash 复制代码
# 假设挂载了:-v /c/Users/你/project:/home/project

# 在容器中:
cd /home/project
touch newfile.txt  # ✅ 会出现在 Windows 的 C:\Users\你\project\

cd /home
touch other.txt    # ❌ 只在容器内,Windows 看不到

课程项目的实际情况:

Project 0 的 PostgreSQL:

bash 复制代码
docker run -d --name project0-postgres -p 5432:5432 postgres
  • 数据库在容器内运行
  • 数据保存在容器内
  • 只是通过端口 5432 暴露给 Windows
  • 如果删除容器,数据可能丢失(除非挂载了数据卷)

你的代码开发:

复制代码
Windows 目录(编辑) ←挂载→ 容器目录(运行)
      ↓                        ↓
GitHub Desktop              python app.py
(提交推送)                 (使用容器内的 Python 环境)

总结关键点:

方面 在容器内操作影响 在 Windows 操作影响
文件系统 默认只影响容器,除非挂载目录 只影响 Windows
软件安装 只安装在容器内 只安装在 Windows
进程运行 在容器内运行 在 Windows 运行
网络端口 需要 -p 映射才能从 Windows 访问 可直接访问

简单记忆:

  • Docker 容器 = 一个精简的独立 Linux 电脑
  • -v 挂载 = 一个共享的 U 盘
  • -p 端口映射 = 一根网线连接

所以作业交互的是容器的系统,不是你本机的 Windows 系统,除非你特意挂载了目录或映射了端口。


挂载 is it

docker attach?

不是!完全不同的两个概念! 让我用中文清楚解释:

🆚 docker attach vs 挂载(-v)

1. docker attach - "接入/连接"

bash 复制代码
docker attach 容器名

比喻 :就像 远程桌面连接 到一台已经开着的电脑

  • 只是让你进入容器的控制台
  • 共享文件
  • 连接文件系统
  • 只是让你能输入命令、看到输出

2. 挂载(Mount) - -v 参数

bash 复制代码
docker run -v /c/Windows路径:/容器内路径 ...

比喻 :就像 插上一个U盘,两台电脑都能访问里面的文件

  • 在容器和主机之间 共享文件夹
  • 文件双向同步
  • 容器删除后文件还在(在主机上)

📊 对比表格:

功能 docker attach -v 挂载
作用 进入容器终端 共享文件夹
命令位置 在容器运行时执行 在容器启动时设置
文件共享 ❌ 没有 ✅ 有
持久化 ❌ 没有 ✅ 有
常用场景 调试、查看日志 代码开发、数据保存

🎯 实际例子:

情况 A:只有 attach,没有挂载

bash 复制代码
# 启动容器(没有挂载)
docker run -it --name mycontainer ubuntu bash

# 在另一个终端连接
docker attach mycontainer
# ✅ 可以输入命令
# ❌ 看不到 Windows 的任何文件
# ❌ 在容器创建的文件,Windows 看不到

情况 B:有挂载,可以 attach

bash 复制代码
# 启动容器(有挂载)
docker run -it -v /c/Users/你/project:/project --name mycontainer ubuntu bash

# 进入容器
docker attach mycontainer

cd /project
ls  # ✅ 看到 Windows 的 project 文件夹内容
touch test.txt  # ✅ 文件会出现在 Windows 中

🔧 你的课程项目需要:

两者都要用,但作用不同

步骤 1:启动时挂载目录(共享代码)

bash 复制代码
docker run -it -v /c/Users/Freda/Documents/GitHub/26sp-cit595-fredaxyu:/home/cit595/project cis548/docker-env:latest bash

步骤 2:需要时 attach 连接

如果容器在后台运行:

bash 复制代码
# 查看运行中的容器
docker ps

# 连接到正在运行的容器
docker attach 容器ID

💡 更常见的做法:

课程中你更可能用:

bash 复制代码
# 一次性命令:启动并进入(同时挂载)
docker run -it -v 你的路径:容器路径 镜像名 bash

这个命令同时完成了:

  • ✅ 启动容器
  • ✅ 挂载目录
  • ✅ 进入 bash(类似 attach 的效果)

❓ 怎么判断当前状态?

在容器内运行:

bash 复制代码
# 查看当前目录文件
ls -la

# 如果看到你的项目文件 → 说明挂载成功
# 如果只看到容器默认文件 → 没有挂载

简单记

  • attach = "让我进去看看"
  • -v = "把这个文件夹带着一起"
相关推荐
Leinwin1 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
2401_865382501 小时前
信息化项目运维与运营的区别
运维·运营·信息化项目·政务信息化
漠北的哈士奇1 小时前
VMware Workstation导入ova文件时出现闪退但是没有报错信息
运维·vmware·虚拟机·闪退·ova
如意.7591 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
运维小欣2 小时前
智能体选型实战指南
运维·人工智能
yy55272 小时前
Nginx 性能优化与监控
运维·nginx·性能优化
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ3 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
05大叔4 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
安当加密4 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器
dashizhi20154 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑