Docker 资源管理

1. docker system命令 在谁用光了磁盘?Docker System命令详解中,我们详细介绍了docker system命令,它可以用于管理磁盘空间。 docker system df命令,类似于Linux上的df命令,用于查看Docker的磁盘使用情况: docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 147 36 7.204GB 3.887GB (53%) Containers 37 10 104.8MB 102.6MB (97%) Local Volumes 3 3 1.421GB 0B (0%) Build Cache 0B 0B 可知,Docker镜像占用了7.2GB磁盘,Docker容器占用了104.8MB磁盘,Docker数据卷占用了1.4GB磁盘。 docker system prune命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。docker system prune -a命令清理得更加彻底,可以将没有容器使用Docker镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的Docker镜像都删掉了…所以使用之前一定要想清楚吶。 执行docker system prune -a命令之后,Docker占用的磁盘空间减少了很多: docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 10 10 2.271GB 630.7MB (27%) Containers 10 10 2.211MB 0B (0%) Local Volumes 3 3 1.421GB 0B (0%) Build Cache 0B 0B 2. 手动清理Docker镜像/容器/数据卷 对于旧版的Docker(版本1.13之前),是没有docker system命令的,因此需要进行手动清理。这里给出几个常用的命 删除所有关闭的容器 ...

November 17, 2020

Docker 小架构

实验介绍 拓扑图如下 实现目标 实现开发人员通过推送代码到 gitlab,然后通过与 jenkins 建立的函数钩子,触发构建 docker compose 并提交到 docker harbor 镜像仓库中。最后触发 ansible-playbook 控制宿主机从 docker harbor 中拉取镜像并部署代码上线。 此环境应该应用于测试环境中。 主机规划 主机名 作用 拓扑图对应名称 IP centos7_10 宿主机 host3 192.168.1.10 centos7_11 compose ansible jenkins host2 192.168.1.11 centos7_12 gitlab host1 192.168.1.12 centos7_13 docker-harbor host4 192.168.1.13 centos7_14 开发人员 user 192.168.1.14 实验步骤 编写 dockerfile 并测试对应效果 配置 gitlab 配置 jenkins 配置 docker-harbor 实现结合 准备 DOCKER-COMPOSE 文件 创建目录结构 [root@centos7_10 compose]# tree . ├── docker-compose.yml └── web 编写 lap 架构 编写 dockerfile ...

November 16, 2020

Docker Docker Compose

Docker Compose 简介 运行多容器的 Docker 应用程序的工具。通常用于容器编排,以实现一键搭建 lamp 这样的功能。使用的是 yaml 格式的文本文件。 使用 Compose 的步骤 使用 Dockerfile 定义应用程序的环境 使用 docker-compose.yml 定义构成应用程序的服务 执行 docker-compose up 命令来运行并启动编排内容 使用 Compose 构建和运行应用 启动应用程序 docker-compose up 如果你想在后台执行该服务 docker-compose up -d yml 配置指令 version 指定 yml 依从的 compose 版本 build 指定构建镜像上下文路,也就是指定 dockerfile 文件的路径 version: "3.7" services: webapp: build: ./dir 作为具有在上下文指定的路径的对象,可选的 Dockerfile 和 args version: "3.7" services: webapp: build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1 labels: - "com.example.description=Accounting webapp" - "com.example.department=Finance" - "com.example.label-with-empty-value" target: prod context:上下文路径。 dockerfile:指定构建镜像的 Dockerfile 文件名。 args:添加构建参数,这是只能在构建过程中访问的环境变量。 labels:设置构建镜像的标签。 target:多层构建,可以指定构建哪一层。 cap_add,cap_drop 添加或者删除容器拥有的宿主机的内核功能 ...

November 15, 2020

Docker 私有registry

