Docker基本使用和认识

目录

基本使用

镜像仓库

镜像操作

[Docker 如何实现镜像](#Docker 如何实现镜像)

1) namespace namespace)

2) cgroup cgroup)

3) LXC LXC)

Docker常见的网络类型

bridge网络如何实现


基本使用

镜像仓库

镜像仓库登录

1)docker login

后面不指定IP地址,则默认登录到 docker hub 上

退出

2)docker logout

查找

3)docker search

从镜像仓库中拉去指定镜像。

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

向仓库推送本地镜像

docker push [OPTIONS] NAME[:TAG]

镜像操作

列出本地的镜像。

1)docker images

显示镜像的详细信息

2)docker image inspect

标记本地镜像,将其归入某一个仓库。

3)docker tag 现有镜像 新镜像

删除本地镜像,可以通过镜像ID或者仓库:tag的方式指定要删除的镜像

4)docker rmi

对镜像文件保存成 tar 归档文件,-o 选项指定要输出的文件:

5)docker save

导出 docker save 归档的镜像,使用 -i 指定加载的文件

6)docker load

总结:

Docker 如何实现镜像

1) namespace

namespace 是 Linux 内核用来隔离内核资源的方式。Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。

Linux 提供了多个 API 用来操作 namespace,它们是 clone()、 setns() 和 unshare() 函 数,为了确定隔离的到底是哪项 namespace,在使用这些 API 时,通常需要指定一些 调用参数:

|-----------|---------------|---------------|
| namespace | 系统调用参数 | 对应全局系统资源 |
| UTS | CLONE_NEWUTS | 主机名与域名 |
| IPC | CLONE_NEWIPC | 信号量、消息队列、共享内存 |
| PID | CLONE_NEWPID | 进程ID |
| Network | CLONE_NEWNET | 网络设备、网络栈、端口等 |
| Mount | CLONE_NEWNS | 文件系统挂载点 |
| User | CLONE_NEWUSER | 用户和用户组 |

2) cgroup

cgroups(Control Groups) 是 linux 内核提供的一种机制, 这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到不同组内,一个组内的资源使用使用是有上限的,从而实现了对资源的控制。

本质上来说, cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的

cgroup可以管理的子系统有:

  • blkio:对块设备的 IO 进行限制
  • cpu:限制 CPU 时间片的分配
  • cpuacct:生成 cgroup 中的任务占用 CPU 资源的报告,与 cpu 挂载在同 一目录
  • cpuset:给 cgroup 中的任务分配独立的 CPU(多处理器系统) 和内存节 点
  • devices:限制设备文件的创建,和对设备文件的读写
  • freezer:暂停/恢复 cgroup 中的任务
  • memory:对 cgroup 中的任务的可用内存进行限制,并自动生成资源占用报告。
  • perf_event:允许 perf 观测 cgroup 中的 task
  • net_cls:让 Linux 流量 控制器(tc 指令)可以识别来自特定 cgroup 任务的数据包,并 进行网络限制
  • hugetlb:限制使用的内存页数量
  • pids:限制任务的数量。
  • rdma:限制 RDMA 资源(Remote Direct Memory Access,远程直接数 据存取)

3) LXC

LXC是操作系统层的虚拟化技术,它将应用软件打包成一个软件容器,内含应用软件本身的代码,以及所需要的库和各种依赖项,创造出应用程序的独立沙箱运行环境 。

LXC的各种操作都是通过命令行交互完成的,因此通过批量命令创建实现数据迁移并不容易,其隔离性也没有虚拟机这么强大,还是具有一定的缺陷。后来的docker可以说是LXC的加强

Docker常见的网络类型

  • bridge网络

    ​ bridge 驱动会在 Docker 管理的主机上创建一个 Linux 网桥。默认情况下网桥上的容器可以相互通信。也可以通过 bridge 驱动程序配置,实现对外部容器的访问。当我们需要多个容器在同一个 Docker 主机上通信时,桥接网络是最佳选择

  • host网络

    ​ 移除容器和 Docker 主机之间的网络隔离,并直接使用主机的网络。当网络堆栈不应与 Docker 主机隔离,但是希望容器的其他资源被隔离时,主机网络是最佳选择

缺点:可能占用主机的端口

  • container网络

    ​ 让新创建的容器与已存在的容器共享一个网络,而不是与宿主机共享网络。

  • none网络

    ​ 容器网络完全隔离

  • overlay网络

    ​ 跨主机网络,当我们需要运行在不同Docker 主机上的容器进行通信时,或者当多个应用程序使用集群服务协同工作时,覆盖网络是最佳选择。

bridge网络如何实现

整体

细节介绍:

网络命名空间 (Network Namespace)

网络命名空间是 Linux 提供的一种机制,用于隔离网络资源。每个网络命名空间拥有自己的网络设备、IP 地址、路由表、/proc/net 目录等。这意味着不同的容器可以有各自独立的网络环境。

虚拟以太网设备 (veth pair)

veth pair 是成对出现的虚拟网络设备,两个 veth 设备之间通过虚拟链路连接。当一个 veth 设备收到数据包时,它会将数据包传递给另一个 veth 设备。

  • 当启动一个容器时,会创建一对 veth 设备,例如 veth0 和 veth1。
  • veth0 连接到宿主机的网络命名空间,而 veth1 连接到容器的网络命名空间。

https://github.com/lixd/daily-notes/blob/master/ComputerScience/Linux/veth%E8%AE%BE%E5%A4%87%E5%AF%B9.md

如图 圈圈内的就是 veth pair 生成的虚拟链路连接

网桥 (Bridge)

网桥是一种虚拟网络设备,可以将多个网络设备连接在一起,相当于一个虚拟的交换机。它允许连接到它的所有设备之间进行通信。

  • 在宿主机上创建一个虚拟网桥设备(例如 )。
  • 将 veth 对中的一端(veth0)连接到这个网桥上。

https://github.com/lixd/daily-notes/blob/master/ComputerScience/Linux/bridge%E8%AE%BE%E5%A4%87.md

如图,圈内的就是 网桥

相关推荐
Sunday⅔14 分钟前
ClickHouse-Keeper安装使用
linux·运维·clickhouse
终将老去的穷苦程序员1 小时前
将 WSL(Windows Subsystem for Linux)移动到另一个盘上
linux·运维·windows
布丁椰奶冻1 小时前
【Docker】rancher 管理平台搭建
docker·容器·centos
go&Python2 小时前
centos 7.9 离线环境安装GPU服务环境
linux·运维·centos
Niiiii..2 小时前
Linux 下常用命令
linux·运维·服务器
xuruilll2 小时前
Docker部署前端,动态配置后端地址
运维·docker·容器
赛男丨木子丿小喵2 小时前
服务器raid5坏盘-换盘-修复阵列过程
运维·服务器
腾讯数据架构师2 小时前
最新docker仓库镜像
运维·docker·容器·镜像源
天下·第二2 小时前
使用【docker】简单部署打包构建好的镜像并运行python项目
python·docker·eureka
来自于狂人2 小时前
ansible常用命令
linux·运维·ansible