Docker基础

Docker 底层原理

关键技术

  1. 命名空间(Namespaces)

    Docker 利用 Linux 内核的命名空间技术,为容器提供了一个独立的运行环境。主要包括以下几种命名空间:

    • PID 命名空间:为容器提供独立的进程视图。
    • Network 命名空间:为容器提供独立的网络栈。
    • IPC 命名空间:为容器提供独立的进程间通信。
    • Mount 命名空间:为容器提供独立的挂载点视图。
    • UTS 命名空间:为容器提供独立的主机和域名。
  2. 控制组(cgroups): Docker 使用 Linux 内核的 cgroups 功能,对容器的资源使用进行限制和隔离,如 CPU、内存、磁盘 I/O 等。

  3. 联合文件系统(UnionFS): Docker 使用联合文件系统技术,支持为容器构建分层的文件系统。每层文件系统被称为一个 layer,新建容器时,Docker 会利用这些 layer 快速构建一个新的文件系统。

工作原理

Docker 采用了 C/S 架构,包括客户端和服务端。Docker 守护进程 (Daemon)作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。

客户端和服务端既可以运行在一个机器上,也可通过 socket 或者 RESTful API 来进行通信。Docker 守护进程一般在宿主主机后台运行,等待接收来自客户端的消息。Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker 守护进程交互。

v7N8wg4sy3

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容器只需要几秒钟。

20210211165803163

基本操作

命令 说明 示例
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


Docker基础
http://example.com/2024/04/07/Docker基础/
作者
Sanli Ma
发布于
2024年4月7日
许可协议