Docker 入门笔记
三个核心概念
- 镜像(Image):只读模板,像一张刻好的光盘。
- 容器(Container):镜像的运行实例,像一个启动起来的程序。
- 仓库(Registry):存放镜像的地方,默认是 Docker Hub。
常用命令
docker pull nginx # 拉取镜像
docker run -d -p 8080:80 nginx # 后台运行并映射端口
docker ps # 查看运行中的容器
docker ps -a # 查看全部容器
docker logs -f <id> # 跟踪日志
docker exec -it <id> sh # 进入容器
docker stop <id> # 停止
docker rm <id> # 删除容器
docker rmi <image> # 删除镜像
端口映射 -p 宿主机:容器,把容器内的服务暴露给外面。
写一个 Dockerfile
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80
多阶段构建(multi-stage)能显著缩小最终镜像:构建阶段的依赖不会进入运行镜像。
构建与运行:
docker build -t my-site .
docker run -d -p 8080:80 my-site
用 Compose 编排多容器
docker-compose.yml:
services:
web:
build: .
ports:
- "8080:80"
depends_on:
- api
api:
image: node:20-alpine
working_dir: /app
volumes:
- ./api:/app
command: node server.js
docker compose up -d # 启动
docker compose logs -f # 看日志
docker compose down # 停止并清理
体积与清理
镜像会越积越多,定期清理:
docker system prune -a # 清理未使用的资源(谨慎)
docker image prune -f # 清理悬空镜像
心智模型
把容器想成「一次性的进程」:不要在里面存重要数据,需要持久化的目录用 volume 挂载出来。镜像应当是不可变的——配置走环境变量,数据走挂载,这样容器才能随时销毁、随时重建。
容器解决的不是「怎么部署」,而是「让环境本身成为代码」。
单台机器管好了,下一步是集群:[[kubernetes-basics]]。想看真实部署案例,见 [[home-server]]。