Docker
简介
Docker 是什么?
Docker 本身不是容器,而是容器标准的一种实现及其管理工具。
容器是什么?
容器是一种软件打包的技术。通过对系统资源的控制与隔离,把软件、软件运行时、系统工具、系统库和配置打包到一个镜像中,运行在有有独立命名空间的容器进程内,可以使软件的所有依赖都标准化。所以使用容器技术能方便地将软件打包成标准单元。
原理
Docker 和虚拟机都希望能提供一个虚拟、完整、独立的运行时环境,通过提高虚拟环境的隔离型,以便管理。一般来说,虚拟机的原理是模拟硬件环境,所以需要安装客户端操作系统1,而 Docker 并不需要这层客户端操作系统,所以 Docker 更加轻量,硬件利用率也更高。
虚拟机使用 Hypervisor 实现操作系统级别的模拟,而 Docker 通过操作系统的文件系统、命名空间、控制组实现进程级别的模拟。
命名空间:所有 Linux 的进程都从 init 进程 fork 派生。Linux 容器的一个主要组件是新的命名空间下的一个 init 进程,所以我们有能力去创建一个不影响外界的进程树出来。
控制组:通过控制组,我们能限制进程对 CPU、磁盘、内存的使用。
概念
- 隔离环境:虚拟文件系统;POSIX API;文件的只读和屏蔽;命名空间、环境变量等;
- 生命周期:created、running、pausing、paused、stopped;可以通过 update 动态调整硬件资源使用率
- 数据卷:数据卷由自己的独立的生命周期
- 网络:独立的网络命名空间、共享其他实例的网络命名空间、共享主机的网络命名空间
架构
Docker 引擎实际上由 Dockerd、Containerd、RunC 等组件构成
Dockerd:容器管理 -> 编排管理和集群管理。它接受来自外部的 HTTP 请求并作为 API 调用执行,对内与 Containerd 进行通讯。
Containerd:对镜像、容器的管理提供了一个更进一步的抽象,提供了内容、快照、差异、容器、镜像、任务等更加细粒度的概念。
Container 包含 Containerd-shim,用于正确处理由操作系统发送过来的信号。
RunC:Containerd 提供的容器管理等 API 的执行者是 RunC。
常见指令
ps
:列表,如docker ps
build
:打包镜像,如docker build -t test . -f Dockerfile
run
:运行镜像,如docker run -it test
exec
:执行容器指令,如docker exec -it xxx bash
copy
:复制文件到 Docker 中,如docker cp d://test dockerID:dockerPath
调试流程
- 拉远端镜像:
docker pull registry.gitlab.p-ray.cn/moe:75150
- 启动容器:
docker run -p 8081:7001 -it <imageID> sleep 999m
- 进入并调试:
docker exec -it <instanceName> /bin/bash
-p 8081:7001
,把本机的 8081 端口绑定到 Container 的 7001 端口。
常见问题
关闭 Hyper-V:bcdedit /set hypervisorlaunchtype off
Footnotes
- 虚拟机一般有三种模拟方式,裸机型(硬件 + 虚拟 OS + 虚拟 APP)、托管型(OS + Hypervisor + 虚拟 OS + 虚拟 APP)和操作系统虚拟化(OS + 容器 + 虚拟 APP)。 ↩