🐳 Docker 学习笔记(含注释)
📌 一、Docker 是什么?
Docker 是一个开源的容器平台,用于打包、分发、运行和管理应用及其依赖环境。
- 容器是一种轻量级、可移植、自给自足的软件运行环境。
- 它解决了“在我电脑上能跑”的问题。
⚙️ 二、Docker 核心概念
概念 | 说明 |
---|
Image(镜像) | 应用和环境的模板,静态 |
Container(容器) | 镜像的运行实例,动态 |
Dockerfile | 构建镜像的脚本(说明书) |
Volume(卷) | 容器和宿主机之间共享数据 |
Network(网络) | 容器之间通信的方式 |
Docker Hub | 官方镜像仓库 |
🛠️ 三、常用命令速查(含注释)
🔍 镜像操作
1
2
3
| docker pull 镜像名 # 从 Docker Hub 拉取镜像
docker images # 查看本地已有的镜像列表
docker rmi 镜像ID # 删除本地镜像
|
📦 容器操作
1
2
3
4
5
6
7
| docker run -it 镜像名 bash # 启动容器并进入交互模式
docker run -d 镜像名 # 后台运行容器
docker ps # 查看当前运行中的容器
docker ps -a # 查看所有容器(包括已停止的)
docker stop 容器ID # 停止运行中的容器
docker rm 容器ID # 删除已停止的容器
docker exec -it 容器ID bash # 进入正在运行的容器(bash 终端)
|
🧱 四、Dockerfile 语法说明(含注释)
1
2
3
4
5
6
| FROM node:18 # 使用官方 Node.js 18 镜像作为基础
WORKDIR /app # 设置容器内的工作目录为 /app
COPY . . # 将主机当前目录下所有文件复制到容器 /app 目录中
RUN npm install # 在容器中安装项目依赖
EXPOSE 3000 # 告诉 Docker 这个容器会用到 3000 端口
CMD ["npm", "start"] # 容器启动时默认执行的命令
|
🚀 五、构建和运行
1
2
| docker build -t my-app . # 用当前目录下的 Dockerfile 构建镜像,并命名为 my-app
docker run -p 3000:3000 my-app # 启动容器,将本机 3000 端口映射到容器的 3000 端口
|
📂 六、数据卷(Volumes)
1
2
| docker run -v $(pwd):/app -w /app node:18 npm start
# 将当前目录挂载到容器的 /app,并在容器中运行 npm start(适合开发)
|
🌐 七、端口映射
1
2
| docker run -p 本机端口:容器端口 镜像名
# 例如:docker run -p 8080:80 nginx 将本机 8080 映射到容器 80
|
🔁 八、退出容器方法
场景 | 退出方式 |
---|
前台运行容器 | Ctrl + C |
容器交互 bash | exit 或 Ctrl + D |
后台容器 | docker stop 容器ID |
🧭 九、Nginx + Docker 简介
1
2
| FROM nginx:latest # 使用官方 Nginx 镜像
COPY dist/your-app /usr/share/nginx/html # 将打包好的前端项目复制到 nginx 的默认根目录
|
📦 十、docker-compose 简介
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| version: "3.9" # Docker Compose 文件版本
services:
web:
build: . # 使用当前目录的 Dockerfile 构建前端镜像
ports:
- "4200:4200" # 映射端口
api:
image: node:18
volumes:
- ./api:/app # 将本地 api 目录挂载到容器 /app
working_dir: /app
command: npm start
ports:
- "3000:3000"
|
1
| docker-compose up -d # 启动所有服务并后台运行
|
🧠 十一、常见问题排查
问题 | 原因/解决 |
---|
容器端口无法访问 | 没监听 0.0.0.0,需加 --host 0.0.0.0 |
port is already allocated | 端口被占用,需 stop 容器 |
容器退出太快 | CMD 命令没有阻塞 |
容器不实时更新 | 没挂载 volume |
✅ 十二、最佳实践建议
- 使用
.dockerignore
忽略 node_modules、dist 等目录,减少镜像体积 - 精简镜像层,使用
node:alpine
等轻量版本 - 开发用热更新(volume 挂载),生产用构建后镜像
- 用
docker-compose
管多个服务