Skip to content

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 ls

Docker 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   # 临时查看卷内容

以「技术栈」为核心的个人知识库