docker 容器管理

docker 容器管理

容器基础

容器概念

基于 docker 的虚拟化应用以容器的形式来部署和运行

container

由 docker 镜像创建的应用程序运行实例

  • 镜像是静态的定义
  • 容器是镜像运行的实体
  • 容器实质也是进程,但与主机上的其他进程不一样,容器进程属于自己独立的名称空间内,运行在一个隔离的环境中,这点和虚拟机是不一样的

容器的基本信息

docker ps :显示当前主机正在运行的容器列表

菜单说明
CONTAINER ID容器 ID(容器的唯一标识)
IMAGE容器所用镜像的名称
COMMAND启动容器时的命令
CREATED容器的创建时间
STATUS容器运行的状态(up运行中,EXITED已停止)
PORTS容器对外暴露的端口号
NAMES容器名称(ID不好记,用这个也可以,不设置默认就会生成一个NAMES)

在这里插入图片描述

可写的容器层

容器=只读的镜像+可写的容器层

在这里插入图片描述

容器的磁盘大小

docker ps -s 可显示容器的大小

在这里插入图片描述

以上不包括:

  1. 容器的日志文件大小
  2. 容器的卷和绑定挂载
  3. 容器配置文件的大小
  4. 写入磁盘的内存大小

写时拷贝

Copy-on-Write

简称:CoW,又被叫做写时复制,是一个最高效率的文件共享和复制策略

  • 文件、目录位于镜像中的底层,其他层需要读取,只需使用现有的文件即可,
  • 其他层需要修改,文件会被复制到该层并修改

优势

  • 共享有助于减少镜像大小
  • 复制使容器效率更高:需要修改文件,从镜像各层搜索要修改的文件,从最高到最低,找到文件后将被添加到缓存中进行操作,对找到的文件复制到容器的可写层,任何修改只会修改这个可写层的文件,并且底层的只读的源文件对于容器是不可见的(从上往下俯瞰,看到的总是可写层的那个文件)

容器操作

容器创建和运行

docker create:创建容器,但是不会运行

docker run:创建并运行容器

命令语法:docker run [选项] 使用的镜像 [启动命令] [启动命令的参数]

  • docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

常用的选项

选项(短格式为主)说明
-a连接到标准输入、输出和标准错误,(现在基本不用了)
-c设置容器 CPU 权重
-d指定容器运行于后台
–device添加主机设备到容器,相当于设备直通(用的也少)
–dns指定容器的 DNS 地址
–dns-search指定容器的DNS搜索域名,写入容器的 /etc/resolv.conf文件中
–entrypoint覆盖镜像的入口点
-e指定容器的环境变量
–env-file指定容器的环境变量文件,文件格式为一行一个环境变量
–expose指定容器对外的端口暴露
-h指定容器的主机名
-m设置容器内存上限
–name指定容器的名称
–net设置容器的网络
–privileged指定容器为特权容器,拥有所有的权限
–restart指定容器停止后的重启策略
–rm指定容器停止后自动删除容器
-t为容器分配TTY设备支持终端登陆
-v为容器挂载存储卷,将其挂载到容器的某个目录下
–volumes-from为容器挂载其他容器上的卷
-w指定容器的工作目录
-p指定主机端口和容器端口的映射关系

容器创建的一般流程

  1. 检查本地是否存在镜像,如果不存在,就去对应的注册中心自动拉取
  2. 基于镜像创建一个容器并且启动它
  3. 为容器分配一个文件系统,并在这个只读层的顶部新增一个容器可写层
  4. 从主机配置的网桥接口中分配一个虚拟接口桥接到容器
  5. 从网桥的地址分配一个容器IP地址
  6. 执行用户指定的应用程序
  7. 看启动结果…

容器的自动启动策略

–restart

  • no:容器退出时不自动重启,默认设置
  • on-failure:5:容器以非0状态码退出时重启,可以指定尝试重启容器的次数
  • always:不管什么状态退出,无限次数得重启容器
  • unless-stopped:不管什么状态退出,都始终重启容器,如果容器之前就是停止状态,则不会尝试启动它

容器退出状态

125:Docker 守护进程本身的错误

126:无法调用容器命令

127:容器命令不存在

容器的启停

启动:docker start container1 container2

停止:docker stop container1 container2

重启:docker restart container1 container2

强制停止:docker kill container1 container2

暂停:docker pause container1 container2

恢复:docker unpause container1 container2

阻塞:docker wait container1 container2

查看容器信息

显示容器列表

docker ps [选项]

  • -a:显示所有容器,包括停止和未运行的

  • -f:根据条件过滤容器

  • –format:自定义格式输出

  • -l:显示最近创建的容器

  • -n:显示最近创建的n个容器

  • –no-trunc:显示完整的容器信息

  • -q:静默显示,只显示ID

  • -s:显示总的文件大小

查看容器详细信息

docker inspect 容器名/ID

  • 支持使用 -f 选项来获取特定的内容

在这里插入图片描述

进入容器操作

docker exec -it 容器ID bash/sh

在这里插入图片描述

删除容器

docker rm -f 容器ID

在这里插入图片描述

基于容器创建镜像

docker commit 容器ID 镜像信息

实现原理

基于容器创建镜像:基于源镜像层数内容+容器可写层内容