Docker Registry 分类 Sponsor Registry 第三方的 Registry,提供给客户和 Docker 社区使用 Mirror Registry 第三方的 Registry,只提供给客户使用 Vendor Registry 由发布 Docker 镜像的提供上提供的 Registry Private Registry 通过设有防火墙和额外的安全层的私有实体提供的 registry Registry 的应用 如果公司将服务器托管到了阿里云或者其他拥有 docker 仓库的平台,那么直接使用即可。 如果公司将服务器在本地使用,那么就可以在本地建有一个 registry 来提供存储镜像及其他应用。 Registry 的作用 用来存储镜像,使用 registry 时使用存储卷,将存储卷挂载即可。默认为docker 管理的卷,可以使用自定义的绑定卷进行绑定。 搭建 registry Registry 的安装 centos 自带的版本,使用 info 命令查看出的版本 0.9 版本,安装后版本为 2.6.2 版本。 info 命令查看的是仓库中已有软件包的最低版本。 软件包名为 docker-distribution 但是安装使用 docker-registry 来安装 docker-registry 默认是使用 http 来监听并通信的,但是 docker 客户端默认使用的是 https 协议,所以会出现不兼容。 相关软件包 [root@centos7_10 ~]$ rpm -ql docker-distribution /etc/docker-distribution/registry/config.yml #主配置文件 /usr/bin/registry #二进制执行文件 /usr/lib/systemd/system/docker-distribution.service #启动服务文件 /usr/share/doc/docker-distribution-2.6.2 /usr/share/doc/docker-distribution-2.6.2/AUTHORS /usr/share/doc/docker-distribution-2.6.2/CONTRIBUTING.md /usr/share/doc/docker-distribution-2.6.2/LICENSE /usr/share/doc/docker-distribution-2.6.2/MAINTAINERS /usr/share/doc/docker-distribution-2.6.2/README.md /var/lib/registry #私有仓库中存储的镜像位置 主配置文件详解 /etc/docker-distribution/registry/config.yml version: 0.1 log: fields: service: registry #指定服务名称 storage: cache: layerinfo: inmemory filesystem: rootdirectory: /var/lib/registry #指定镜像存储位置 http: addr: :5000 #指定监听的端口 查看启动服务后监听端口的地址 ...

November 15, 2020

Docker 资源限制

Docker 资源限制的必要性 默认情况下,docker container 在运行时,只要系统分配多少资源,那么这个容器就会使用多少。 控制的维度,只有内存和 CPU,并且内存是非可压缩的,但是 CPU 是可压缩的。 并且资源的限制依赖于 capabilities 这个 capabilities 是在内核中进行资源限制的功能模块。 OOME 一旦发生 OOME,任何进程都有可能被杀死,包括 docker daemon 在内。 为此,Docker 特地调整了 docker daemon 的 OOM 优选级,以免被内核杀死,但是容器的优选级并未被调整。 可压缩与非可压缩资源 内存的资源是非可压缩的,因为内存本身就是一个缓存,所以并不可以压缩,如果内存负载过大,会造成 OOM。 CPU 的资源是可压缩的,并且 CPU 资源也有队列一说,所以当 CPU 负载过大时会导致进程进入阻塞状态,也就是进入等待处理的状态。 限制的范围 可以达到的效果 可以限制内存的使用量 可以限制内存的使用率,就是通过内存的使用率进行划分 通过限制 CPU 的核心数进行限制,限制核心数时,会将资源公平分配。 通过 CPU 绑定限制固定进程的核心数,绑定核心数时会只让单个或指定核心数运行此容器,其他核心数不会使用。(使用此绑定方法时,不要使用 cpu0)因为系统的默认就是 cpu0,如果将容器绑定到 cpu0,那么会导致 CPU 超载。 禁止 OOM 也就是让进程不会因为内存的满载而删除该容器,但是其他容器还是会删除,也可以通过优先级进行限制不让内存删除 可以通过软限制和硬限制进行限制容器的运行,软限制是限制容器的运行占用情况,硬限制会直接限制容器运行占用的资源,容器可以超过软限制,但是不能超过硬限制。 通过内存进行限制 -m ,–memory= 容器可以使用的最大物理内存量,硬限制,此选项最小允许值为 4m (4 MB),此项较常用 –memory-swap * 允许此容器交换到磁盘的内存量,必须先用-m 对内存限制才可以使用 –memory-swappiness 设置容器使用交换分区的倾向性,值越高表示越倾向于使用swap分区,范围为0-100,0为能不用就不用,100为能用就用 –memory-reservation 允许指定小于 –memory 的软限制 ,当 Docker 检测到主机上的争用或内存不足时会激活该限制,如果使– memory-reservation,则必须将其设置为低于 –memory 才能使其优先生效。 因为它是软限制,所以不能保证容器不超过限制 ...

