Docker 系列一

  • 一、Docker 简介
    • 1、Docker 特点
    • 2、Docker 架构
    • 3、Docker 核心
  • 二、Linux kernel
    • 1、Namespace
    • 2、Cgroups
    • 3、UnionFS
  • 三、Docker 使用
    • 1、Docker 安装
    • 2、Docker 镜像管理
      • 1.查看镜像详情
      • 2.镜像导入导出
      • 3.更改镜像信息
      • 4.删除本地镜像
    • 3、Docker 容器操作
      • 1.创建容器
      • 2.查看容器
      • 3.删除容器
    • 4、容器资源限制
      • 1.内存限制
      • 2.CPU 限制
      • 3.IO 限制

一、Docker 简介

Docker 是基于 Go 语言开发的一款开源的应用程序与 PaaS 服务,是一种轻量化的 虚拟机 。Docker 三大理念为 build(构建) 、ship(运输)、run(运行)。并且使用 Namespace 与 Cgroup 来提供容器的资源隔离与安全保障等。如Docker 的 logo 一样,蓝鲸为宿主机,而集装箱则为互相隔离且有自己应用的容器。

以下是 Docker 与 虚拟机的区别

特点虚拟机Docker
启动分级秒级
磁盘使用GBMB
性能弱于接近原生
系统支持量一般几十上千容器
隔离性完全隔离资源隔离

1、Docker 特点

  • 轻量级:单机可以轻松支持上百 Container ,快速启动。
  • 高性能:不需要进行硬件虚拟以及运行完整的操作系统。
  • CI/CD:持续集成、持续交付与持续部署。
  • 迁移与扩容:可在物理机、云,虚拟机进行迁移,且可弹性伸缩、快速扩容。
  • 隔离性:进程、资源等进行隔离,但没有虚拟机彻底。

2、Docker 架构

引擎

Docker 引擎是一个C/S 架构的应用程序。常驻后台进程 Dockerd ,由 REST API 与 Dockerd 进行交互,最后由 docker CLI 与 REST API 进行交互,执行 docker 命令。

组成

  • Host:一个物理机或虚拟机,用来运行 Docker服务进程与容器。
  • Client:客户端使用 docker 命令或其他工具调用 Docker API 进行通信。
  • Deamon:Dockerd 架构中后台系统进程,用来监听Docker API的请求和管理Docker对象,比如镜像、容器、网络和Volume。
  • Registry:保存镜像的仓库,类似 Git 版本控制系统等。
  • Images:Docker 镜像,可以理解为创建容器需要的模板。
  • Containers:一组或一个拥有自己进行及网络等,提供外部访问的容器。

3、Docker 核心

  • 镜像(Image)
    Docker image 是一个只读模板,包含了文件系统。用来创建 Docker 容器,镜像来自于基于另外基础镜像构建并加上需要的额外自定义功能。
  • 容器(Container)
    Docker Container 一个镜像运行的实例,拥有自己封装的的进程、权限、存储、网络等,消耗资源极少。跟集装箱一样利用 Linux 内核技术进行资源隔离达到相互隔离,且使用 CLI 对容器进行操作。
  • 仓库(Registry)
    Dokcer Registry 类似于代码仓库,是 Docker 集中存放镜像文件的仓库。分为公开仓库(Public)和私有仓库(Private)两种形式。达到共享其他服务器,只需要用 pull(拉取) 于 push(上传) 对镜像仓库操作即可。

二、Linux kernel

kernel 是用来完成软件与硬件这个控制工作的软件被称为操作系统。在 Linux 的术语中被称为“内核”,也可以称为“核心”。Linux 内核的主要模块分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。

1、Namespace

在我们运行的服务中,为防止资源抢占,运用 PID Namespace 来进行进程隔离。在宿主机上可获取一组 PID、PPID ,PID 号是容器在宿主机上的进程,PPID是容器内进程在宿主机上的父进程 PID 。在容器内也有一组 PID、PPID,其中 PID 是容器服务的进程,PPID 是容器外部的进程,如果为0则表示父进程是容器外部的进程。

隔离类型系统调用参数功能
MNT NamespaceCLONE_NEWNS磁盘挂载点和文件系统间隔离
IPC NamespaceCLONE_NEWIPC进程间通信隔离
UTS NamespaceCLONE_NEWUTS主机名间隔离
PID NamespaceCLONE_NEWPID进程间隔离
NET NamespaceCLONE_NEWNET网络间隔离
USER NamespaceCLONE_NEWUSER用户间隔离

2、Cgroups

