外观
Docker 学习笔记
Docker 是容器化平台,把应用连同运行环境和依赖打包成镜像,实现"构建一次、处处运行",是保证开发与生产环境一致性的基础工具。
1. 认识Docker
重点要点
核心概念
- 镜像(Image):只读的打包模板,包含代码、运行时、依赖和配置,相当于"安装光盘"。
- 容器(Container):镜像运行出来的实例,相互隔离,可启动、停止、删除。
- 仓库(Registry):存放镜像的地方(如 Docker Hub),用
pull拉取、push推送。 - Dockerfile:用指令描述如何一步步构建镜像的文本文件。
- Compose:用 YAML 一次编排多个容器(前端 + 后端 + 数据库)。
常用命令速查
bash
docker version # 查看版本
docker images # 列出本地镜像
docker pull nginx # 拉取镜像
docker run -d -p 8080:80 --name web nginx # 运行容器:后台运行、端口映射
docker ps # 查看运行中的容器(加 -a 看全部)
docker exec -it web bash # 进入容器交互终端
docker logs web # 查看容器日志
docker stop web && docker rm web # 停止并删除容器
docker rmi nginx # 删除镜像易错点
- 端口映射
-p 宿主机端口:容器端口,左右顺序别写反。 - 容器内数据默认不持久化,删容器即丢数据,需用
-v挂载卷。 rm删容器、rmi删镜像,混用会报错;镜像有容器在使用时无法删除。
2. 尝试用Docker部署项目
重点要点
写 Dockerfile 将项目打成镜像,再 run 或 Compose 启动,"配环境"就变成了"跑命令"。
Dockerfile 示例(Node.js 项目)
dockerfile
FROM node:20-alpine # 基础镜像
WORKDIR /app # 工作目录
COPY package*.json ./ # 先拷依赖清单,充分利用缓存
RUN npm install # 安装依赖
COPY . . # 再拷源码
EXPOSE 3000 # 声明端口
CMD ["npm", "start"] # 启动命令构建与运行
bash
docker build -t my-app . # 构建镜像,. 是构建上下文
docker run -d -p 3000:3000 my-app # 运行容器
docker compose up -d # 多服务一键启动
docker compose down # 停止并移除全部服务Compose 示例(应用 + 数据库)
yaml
services:
app:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: root123易错点
build .的.是构建上下文,别漏;node_modules 等大目录要写进.dockerignore,否则镜像巨大。- 改完代码必须重新
docker build,容器不会自动更新;依赖层靠前可加快增量构建。 - 容器里访问宿主机服务别用
localhost,改用宿主机 IP;容器间通信直接写 Compose 服务名。 - 镜像拉取失败时先检查名称/标签是否正确,私有仓库还需
docker login。
3. 学习数据卷映射容器配置文件
重点要点
什么是数据卷(Volume)
- 容器是临时的:删除容器后,内部写入的数据(数据库文件、上传文件、日志)全部丢失。
- 数据卷把"宿主机目录 ↔ 容器目录"建立映射,实现:① 数据持久化;② 宿主机直接改配置文件,容器内立即生效,无需进容器。
三种挂载方式
- bind mount(绑定挂载):
-v /宿主机绝对路径:/容器路径,直接把宿主机目录/文件映射进去(最常用,改配置/看日志用它)。 - 命名卷(named volume):
-v 卷名:/容器路径,由 Docker 管理存储在宿主机(数据安全、备份方便)。 - tmpfs:仅内存,容器删除即消失(一般不用于持久数据)。
bash
# bind mount:挂载目录 + 只读挂载配置文件
docker run -d -v /opt/nginx/html:/usr/share/nginx/html:ro nginx
docker run -d -v /opt/app/application.yml:/app/application.yml:ro myapp
# 命名卷:数据持久化(mysql 数据目录)
docker volume create mysql-data
docker run -d -v mysql-data:/var/lib/mysql mysql:8
# 查看挂载详情
docker inspect 容器名 | grep -A5 Mounts
docker volume lsDocker Compose 里的 volumes
yaml
services:
app:
image: myapp:1.0
volumes:
- /opt/app/conf:/app/conf:ro # bind mount(绝对路径)
- app-logs:/app/logs # 命名卷
mysql:
image: mysql:8
volumes:
- mysql-data:/var/lib/mysql
- /opt/mysql/conf.d:/etc/mysql/conf.d:ro # 挂载自定义配置
- /opt/mysql/init:/docker-entrypoint-initdb.d # 初始化 SQL 目录
volumes:
app-logs: # 命名卷声明
mysql-data:易错点
- 把空目录挂载到容器有内容的目录,会"盖住"容器原有文件(如挂空目录到
/etc/nginx/conf.d会看不到默认配置)——先拷贝默认配置到宿主机再挂。 - 只读挂载一定要加
:ro,防止容器程序意外改坏配置文件。 - bind mount 路径必须是绝对路径(Linux);Windows 下用
-v D:\data:/app/data注意盘符与正反斜杠。 - 权限问题:容器内进程可能以非 root 运行,对挂载目录无写权限会报错(用
chown/-u调整)。 - 改配置文件后不需重启容器也能生效的只有 bind mount 的场景;改了镜像内文件则要重新 build。
补充命令:
bash
docker volume rm mysql-data # 删除命名卷(先停用容器)
docker run --rm -v 卷名:/data busybox ls /data # 临时查看卷内容