docker

Docker 说明文档

一、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
2
3
4
# 查看 Docker 版本 
docker --version
# 获取 Docker 帮助信息
docker help

2.2 镜像相关命令

1
2
3
4
5
6
7
8
# 查看本地镜像
docker images
Docker Hub 拉取镜像
docker pull <镜像名>
删除本地镜像
docker rmi <镜像ID>
构建镜像
docker build -t <镜像名>:<标签> <路径>

2.3 容器相关命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看正在运行的容器
docker ps
查看所有容器(包括已停止的)
docker ps -a
启动容器
docker start <容器ID>
停止容器
docker stop <容器ID>
删除容器
docker rm <容器ID>
执行命令到容器内
docker exec -it <容器ID> /bin/bash
查看容器日志
docker logs <容器ID>

2.4 其他常用命令

1
2
3
4
5
6
# 查看 Docker 系统信息
docker info
查看容器运行时的详细信息
docker inspect <容器ID>
运行一个容器
docker run -it --name <容器名> <镜像名>:<标签>

三、Docker 运行配置

3.1 环境变量传递

在运行 Docker 容器时,可以通过 -e 参数传递环境变量。

1
docker run -e VAR_NAME=value <镜像名>

也可以通过 .env 文件传递环境变量,尤其是在 Docker Compose 中。

3.2 挂载目录

Docker 支持将宿主机的文件系统挂载到容器内部,这样可以使容器访问宿主机的数据。

1
2
3
4
# 挂载宿主机目录到容器内
docker run -v /host/path:/container/path <镜像名>
挂载宿主机的文件到容器
docker run -v /host/path/file.txt:/container/path/file.txt <镜像名>

3.3 数据卷(Volumes)

数据卷是 Docker 提供的持久化数据机制。它与容器生命周期无关,可以将数据保留在容器删除之后。

1
2
3
4
# 创建一个数据卷
docker volume create <卷名>
使用数据卷启动容器
docker run -v <卷名>:/container/path <镜像名>

四、Docker 内存配置

4.1 内存限制

在运行 Docker 容器时,可以限制容器的内存使用量,避免其占用过多宿主机资源。

1
2
docker run -m 512m <镜像名>   # 设置最大内存为 512MB
docker run --memory-swap 1g <镜像名> # 设置容器最大内存 + swap 的使用限制

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
2
3
4
5
6
7
8
9
10
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: example

启动服务:

1
docker-compose up -d

停止服务:

1
docker-compose down

5.3 构建与启动

1
docker-compose up --build # 构建并启动容器

六、如何构建 Docker 镜像及优化

6.1 构建 Docker 镜像

Docker 镜像是通过 Dockerfile 构建的。以下是一个简单的 Dockerfile 示例:

1
2
3
4
5
6
7
8
9
10
11
12
# 使用官方的 Node.js 镜像作为基础镜像
FROM node:14
设置工作目录
WORKDIR /app
拷贝 package.json 和 package-lock.json
COPY package*.json ./
安装依赖
RUN npm install
拷贝项目代码
COPY . .
容器启动命令
CMD ["npm", "start"]

构建镜像:

1
docker build -t my-node-app .

6.2 优化 Docker 镜像

优化 Docker 镜像的目的是减小镜像的体积,提升构建效率。常见的优化方法有:

6.2.1 分层构建

每个 RUN 指令、COPY 指令都会产生一个新的镜像层,因此尽量合并相似的操作。

1
2
3
4
5
# 不推荐
RUN apt-get update
RUN apt-get install -y python
推荐
RUN apt-get update && apt-get install -y python

6.2.2 删除不必要的文件

在构建过程中,可以删除临时文件,减少镜像体积。

1
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

6.2.3 使用多阶段构建

多阶段构建可以避免不必要的文件进入最终镜像,降低镜像大小。

1
2
3
4
5
6
7
8
9
10
11
# 第一阶段: 构建应用
FROM node:14 AS build
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
第二阶段: 创建精简的运行镜像
FROM node:14-slim
WORKDIR /app
COPY --from=build /app/dist /app
CMD ["npm", "start"]

6.3 避免使用不必要的基础镜像

选择体积小的基础镜像。例如,使用 alpine 版本的镜像,它比标准镜像要小得多。

1
FROM node:14-alpine

Docker 是一个强大的容器化工具,通过其镜像、容器、数据卷等功能,我们可以快速、可靠地构建、部署和管理应用程序。通过合理使用 Docker Compose 来自动化容器管理,以及优化 Docker 镜像的构建过程,可以提高开发效率,减少系统资源的占用,确保生产环境的高效和稳定。