November 15, 2020

Docker Dockerfile

制作镜像的方式 基于容器进行制作 使用 docker commit 命令制作镜像 使用 Dockerfile 制作 编辑 Dockerfile 文件并执行来制作镜像 Dockerfile 简介 只是一个纯文本文件,文本中记录了很多指令。 Dockerfile Format Format # Comment INSTRUCTION arguments 指令本身并不区分大小写,但是规范中使用者必须要使用大写。 Docker 是顺序执行的指令,是自上而下执行的 第一个非注释行必须要为 FROM 指令,FROM 指令用来指定基础镜像。 Dockfiler 文件执行 执行环境 必须定义一个执行目录,且 Dockerfile 文件中定义的文件和安装包都需要在这个工作目录中。 可以在该工作目录的子目录,但是不可以在父目录之上。 Dockeringore 该文件也是一个文本文件,称为排除列表,会排除文件中定义的文件。 作用 例如再 Dockerfile 文件中定义了一个目录,但是目录中的有一些文件不需要复制,所以就要可以使用 dockeringore 来定义一些忽略的文件,包括 dockeringore 文件本身。 Docker build 命令的执行逻辑 与另一种就是启动一个容器制作镜像的动作相同,只不过该命令是隐式执行一个容器,并不是在前台执行。 在后端执行的命令与前台执行无异。 在 Dockerfile 中执行的镜像的命令,是要制作基础镜像的命令,并不是宿主机的命令,所以在 Dockerfile 中定义时,必须要使用基础镜像中有的命令。 Environment replacement 该环境变量并不是定义的宿主机或或者是镜像中的环境变量,而是定义的 Dockerfile 文件中定义的环境变量。 高级变量赋值 ${variable:-word} 如果 variable 变量没有赋值,那么引用时就是引用的变量后的内容。 ${variable:+word} variable 为空那么返回为空,如果 variable 不为空那么返回为 word ...

November 13, 2020

Docker 存储卷

写时复制功能 Docker 镜像是由多个只读层叠加而成,启动容器时,Docker 会加载只读镜像层并在镜像栈顶部调价一个读写层。 如果运行中的容器被修改了数据,那么将会在这一层之上新建一个读写层并覆盖,但是该只读文件依旧存在,只是被新建的制度层覆盖了,并不会删除。 删除情况,对上层用户将不再显示,会在这个文件上添加删除的标志,当 Docker 识别到后将不会显示给用户。 修改情况,会让文件中修改的数据重新生成一个文件并覆盖该文件的被修改的数据。 新建情况,会在新的只读层中新建一个文件并显示给用户。 这些情况被统称为 ”写时复制“ 云计算的概念 通过让每个主机上的 Container 容器挂载宿主机上的目录,但是主机上的目录挂载的是后台存储上的共享目录,从而达到资源共享,然后让容器可以在不同主机之间可以迁移。 形成容器集群且可以来回切换。 查看容器的存储分层 数据目录分层 lowerdir:image 镜像层,即镜像的本身,只读 upperdir:容器的上层,可读写,容器变化的数据存放在此处 mergeddir:容器的文件系统,使用 Union FS(联合文件系统)将 lowerdir 和 upperdir 合并完成后容器使用,最终呈现给用户的统一视图 workdir:容器在宿主机的工作目录,挂载后会被清空,且在使用过程中其内容用户不可见 Volume 卷的概念 容器存在的数据问题 关闭或重启容器,其数据不会受到影响;但是删除 Docker 容器,其更改将会全部丢失。 存储在自己独立的存储空间中,与宿主机共享数据共享不便。 容器之间的共享数据不便。 删除容器后,容器正在运行的数据会丢失。 Volume 卷简介 将宿主机的文件系统挂载到容器中,让容器与宿主机共享存储空间,这样可以让宿主机与容器共享数据。 可以让多个容器同时挂载一个 Volume 卷,这样就可以让不同的容器进行共享数据。 此类目录可以绕过联合文件系统。 volume 于容器初始化之时即会创建,由 base image 提供的卷中的数据会于此期间完成复制。 volume 的初衷是独立于容器的声明周期实现数据的持久化,因此删除容器时即不会删除卷,也不会对哪怕未被引用的卷做垃圾回收。 volume 的运行逻辑 卷为 Docker 提供了独立于容器的数据管理机制 卷实现了程序和数据的分离,以及程序和制作镜像的主机分离,用户制作镜像时无敌徐再考虑镜像运行的容器所在的主机的环境。 当共享存储卷挂载到容器上后,那么当用户写入向容器中的卷写入数据时相当于直接写入到文件中。 当用户直接向容器中的根目录写入数据时会产生一个读写层,提供读写写入。 应用场景 当 docker 运行 httpd 时会将站点目录指定到 volume 卷上,共享主机的卷。其他产生的临时数据放置到容器的读写层中,这样当容器运行完成删除后,一些站点目录还是存在的,但是一些临时产生的数据将会删除。 ...

