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 = "把这个文件夹带着一起"
相关推荐
liuc03171 天前
docker下安装SearXNG
运维·docker·容器
云飞云共享云桌面1 天前
非标自动化工厂的设计云桌面为什么要选云飞云智能共享云桌面?
大数据·运维·服务器·网络·自动化·负载均衡
oMcLin1 天前
如何在CentOS 8上配置并优化Docker与Kubernetes结合的容器集群,提升微服务部署效率?
docker·kubernetes·centos
翼龙云_cloud1 天前
阿里云渠道商:阿里云自动扩缩容配置教程
运维·服务器·阿里云·云计算
别多香了1 天前
系统批量运维管理器 paramiko
linux·运维·服务器
杨云龙UP1 天前
Linux LVM 在线扩容标准操作流程_20260102
linux·运维·服务器·centos·ux
微凉的衣柜1 天前
Windows Server 使用 Nginx 反向代理实现域名访问内网 Gradio 应用
运维·windows·nginx
warton881 天前
ubuntu24.04 安装mysql8.0.36
linux·运维·mysql
运维有小邓@1 天前
如何实现基于角色的访问控制?
运维·网络