全称 Control Groups 对于容器的物理资源进行隔离,如 CPU、内存、磁盘IO 等,达到共享宿主机资源,但却互不影响。另外,还可以对进程进行优先级测试,以及任务执行挂起、恢复等操作。

类型作用
blkio块设备 IO 进行限制
cpu限制 CPU 时间片的分配,与 cpuacct 挂载在同一目录
cpuacct生成 cgroup 中的任务占用 CPU 资源的报告,与 cpu 挂载在同一目录
cpuset给 cgroup 中的任务分配独立的 CPU和内存
devices允许或拒绝 cgroup 任务访问设备
freezer暂停或恢复 cgroup 任务
hugetlb限制使用的内存页数量
memory对 cgroup 中的任务的可用内存进行限制,并自动生成资源占用报告
net_cls使用等级识别符(classid)标记网络数据包,这让 Linux 流量控制器(tc 指令)可以识别来自特定 cgroup 任务的数据包,并进行网络限制
net_prio允许基于 cgroup 设置网络流量(netowork traffic)的优先级
perf_event增加了对每个 group 的监测跟踪能力,可以监测 group 中特定的 CPU 上的线程
pids限制任务的数量

3、UnionFS

全称 Union File System ,是一种 Linux 的操作系统中的设计。用来把其他文件系统联合挂载到一个挂载点的文件系统服务。在 Docker 镜像中,用户每次制作镜像操作等于在镜像中增加一个目录(Docker 中 layer 为层)。达到在 Docker 中对文件权限以及目录有效的隔离。

三、Docker 使用

1、Docker 安装

操作系统地址Docker 版本
CentOS 7.4192.168.10.1docker-20.10.9.tgz

Docker 下载安装

[root@localhost ~]# wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.9.tgz[root@localhost ~]# tar zxvf docker-20.10.9.tgz[root@localhost ~]# cp docker/* /usr/bin[root@localhost ~]# cat <> /etc/systemd/system/docker.service> [Unit]> Description=Docker Application Container Engine> Documentation=https://docs.docker.com> After=network-online.target firewalld.service> Wants=network-online.target>> [Service]> Type=notify> ExecStart=/usr/bin/dockerd> ExecReload=/bin/kill -s HUP \$MAINPID> LimitNOFILE=infinity> LimitNPROC=infinity> TimeoutStartSec=0> Delegate=yes> KillMode=process> Restart=on-failure> StartLimitBurst=3> StartLimitInterval=60s>> [Install]> WantedBy=multi-user.target> EOF[root@localhost ~]# chmod +x /etc/systemd/system/docker.service[root@localhost ~]# systemctl daemon-reload && systemctl enable docker.service && systemctl start docker && systemctl status docker

Docker 版本查看

[root@localhost ~]# docker version#查看 docker 版本[root@localhost ~]# docker info#查看 docker 系统信息

2、Docker 镜像管理

1.查看镜像详情

查看本地镜像

[root@localhost ~]# docker images#默认等于-a,显示全部本地镜像REPOSITORY TAG IMAGE ID CREATEDSIZEnginxlatest605c77e624dd 6 months ago 141MB

参数详解

  • REPOSITORY:镜像名称
  • TAG:镜像的标签信息(默认latest),区分同 ID 不同标签,区分同镜像库不同镜像
  • IMAGE ID:镜像的唯一标识号,ID号
  • CREATED:镜像创建时间
  • SIZE:镜像占用空间
docker inspect [IMAGE:TAG]/[IMAGEID]#查看本地镜像详情docker history [IMAGE:TAG]/[IMAGEID]#查看镜像创建历史

2.镜像导入导出

网络方式

docker search [镜像关键字]#搜索镜像docker pull [IMAGE:TAG]#下载镜像docker push [IMAGE:TAG]#上传镜像

本地方式

docker load (同-o) [镜像包]#导出本地镜像鉴于普通方式打包较大,内网传输较慢,使用此方式:[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATEDSIZEcentos 7 c16a5dec2126 2 days ago 1.86GB[root@localhost ~]# docker save centos:7 | gzip > centos7-test.tar.gz[root@localhost ~]# docker savecentos:7 >centos7-test-01.tar.gz[root@localhost ~]# ll总用量 2496724-rw-r--r-- 1 root root 1878647296 7月 6 14:30 centos7-test-01.tar.gz#与镜像同大-rw-r--r-- 1 root root677993258 7月 6 14:28 centos7-test.tar.gz#缩小近三分之一

3.更改镜像信息

