Docker笔记
一、底层原理
1. 容器与虚拟机的区别
- 虚拟机(VM):
- 定义:虚拟机是通过虚拟化技术在物理硬件上创建的完整操作系统实例,运行在 Hypervisor 之上。
- 资源开销:每个虚拟机都有自己的操作系统和内核,因此资源消耗大,启动时间较长(几分钟)。
- 隔离性:虚拟机之间完全隔离,各自拥有独立的内核和资源,安全性高。
- 管理:通常需要更多的管理开销,如监控和配置。
- 容器:
- 定义:容器是运行在共享操作系统内核上的轻量级执行环境,通常使用 Linux 命名空间和控制组(cgroups)来实现隔离。
- 资源开销:容器共享主机内核,相比虚拟机启动速度快(通常在几秒内),资源开销小。
- 隔离性:容器之间共享主机内核,但可以使用命名空间进行资源隔离(如进程、网络、文件系统)。
- 管理:容器管理相对简单,易于自动化和编排。
2. Docker 架构
- Docker Daemon:
- 功能:Docker Daemon 是 Docker 的核心组件,负责处理容器的创建、启动、停止和删除等操作。
- API:Docker Daemon 提供了 REST API,Docker Client 通过这些 API 进行通信。
- 后台运行:Docker Daemon 通常在后台运行,监听来自 Docker Client 的请求。
- Docker Client:
- 功能:Docker Client 是用户与 Docker 系统交互的命令行工具,通过命令执行操作。
- 常用命令:
docker run
:创建并启动一个新容器。docker ps
:列出正在运行的容器。docker images
:列出本地镜像。
- Docker Registry:
- 定义:Docker Registry 是一个存储和分发 Docker 镜像的地方。
- 默认:Docker Hub 是 Docker 的默认公共镜像仓库,用户可以从中拉取或推送镜像。
- 私有 Registry:用户也可以搭建自己的私有镜像仓库,以满足安全和网络的需求。
3. 镜像与容器
- 镜像:
- 只读层:镜像由一系列只读层组成,底层是基础镜像,上层是应用及其依赖。
- 构建过程:使用 Dockerfile 构建镜像,通过
docker build
命令创建。 - 存储:镜像在本地存储,每次创建新容器时会从镜像创建出可写层。
- 容器:
- 可写层:容器是在镜像的基础上创建的实例,具有可写层,可以在其中修改文件。
- 运行状态:每个容器都有自己的运行状态,包括进程、网络配置和文件系统。
- 生命周期:容器的生命周期可以通过 Docker 命令控制,包括创建、启动、停止和删除。
4. 分层文件系统
- 分层结构:
- Docker 镜像采用分层文件系统(如 OverlayFS、AUFS)进行管理,每一层只保存相对于上层的改动。
- 这种设计允许多个镜像共享相同的底层层,节省存储空间。
- 合并:
- 当容器启动时,Docker 会将镜像的各个层合并为一个单一的可写文件系统,容器的所有操作都在这个可写层中进行。
5. 网络与存储
- 网络:
- Docker 默认创建一个桥接网络(bridge),允许容器之间通信。
- 用户可以创建自定义网络(如 overlay 网络)以支持跨主机的容器通信。
- 存储:
- 卷(Volumes):Docker 提供的持久化存储解决方案,适用于需要持久化数据的场景。使用
docker volume
命令管理。 - 绑定挂载(Bind Mounts):将主机文件系统中的路径挂载到容器中,适用于需要直接访问主机文件的场景。
- 卷(Volumes):Docker 提供的持久化存储解决方案,适用于需要持久化数据的场景。使用
6. 安全性
- 命名空间:Docker 使用 Linux 命名空间来实现资源的隔离,包括进程(PID)、网络、文件系统等。
- 控制组(cgroups):用于限制和监控容器的资源使用(如 CPU、内存)。
- 用户命名空间:提供额外的安全层,允许容器以非特权用户身份运行。
二、Docker 命令与参数
1. 基本命令
- 查看 Docker 版本
docker --version
- 显示当前安装的 Docker 版本信息。
- 获取 Docker 系统信息
docker info
- 显示有关 Docker 的系统信息,包括已安装的镜像、容器、存储驱动等。
2. 镜像相关命令
- 拉取镜像
docker pull [OPTIONS] <image>
-a, --all-tags
:拉取所有标签的镜像。-q, --quiet
:只输出镜像 ID。
示例:
docker pull ubuntu:latest
- 列出镜像
docker images [OPTIONS]
-a, --all
:显示所有镜像,包括中间层。-q, --quiet
:只显示镜像 ID。
示例:
docker images
- 删除镜像
docker rmi [OPTIONS] <image>
-f, --force
:强制删除。--no-prune
:不删除未使用的父镜像。
示例:
docker rmi ubuntu:latest
- 构建镜像
docker build [OPTIONS] <path>
-t <name>:<tag>
:给镜像打标签。--no-cache
:不使用缓存构建镜像。-f <file>
:指定 Dockerfile 文件。
示例:
docker build -t myapp:1.0 .
- 给镜像打标签
docker tag <source_image> <target_image>
示例:
docker tag myapp:1.0 myapp:latest
3. 容器相关命令
- 运行容器
docker run [OPTIONS] <image>
-d
:后台运行(detached)。-p <host_port>:<container_port>
:端口映射。--name <container_name>
:指定容器名称。-e <key>=<value>
:设置环境变量。-v <host_path>:<container_path>
:挂载卷。
示例:
docker run -d -p 80:80 --name mynginx nginx
- 列出正在运行的容器
docker ps [OPTIONS]
-a, --all
:显示所有容器,包括已停止的。-q, --quiet
:只显示容器 ID。
示例:
docker ps
- 停止容器
docker stop [OPTIONS] <container>
-t <seconds>
:设置停止容器的超时时间(默认 10 秒)。
示例:
docker stop mynginx
- 删除容器
docker rm [OPTIONS] <container>
-f, --force
:强制删除正在运行的容器。-v
:删除挂载的卷。
示例:
docker rm mynginx
- 查看容器日志
docker logs [OPTIONS] <container>
-f
:实时输出日志。--tail <number>
:只显示最新的 行日志。
示例:
docker logs -f mynginx
- 执行命令
docker exec [OPTIONS] <container> <command>
-it
:分配伪终端并保持标准输入打开。
示例:
docker exec -it mynginx /bin/bash
4. 网络相关命令
- 列出网络
docker network ls
- 显示所有 Docker 网络。
- 创建网络
docker network create [OPTIONS] <network_name>
--driver <driver>
:指定网络驱动(如 bridge, overlay)。
示例:
docker network create my_network
- 连接容器到网络
docker network connect <network> <container>
示例:
docker network connect my_network mynginx
- 断开容器与网络的连接
docker network disconnect <network> <container>
5. 卷相关命令
- 创建卷
docker volume create [OPTIONS] <volume_name>
示例:
docker volume create my_volume
- 列出卷
docker volume ls
- 删除卷
docker volume rm <volume_name>
示例:
docker volume rm my_volume
三、Dockerfile 和 Docker Compose 相关命令与示例
一、Dockerfile
Dockerfile 是一个文本文件,包含了创建 Docker 镜像所需的所有命令。以下是 Dockerfile 中常用的指令及其详细描述。
- FROM
dockerfile FROM <image>[:<tag>]
- 功能:指定基础镜像。
- 示例:
- RUN
dockerfile RUN <command>
- 功能:在镜像构建时执行命令。
- 示例:
- COPY
dockerfile COPY <src> <dest>
- 功能:将文件从上下文目录复制到镜像中。
- 示例:
- ADD
dockerfile ADD <src> <dest>
- 功能:与 COPY 类似,但可以自动解压 tar 文件。
- 示例:
- CMD
dockerfile CMD ["executable", "param1", "param2"]
- 功能:容器启动时执行的命令,可以被
docker run
命令的参数覆盖。 - 示例:
- ENTRYPOINT
dockerfile ENTRYPOINT ["executable", "param1", "param2"]
- 功能:指定容器启动时的默认执行命令,通常用于设置主命令。
- 示例:
- ENV
dockerfile ENV <key>=<value>
- 功能:设置环境变量。
- 示例:
- WORKDIR
dockerfile WORKDIR /path/to/workdir
- 功能:设置后续命令的工作目录。
- 示例:
- EXPOSE
dockerfile EXPOSE <port>
- 功能:声明容器在运行时监听的端口。
- 示例:
- VOLUME
dockerfile VOLUME ["/data"]
- 功能:创建一个可挂载的卷,用于持久化数据。
- 示例:
Dockerfile 示例
dockerfile # 基础镜像
FROM python:3.9-slim# 设置工作目录
WORKDIR /app# 文件
COPY requirements.txt ./
RUN pip install -r requirements.txt# 复制应用代码
COPY . .# 声明端口
EXPOSE 5000# 启动命令
CMD ["python", "app.py"]
二、Docker Compose
Docker Compose 是一个工具,用于定义和运行多容器 Docker 应用。使用 YAML 文件来配置应用的服务、网络和卷。
- docker-compose.yml 文件基本结构
yaml version: '3.8' # 版本号
services: # 定义服务app: # 服务名称build: . # 指定 Dockerfile 路径ports:- "5000:5000" # 端口映射environment:- APP_ENV=production # 环境变量volumes:- mydata:/app/data # 挂载卷volumes: # 定义卷mydata: {}
- 常用 Docker Compose 命令
- 启动服务
docker-compose up [OPTIONS]
-d
:在后台运行。--build
:在启动前构建镜像。
示例:
docker-compose up -d
- 停止服务
docker-compose down [OPTIONS]
-v
:同时删除挂载的卷。
示例:
docker-compose down
- 查看服务状态
docker-compose ps
- 重启服务
docker-compose restart [OPTIONS] [SERVICE...]
- 构建镜像
docker-compose build [OPTIONS]
--no-cache
:不使用缓存构建镜像。
示例:
docker-compose build
- 执行命令
docker-compose exec <service> <command>
示例:
docker-compose exec app /bin/bash