November 12, 2020

Docker 容器网络

虚拟化网络 通过纯软件的方式来实现,是网络虚拟化的简单实现。 OpenVSwitch 纯软件实现,但是功能十分强大,并不是集成在内核中的,需要单独下载。 SDN 将全部的网络的控制层面都集成到一台主机上。 容器间通信 单机通信 交换机的实现,每个容器会生成一对网卡,一个网卡放在容器中,一个网卡放在交换机上。如果将一个局域网中或者说一个网段的所有主机的一个接入网卡放置在一个虚拟的交换机上,就形成了交换机。 路由器的实现,可以理解为是一个独立单独的名称空间来实现路由器的功能,用来转发不同网段的数据。 多机通信 桥接模式 管理困难,并且很容易产生广播风暴。并且是 nat 桥网络,并不是真正的物理桥网络。 桥接模式的弊端 如果要向外网发布内网的 web 那么就必须做 DNAT 映射,映射完成后才可以访问。但是如果内网有多个主机,这时就不会映射到一个端口上了,这时就会出现问题。 联盟式网络 两个容器联接到一起,UTS NET IPC 是共享的,会使用同一个网卡,同一个 IO 同一个主机名的解析。 开放式容器 直接开放与物理机直接连接,物理机能看到或者是连接到哪些主机,那么容器就可以连接并看到这些主机,与物理机共享资源,是联盟式网络的扩展。 nat 模式 将主机内的网络通过桥接到外网网卡进行转换 DNAT,然后对外网进行通信。 这样的方式虽然可以实现通信,但是会导致 NAT 转换次数过多的问题。 Overlay Network 通过隧道进行转发,转发通过 eth0 进行转发,转发过程中外网网卡会主动在包头上额外携带一个多加的包头,用来存储外网网卡上的 IP 地址,进行转发数据并通信。 只能在同一网段上通信。 范例:docker 网卡及网桥的显示 Docker 0 网卡的作用 作为一个容器之间进行交互的虚拟网卡和网桥来使用 当容器运行时出现的网卡 这个网卡就是留在虚拟机中的一半网卡 网卡体现 24: veth7534419@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue maste 28: vethb9e279c@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue maste 虚拟网桥的接口体现 ...

November 11, 2020

Docker 镜像管理

