跳到主要内容

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 解析与隔离。