Docker基础
Docker 底层原理
关键技术
命名空间(Namespaces)
Docker 利用 Linux 内核的命名空间技术,为容器提供了一个独立的运行环境。主要包括以下几种命名空间:
- PID 命名空间:为容器提供独立的进程视图。
- Network 命名空间:为容器提供独立的网络栈。
- IPC 命名空间:为容器提供独立的进程间通信。
- Mount 命名空间:为容器提供独立的挂载点视图。
- UTS 命名空间:为容器提供独立的主机和域名。
控制组(cgroups): Docker 使用 Linux 内核的 cgroups 功能,对容器的资源使用进行限制和隔离,如 CPU、内存、磁盘 I/O 等。
联合文件系统(UnionFS): Docker 使用联合文件系统技术,支持为容器构建分层的文件系统。每层文件系统被称为一个 layer,新建容器时,Docker 会利用这些 layer 快速构建一个新的文件系统。
工作原理
Docker 采用了 C/S 架构,包括客户端和服务端。Docker 守护进程 (Daemon)作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。
客户端和服务端既可以运行在一个机器上,也可通过 socket 或者 RESTful API 来进行通信。Docker 守护进程一般在宿主主机后台运行,等待接收来自客户端的消息。Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker 守护进程交互。

Docker 架构
Docker 包括三个基本概念:
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
| 概念 | 说明 |
|---|---|
| Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 |
| Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
| Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。 |
| Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
| Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
与VM虚拟机的不同
1、docker有着比虚拟机更少的抽象层。由亍docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
2、docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。

基本操作
| 命令 | 说明 | 示例 |
|---|---|---|
docker run |
创建并运行一个新容器 | docker run -d -p 80:80 nginx - 以后台模式运行一个 Nginx 容器,并将主机 80 端口映射到容器的 80 端口 |
docker start/stop/restart |
启动、停止、重启一个容器 | docker stop mycontainer - 停止名为 “mycontainer” 的容器 |
docker ps |
列出所有正在运行的容器 | docker ps - 列出所有正在运行的容器 |
docker images |
列出本地所有的 Docker 镜像 | docker images - 列出所有本地的 Docker 镜像 |
docker pull |
从 Docker Registry 拉取一个镜像 | docker pull ubuntu:18.04 - 从 Docker Hub 拉取 Ubuntu 18.04 镜像 |
docker build |
根据 Dockerfile 构建一个新的镜像 | docker build -t myapp . - 使用当前目录下的 Dockerfile 构建一个名为 “myapp” 的镜像 |
docker commit |
基于一个容器创建一个新的镜像 | docker commit -m "Added feature X" mycontainer myusername/myimage:v1 - 基于名为 “mycontainer” 的容器创建一个新的镜像 |
docker push |
将一个镜像上传到 Docker Registry | docker push myusername/myimage:v1 - 将本地的 “myimage:v1” 镜像上传到 Docker Hub |
docker rmi |
删除一个或多个本地镜像 | docker rmi nginx:latest - 删除 “nginx:latest” 镜像 |
docker rm |
删除一个或多个容器 | docker rm mycontainer - 删除名为 “mycontainer” 的容器 |
docker exec |
在一个已经运行的容器内执行命令 | docker exec -it mycontainer bash - 在名为 “mycontainer” 的容器内执行 Bash 命令 |
docker logs |
查看容器的日志输出 | docker logs mycontainer - 查看名为 “mycontainer” 的容器的日志 |
docker network |
管理 Docker 网络 | docker network create mynetwork - 创建一个名为 “mynetwork” 的自定义网络 |
docker volume |
管理 Docker 数据卷 | docker volume create myvolume - 创建一个名为 “myvolume” 的数据卷 |
引用文章:
https://blog.csdn.net/bbj12345678/article/details/113790971
https://juejin.cn/post/7267477662360010767
https://blog.csdn.net/crazymakercircle/article/details/120747767