Docker - 2
约 636 字大约 2 分钟
Docker
分析
Docker 镜像会包含应用运行所需的所有系统依赖
一个应用的 Docker 镜像会包含:
- 应用代码
- 运行环境(如 Node.js、JRE、Python)
- 所有系统依赖库
- 必要的工具(shell、包管理器等)
比如:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production # 安装 npm 依赖(包括原生模块)
COPY . .
CMD ["node", "server.js"]
会存在:
node:18-alpine = Alpine Linux 最小系统 + Node.js 18 + npm
这就是为什么镜像比单纯的应用代码大得多(几十 MB 到几百 MB)
镜像的文件系统
镜像的文件系统实际存储在 Docker 的存储驱动中
但你不应该直接操作这个路径,因为:
- 路径由 Docker 内部管理
- 不同存储驱动位置不同
- 可能随时变化
- 正确访问容器内文件的方式
# 1. 进入容器查看
docker exec -it <container_id> sh
cd /app
# 2. 复制文件出来
docker cp <container_id>:/app/server.js ./server.js
# 3. 挂载卷(开发时用)
docker run -v $(pwd):/app node:18-alpine sh
# 这样宿主机的当前目录就映射到容器的/app
Docker Compose - DockerFile
Docker Compose 并没有运行 Dockerfile,而是直接下载了别人已经“打包好的成品”
可以把 Dockerfile 想象成菜谱,把 Image(镜像) 想象成做好的预制菜(或外卖)
Docker Compose 有两种工作模式:
模式一:直接吃“预制菜”(当前的情况)
在 docker-compose.yml 中,有这样一行代码:
image: ghcr.io/xxx/xxx:latest
因为写了 image:,Docker Compose 会直接去 GitHub 的镜像仓库(ghcr.io)里,把原作者已经提前用 Dockerfile 构建好的最终成品下载到本地,然后直接运行
- 在这个过程中,您的本地完全不需要、也不会去执行任何 Dockerfile
- 那个 Dockerfile 是原作者在他的电脑上执行的,执行完之后他把生成的 Image 传到了网上供大家下载
模式二:自己按“菜谱”做饭(本地构建)
如果想让 Docker Compose 去运行 Dockerfile,您的配置文件不能只写 image:,而是要写 build:,像这样:
services:
grok2api:
build: . # 这行告诉 Compose:去当前目录找 Dockerfile 并执行它
# image: ... (这行通常就不需要了,或者用来给构建好的镜像命名)`
只有看到 build: 指令时,Docker Compose 才会去逐行读取 Dockerfile,在您的本地机器上一步步下载基础环境、安装依赖、拷贝代码,最终生成一个镜像