Docker 镜像运行流程 Docker 镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动 Docker 容器 采用分层构建机制,最底层为 bootfs,其之为 rootfs,为了确保用户空间可以正常引导 bootfs:用于系统引导的文件系统,包括 bootloader 和 kernel,在内核中进行构建的,用户使用时是看不到并且体会不到的 rootfs:位于 bootfs 之上,表现为 Docker 容器的根文件系统 传统模式中,系统启动时,内核挂载 rootfs 时会首先将其挂载为只读模式,完整性自检完成后,将其重新挂载为读写模式 docker 中,rootfs 由内核挂载为只读模式,而后通过联合挂载技术额外挂载一个可写层。 Docker Image Layer 位于下层的镜像称之为父镜像,最底层的称为基础镜像。 最上层为 “可读写“ 层,其下的均为 ”只读“ 层 bootloader 层,在内核中,只是为了创建一个容器,并引导容器运行。容器创建完成并引导成功后,那么就会卸载 bootloader 层(在内存中)。 base image 层,是在用户空间中,是一个只读层,是一个基础镜像层。 image 层(add emacs),类似于 vim 的一层 image 层(add apache),是一个应用程序的层,只读层 writable 层,可写层,因为镜像都是只读的,所以当用户在写入或者是修改时,会在这个镜像的上方新建一个写入层。当删除容器时,容器的可写层会一并被删除。 Aufs(Storage Driver) 高级多层统一文件系统,简称 Aufs。前身是 UnionFS,在 2006 年诞生。aufs 一直都不是内核的代码。 Docker 最初使用 aufs 作为容器文件系统层,目前仍然作为存储后端之一来支持。 overlayfs 是 aufs 的竞争版。Docker 的分层镜像,除了 aufs,docker 还支持 btrfs,devicemapper 和 vfs 等。 ...

November 11, 2020

Docker LXC

虚拟化类别 主机级虚拟化 类型 1 虚拟化 直接在硬件之上安装虚拟机,称为 Hypervisor,也就意味着在硬件之上不需要安装宿主机操作系统。在 Hypervisor 安装操作系统。 类型 2 虚拟化 vmware virtualbox,在硬件之上安装操作系统,称为 hostOS 也称为宿主机,然后在宿主机之上安装 VMM(Virtual Machine Manager) 主机虚拟化的缺点 资源开销较大,例如有时仅仅需要创建一个应用程序而已,但是就必须要使用传统的主机级虚拟化安装一个操作系统在操作系统上安装应用程序。 这就造成了资源浪费,因为我们的目的仅仅是要上线一个应用程序而已。 容器级虚拟化技术 通过内核的 namespace 和 chroot 来实现容器级的虚拟化,让各个容器共享内核。并通过内核的 namespace 中的六个隔离和系统调用实现容器的划分及虚拟化。 使用容器的初衷 为了让环境隔离,例如需要上线两个 nginx 服务,并且都需要使用 80 端口,但是一个主机仅有一个 80 端口套接字,无法实现。所以需要使用虚拟机。 让多个虚拟机是互相不可达的。 容器技术 运行进程不受其他进程干扰,在使用容器时,创建出多个用户空间。在多个用户空间中运行单独的进程,那么这个用户空间就称之为容器。多个用户空间会共同使用一个单独的内核,一般情况下会使用第一个用户空间是有特权的用户空间,并且会使用这个有特权的用户空间来控制其他的用户空间。 Docker 的诞生 jail 最初出现 jail 的目的,是为了安全。因为就算是黑客攻击了这个容器,那么攻陷的也仅仅是个容器,到达的资源边界就是容器的边界。 vserver(chroot) 将 jail 技术复刻到 linux 之后的技术称之为 chroot(切根),当切根后,那么实现的就是让单个用户在一个目录中运行,并且可以让这个用户在这个目录中认为这个就是根目录。 相关系统调用 clone() 创建进程的系统调用 setns() 创建名称空间后将进程放置到名称空间的调用 LXC(linuxX Container)的诞生 Docker 是一个应用工具,并且是一个 LXC 增强版。 为什么需要 LXC,因为之前的 vserver 技术需要来调用系统的调用才能实现需要的功能,所以这种方法不易于大众来使用。 所以 linux 公司就研发了一种 LinuX Container 技术。 ...

November 10, 2020