[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATEDSIZEnginxlatest605c77e624dd 6 months ago 141MB[root@localhost ~]# docker tag nginx nginx1215:1.21.5#更换名称与TAG[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATEDSIZEnginx12151.21.5605c77e624dd 6 months ago 141MB#ID不变nginxlatest605c77e624dd 6 months ago 141MB

4.删除本地镜像

根据镜像名称与标签删除

[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATEDSIZEnginx12151.21.5605c77e624dd 6 months ago 141MBnginxlatest605c77e624dd 6 months ago 141MB[root@localhost ~]# docker rmi nginx:latest#删除指定 TAG 镜像Untagged: nginx:latestUntagged: nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31

根据镜像 ID 删除

[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATEDSIZEnginx12151.21.5605c77e624dd 6 months ago 141MBnginxlatest605c77e624dd 6 months ago 141MB[root@localhost ~]# docker images -q | xargs docker rmi -f#删除本地所有镜像Untagged: nginx1215:1.21.5Untagged: nginx:latestDeleted: sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85

3、Docker 容器操作

1.创建容器

先创后启方式

docker create -it --name [CONTAINER-NAME] [IMAGE-NAME]:[TAG] [COMMAND][root@localhost ~]# docker create -it --name C7 centos:7.4.1708 bash [root@localhost ~]# docker start C7
  • create:创建容器
  • -i:容器始终保持输入状态
  • -t:为容器分配一个伪终端
  • -it:交互运行

直接运行方式

docker run -it --name [CONTAINER-NAME] [IMAGE-NAME]:[TAG] [COMMAND][root@localhost ~]# docker run -it --name C7 centos:7.4.1708 bash
  • run:运行容器
  • --name:容器命名
  • bash:进入容器的命名解析器,sh或bash

2.查看容器

查看容器

语法:docker ps [OPTIONS][root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES581d27672404 centos:7.4.1708 "bash"3 hours ago Up 3 hours test
  • -q:只显示镜像 ID
  • -a:显示全部容器
  • -s:显示 SIZE

查看容器映射端口

语法:docker port [CONTAINER][root@localhost ~]# docker port nginx680/tcp -> 0.0.0.0:8080/tcp -> :::80

进入容器

语法:docker exec [OPTIONS] [CONTAINER] [COMMAND][root@localhost ~]# docker exec -it test bash -c lsanaconda-post.logbindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvar

查看容器日志

语法:docker logs [OPTIONS] [CONTAINER][root@localhost ~]# docker logs nginx7
  • 默认打印全部
  • -f:实时打印日志
  • --timestamps:精确时间

3.删除容器

停止容器

语法:docker pause [CONTAINER]#暂停运行[root@localhost ~]# docker pause nginx7[root@localhost ~]# docker ps#STATUS状态为Pause暂停CONTAINER ID IMAGE COMMANDCREATEDSTATUS PORTS NAMES12fd2b515bd5 nginx:latest"/docker-entrypoint.…" 23 hours ago Up 23 hours (Paused) 0.0.0.0:80->80/tcp, :::80->80/tcp nginx7语法:docker unpause [CONTAINER]#继续运行[root@localhost ~]# docker unpause nginx7语法:docker stop [CONTAINER]#停止容器[root@localhost ~]# docker stop nginx7语法:docker kill [CONTAINER]#强制关闭容器[root@localhost ~]# docker kill nginx7 

删除容器

语法:docker rm[CONTAINER]#删除容器[root@localhost ~]# docker rm nginx7

4、容器资源限制

对于主机上 Docker 运行若干容器,每个容器都需要CPU、内存和 IO 资源,对于容器,也可以进行资源限制,以防止占用太多,影响其他甚至是整个主机上的性能。

1.内存限制

[root@localhost ~]# docker run -it -d -m 200M --memory-swap 300M centos:7.4.1708[root@localhost ~]# docker ps[root@localhost ~]# cat /sys/fs/cgroup/memory/docker/[写容器 ID]/memory.limit_in_bytes
  • -m:允许分配的内存大小
  • --memory-swap:允许分配的内存和swap的总大小

2.CPU 限制

[root@localhost ~]# docker run -it -d -c 1024 centos:7.4.1708
  • -c:CPU 的权重

3.IO 限制

[root@localhost ~]# docker run -it --device-write-bps /dev/sda:3MB centos:7.4.1708
  • --device-read-bps:限制读某个设备的 bps
  • --device-write-bps:限制写某个设备的 bps(bps 是 byte per second,每秒读写的数据量)
  • --device-read-iops:限制读某个设备的 iops
  • --device-write-iops:限制写某个设备的 iops(iops 是io per second,每秒 io 的次数)