前端Docker学习指南
1. 什么是Docker
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 宣器解决方案。
Docker 将应用程序与其依赖项打包在一个文件中。运行这个文件时,会生成一个虚拟容器,程序在其中运行,就像在真实的物理机上运行一样。有了 Docker,就不用担心环境配置问题。
总的来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,将自己的应用放入容器中。容器还可以进行版本管理、复制、分享和修改,就像管理普通代码一样。
2. Docker的核心优势
使用 Docker 有以下几个主要优势:
- 环境一致性:开发、测试、生产环境保持一致,避免"在我机器上能运行"的问题
- 快速部署:容器启动速度快,可实现秒级部署应用
- 资源利用率高:相比虚拟机,容器更轻量,单机可运行更多容器
- 易于扩展:支持快速水平扩展,适合微服务架构
3. Docker的主要应用场景
- 提供一次性的环境:比如本地测试他人软件、持续集成时提供单元测试和构建环境
- 提供弹性的云服务:Docker 容器可以随开随关,很适合动态扩容和缩容
- 组建微服务架构:通过多个容器,一台机器可以运行多个服务,在本机就能模拟微服务架构
4. Docker的核心概念
理解 Docker 的整个生命周期,需要掌握三个基本概念:镜像、容器和仓库。
4.1 镜像(Image)
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
4.2 容器(Container)
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立命名空间。容器可以被创建、启动、停止、删除和暂停等。镜像与容器之间的关系,可以类比面向对象程序设计中的类和实例。
4.3 仓库(Repository)
镜像构建完成后,可以很容易在当前宿主机上运行。但如果需要在其他服务器上使用这个镜像,就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。一个 Docker Registry 中可以包含多个仓库;每个仓库可以包含多个标签;每个标签对应一个镜像,标签可以理解为镜像的版本号。
5. Docker安装指南
根据您的操作系统选择相应的安装方式:
安装完成后,运行以下命令验证是否安装成功:
docker version
6. 常用Docker命令
6.1 环境信息查看命令
docker info # 查看当前 Docker 运行环境
docker history 镜像名 # 查看镜像历史Layer层级信息
docker stats 容器名 # 查看容器资源占用状态
docker logs 容器名 # 查看容器stdout日志,加上 -f 持续输出
docker cp 容器名:路径 本地路径 # 在容器和本地文件系统中拷贝文件
6.2 镜像管理命令
docker images # 查看本地镜像列表
docker rmi 镜像名 # 删除镜像,-f表示强制删除
docker pull 镜像名 # 从仓库拉取镜像
docker push 镜像名:标签 # 推送镜像到仓库
docker search 镜像名 # 搜索仓库中的镜像
docker image prune -a # 删除所有未被任何容器引用的镜像(即使它们有标签)
docker image prune # 清理本地所有未被使用的镜像 没有标签(tag)且未被任何容器引用的镜像
6.3 容器管理命令
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器(包括已停止的)
docker run 镜像名 # 根据镜像创建并运行容器
docker rm 容器名 # 删除容器,-f表示强制删除
docker exec -it 容器名 bash # 进入容器终端
docker start 容器名 # 启动已停止的容器
docker restart 容器名 # 重启容器
docker stop 容器名 # 停止容器
docker pause 容器名 # 暂停容器
docker unpause 容器名 # 恢复暂停的容器
6.4 认证相关命令
docker login # 登录到镜像仓库
docker logout # 登出镜像仓库
7. Dockerfile语法详解
Dockerfile 是一个文本文件,包含了一系列指令,用于创建 Docker 镜像。
7.1 基础指令
- FROM:指定基础镜像,通常是 Dockerfile 中的第一条指令
- RUN:在镜像中执行命令,每条 RUN 指令会创建一个新的镜像层
- COPY:将文件复制到镜像中,作为新的层
- EXPOSE:声明容器运行时监听的端口
- ENTRYPOINT:指定容器启动时执行的命令
- WORKDIR:设置工作目录
- CMD:指定容器启动时执行的命令(可被 docker run 后面的命令覆盖)
7.2 示例Dockerfile
# 使用官方Node.js 16版本作为基础镜像
FROM node:16
# 设置工作目录
WORKDIR /app
# 复制package.json和package-lock.json(如果存在)
COPY package*.json ./
# 安装项目依赖
RUN npm install
# 复制项目其他文件
COPY . .
# 构建项目
RUN npm run build
# 暴露端口
EXPOSE 3000
# 容器启动时执行的命令
CMD ["npm", "start"]
7.3 构建和运行命令
# 构建镜像
docker build -t my-app:latest .
# 运行容器
docker run -d -p 3000:3000 --name my-app-container my-app:latest
参数说明:
-d:后台运行容器-p 3000:3000:端口映射(主机端口:容器端口)--name:为容器指定名称my-app:latest:使用的镜像名称和标签
8. 最佳实践建议
- 合理使用 .dockerignore 文件:排除不必要的文件,减小镜像体积
- 优化镜像层数:合并相关的 RUN 命令,减少镜像层数
- 选择合适的基础镜像:使用官方镜像或轻量级镜像(如 alpine)
- 及时清理无用镜像和容器:定期运行
docker system prune清理系统 - 使用多阶段构建:减小最终镜像的大小