Docker 基础
Docker 把应用程序及其依赖打包到轻量、可移植的容器中,核心抽象是镜像(只读模板)与容器(镜像的运行实例)。
核心概念
- 镜像(Image):分层存储的只读文件系统,UnionFS 把多个层叠加。
- 容器(Container):镜像的运行实例,在最上层添加可写层。
- 仓库(Registry):镜像分发中心,Docker Hub 是默认公共仓库。
- 卷(Volume):绕过容器文件系统的持久化存储。
- 网络(Network):容器之间的虚拟网络,默认桥接。
docker run 常用参数
docker run -d --name web -p 8080:80 nginx
docker run -it --rm ubuntu bash
docker run -v /host/path:/data -e ENV=prod app
| 参数 | 作用 |
|---|---|
-d | 后台运行 |
-it | 分配 TTY 并保持 STDIN |
--rm | 容器退出后自动删除 |
-p host:container | 端口映射 |
-v src:dst | 挂载卷或目录 |
-e KEY=VALUE | 设置环境变量 |
--name | 命名容器 |
--network | 指定网络 |
Dockerfile 基础
Dockerfile 按顺序执行各指令,合理安排顺序能充分利用层缓存。
FROM node:20-alpine # 基础镜像
WORKDIR /app
COPY package*.json ./ # 先复制依赖文件
RUN npm ci --omit=dev # 安装依赖(单独一层,易缓存)
COPY . . # 再复制源码
EXPOSE 3000
CMD ["node", "server.js"]
把变化频率低的层(系统依赖)放在前面,变化频率高的层(源码)放在后面,可以最大化缓存命中。
docker-compose
docker-compose.yml 用声明式语法编排多容器应用:
services:
web:
build: .
ports:
- "8080:3000"
depends_on:
- db
volumes:
- ./app:/app
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: secret
volumes:
- dbdata:/var/lib/postgresql/data
volumes:
dbdata:
常用命令:
docker compose up -d
docker compose logs -f web
docker compose down
卷与网络
命名卷由 Docker 管理,适合持久化数据库数据;bind mount 直接挂载主机目录,适合开发期热更新代码。默认桥接网络下容器间可通过容器名互访,使用自定义网络可获得更好的 DNS 解析与隔离。