一、先理解两个核心概念
镜像(Image):只读的模板,包含运行环境 + 代码 + 依赖,相当于”安装光盘”。
容器(Container):镜像运行起来的实例,相当于”装好系统的电脑”,可启动、停止、删除。
写代码时:镜像只读,容器可写。容器里的修改不会影响镜像,想保留数据就要用数据卷。
二、最常用的命令
1 | # 拉取镜像 |
三、Dockerfile:把项目变成镜像
以一个 Node.js 项目为例:
1 | # 基础镜像 |
构建并运行:
1 | docker build -t my-app:1.0 . |
分层缓存是性能关键:把”变化少的指令放前面、变化多的放后面”,改代码时 npm install 层直接命中缓存,构建秒级完成。
四、数据卷:容器里数据不丢
容器删除后,里面的数据(数据库、上传文件)会一起消失。用数据卷持久化:
1 | # 具名卷:数据由 Docker 管理 |
修改宿主机目录文件,容器里立即生效,开发时非常方便。
五、docker-compose:一键起整套服务
多个容器(如 Web + MySQL + Redis)用 docker-compose.yml 统一编排:
1 | version: "3.8" |
1 | docker compose up -d # 后台启动整套 |
容器之间用服务名(mysql、redis)互相访问,Docker 内置 DNS 会自动解析。
六、常见坑
- 时区:容器默认 UTC 时间,Dockerfile 里加
ENV TZ=Asia/Shanghai,或用-e TZ=Asia/Shanghai; - 镜像源慢:配置 registry mirror(国内环境用阿里云/腾讯云加速器);
latest标签坑:latest会变,生产环境务必用固定版本号(如node:20.11.0-alpine);- 容器内访问宿主机:macOS 用
host.docker.internal代替localhost; - 日志暴涨:限制日志大小:
--log-opt max-size=10m --log-opt max-file=3。
总结
Docker 的上手路线:跑通 docker run → 学会写 Dockerfile → 用数据卷保数据 → 用 compose 编排多服务。容器化带来的环境一致性,是”在我机器上是好的”这类问题的最优解。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 JCAlways!
评论
