docker

docker
WildboarGDocker 说明文档
一、Docker 的基本概念
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖打包成一个标准化的单元(即容器)。Docker 容器可以在任何地方快速地运行,确保了应用程序的跨平台一致性。
1.1 镜像(Image)
镜像是 Docker 容器的蓝图,包含了运行某个应用所需的文件、环境和配置。镜像是只读的,可以从中创建一个或多个容器实例。
1.2 容器(Container)
容器是镜像的运行时实例。容器是轻量级的、可移植的、可自我隔离的应用运行环境。
1.3 仓库(Repository)
仓库是存储镜像的地方。Docker Hub 是最常用的公共镜像仓库。
1.4 Docker 引擎(Docker Engine)
Docker 引擎是运行容器的基础,它包括客户端和服务端。客户端是命令行接口(CLI),与 Docker 服务端进行交互。
二、常用的 Docker 命令
2.1 基础命令
1 | # 查看 Docker 版本 |
2.2 镜像相关命令
1 | # 查看本地镜像 |
2.3 容器相关命令
1 | # 查看正在运行的容器 |
2.4 其他常用命令
1 | # 查看 Docker 系统信息 |
三、Docker 运行配置
3.1 环境变量传递
在运行 Docker 容器时,可以通过 -e 参数传递环境变量。
1 | docker run -e VAR_NAME=value <镜像名> |
也可以通过 .env 文件传递环境变量,尤其是在 Docker Compose 中。
3.2 挂载目录
Docker 支持将宿主机的文件系统挂载到容器内部,这样可以使容器访问宿主机的数据。
1 | # 挂载宿主机目录到容器内 |
3.3 数据卷(Volumes)
数据卷是 Docker 提供的持久化数据机制。它与容器生命周期无关,可以将数据保留在容器删除之后。
1 | # 创建一个数据卷 |
四、Docker 内存配置
4.1 内存限制
在运行 Docker 容器时,可以限制容器的内存使用量,避免其占用过多宿主机资源。
1 | docker run -m 512m <镜像名> # 设置最大内存为 512MB |
4.2 CPU 限制
1 | docker run --cpus="1.5" <镜像名> # 限制容器最多使用 1.5 个 CPU 核心 |
五、Docker Compose
Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过一个 YAML 配置文件 docker-compose.yml,可以定义多个容器服务及其配置,进而一键启动。
5.1 安装 Docker Compose
Docker Compose 安装通常与 Docker 一起进行。
1 | docker-compose --version |
5.2 基本使用
创建一个 docker-compose.yml 文件,示例如下:
1 | version: '3' |
启动服务:
1 | docker-compose up -d |
停止服务:
1 | docker-compose down |
5.3 构建与启动
1 | docker-compose up --build # 构建并启动容器 |
六、如何构建 Docker 镜像及优化
6.1 构建 Docker 镜像
Docker 镜像是通过 Dockerfile 构建的。以下是一个简单的 Dockerfile 示例:
1 | # 使用官方的 Node.js 镜像作为基础镜像 |
构建镜像:
1 | docker build -t my-node-app . |
6.2 优化 Docker 镜像
优化 Docker 镜像的目的是减小镜像的体积,提升构建效率。常见的优化方法有:
6.2.1 分层构建
每个 RUN 指令、COPY 指令都会产生一个新的镜像层,因此尽量合并相似的操作。
1 | # 不推荐 |
6.2.2 删除不必要的文件
在构建过程中,可以删除临时文件,减少镜像体积。
1 | RUN apt-get clean && rm -rf /var/lib/apt/lists/* |
6.2.3 使用多阶段构建
多阶段构建可以避免不必要的文件进入最终镜像,降低镜像大小。
1 | # 第一阶段: 构建应用 |
6.3 避免使用不必要的基础镜像
选择体积小的基础镜像。例如,使用 alpine 版本的镜像,它比标准镜像要小得多。
1 | FROM node:14-alpine |
Docker 是一个强大的容器化工具,通过其镜像、容器、数据卷等功能,我们可以快速、可靠地构建、部署和管理应用程序。通过合理使用 Docker Compose 来自动化容器管理,以及优化 Docker 镜像的构建过程,可以提高开发效率,减少系统资源的占用,确保生产环境的高效和稳定。