示例

在这里插入图片描述

容器限制

限制容器内存

  • 物理内存
  • 交换内存

用户内存限制

### 设置内存限制并取消交换内存限制(较多使用交换)
-m 300M --memory-swap -1

### 设置内存限制
-m 300M

### 同时设置
-m 300M --memory-swap 1G

内核内存限制

### 无法设置对交换的限制,被用户内存限制的上下文中限制内核内存
-m 500M --kernel-memory 50M

### 只设置内核内存也可
--kernel-memory 50M

内存预留

### 内存软限制,允许更大的内存共享,内存预留始终低于硬限制,默认不做软限制
-m 500M --memory-reservation 200M # 当容器消耗内存超过200小于500时候,下一次系统回收将尝试降低到200以下

禁止杀死容器的进程

### 内存溢出,内核会杀死容器中的进程,--oom-kill-disable配合-m使用最佳
-m 100M --oom-kill-disable

交换限制

### --memory-swappiness 百分越大,表示积极使用交换空间,越小表示积极使用物理内存空间,0的时候,最大限度使用物理内存,100则相反
--memory-swappiness 0 ## 关闭内存页面交换

限制容器CPU

默认情况下,所有容器平等使用主机的 CPU 并且没有限制

CPU 份额限制

  • 默认所有容器都可以获得相同比例的 CPU 周期
  • 可以更改这个设置,让一个容器相对于其他容器使用的 CPU 份额权重
### 默认值就是1024 ,设置为0,相当于1024, (这块还不是很懂)
-c 1024

CPU 资源限制

  • –cpus:设置容器可以使用的可用 CPU 资源,浮点数,默认0.000,表示不受限制,如果有2个CPU,1.5就表示使用1个半的CPU

指定 CPU 核心

  • –cpuset-cpus:限制容器使用特定的CPU
--cpuset-cpus="0-2"/--cpuset-cpus="0,1,2"

限制容器块IO带宽

磁盘的读写限制

  • 设置权重:只对直接IO,范围10-1000
  • 限制 bit/s:每秒读写的字节数 KM MB GM
  • 限制 io/s:每秒 io 的次数,正整数
### 设置权重,也可以指定设备
--blkio-weight 300
--blkio-weight-device "/dev/sda:200"

### 设置限制字节数大小
--device-read-bps /dev/sda:1mb

### 设置iops大小
--device-read-iops /dev/sda:1000
--device-write-iops /dev/sda:1000

资源限制的实现机制

前面就知道是通过 Cgroup 内核底层技术实现的

  • 对应的子系统来实现
    • 内存子系统
    • CPU子系统
    • blkio子系统

示例

docker run -d -m 100M -c 512  busybox sleep 3000

在这里插入图片描述

动态修改容器配置

docker update 选项 容器ID (好像不咋常用这个)

容器监控

容器监控命令

  1. docker top 容器ID

在这里插入图片描述

  1. 容器系统资源使用情况
### 持续输出
docker stats

### 显示所有的
docker stats -a

### 显示完整信息
docker stats --no-trunc

### 输出当前状态
docker stats --no-stream

在这里插入图片描述

cAdvisor 监控容器

  • 这是谷歌提供的工具
  • 可以分析正在运行的容器的资源占比情况和性能指标
  • 图形化显示、易入门
  • 它是一个运行时的守护进程,负责收集、聚合、处理,可以监测到资源隔离参数、历史资源使用和网络统计数据
  • 可以原生安装,也可以 docker 容器运行

作为容器运行的安装方式

docker run --privileged -v /:/rootfs:ro \
	-v /var/run:/var/run:rw \
	-v /sys:/sys:ro \
	-v /var/lib/docker/:/var/lib/docker:ro \
	-p 8080:8080 --detach --name=cAdvisor \
	google/cadvisor:latest 

在这里插入图片描述

指标功能展示

浏览器访问 8080 端口即可访问,指标说明

在这里插入图片描述

【Docker Containers】进入容器信息页面展示

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

容器日志

哪里的日志

我猜想是:容器启动命令后,产生的日志

验证一下:符合预期

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

命令查看日志

docker logs 选项 容器ID

选项说明
–details显示详细的日志信息
-f持续输出日志,跟踪日志
–since显示某个开始时间到当前的所有日志
–tail 10仅显示最新的N (10)条日志
-t显示时间戳
–until显示到某个截止时间的所有日志

在这里插入图片描述

配置日志驱动

--log-driver 指定

支持配置日志驱动使日志重定向

  • 日志发送到标准输出设备和标准错误设备时默认的日志行为
  • 提供多种日志机制从运行的容器中提取日志,这些机制也叫日志驱动(logging driver)
    • 默认 json-file
日志驱动类型说明
none禁用容器日志,docker logs 不会任何输出
json-file日志保存在json文件中,docker负责格式化输出到标准设备
syslog日志消息写入syslog工具中,前提是 syslog 守护进程要在主机上运行
journald日志消息写入journald,前提也是一样
gelf日志消息写入日志文件收集系统(logstash)的GELF终端
fluentd日志消息写入fluentd工具中,前提是 fluentd守护进程要在主机上运行
splunk日志消息写入使用时间HTTP收集器的 splunk

示例

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值