文章目录
docker 容器管理
容器基础
容器概念
基于 docker 的虚拟化应用以容器的形式来部署和运行
container
由 docker 镜像创建的应用程序运行实例
- 镜像是静态的定义
- 容器是镜像运行的实体
- 容器实质也是进程,但与主机上的其他进程不一样,容器进程属于自己独立的名称空间内,运行在一个隔离的环境中,这点和虚拟机是不一样的
容器的基本信息
docker ps
:显示当前主机正在运行的容器列表
菜单 | 说明 |
---|---|
CONTAINER ID | 容器 ID(容器的唯一标识) |
IMAGE | 容器所用镜像的名称 |
COMMAND | 启动容器时的命令 |
CREATED | 容器的创建时间 |
STATUS | 容器运行的状态(up运行中,EXITED已停止) |
PORTS | 容器对外暴露的端口号 |
NAMES | 容器名称(ID不好记,用这个也可以,不设置默认就会生成一个NAMES) |
可写的容器层
容器=只读的镜像+可写的容器层
容器的磁盘大小
docker ps -s
可显示容器的大小
以上不包括:
- 容器的日志文件大小
- 容器的卷和绑定挂载
- 容器配置文件的大小
- 写入磁盘的内存大小
写时拷贝
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 | 指定主机端口和容器端口的映射关系 |
容器创建的一般流程
- 检查本地是否存在镜像,如果不存在,就去对应的注册中心自动拉取
- 基于镜像创建一个容器并且启动它
- 为容器分配一个文件系统,并在这个只读层的顶部新增一个容器可写层
- 从主机配置的网桥接口中分配一个虚拟接口桥接到容器
- 从网桥的地址分配一个容器IP地址
- 执行用户指定的应用程序
- 看启动结果…
容器的自动启动策略
–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
(好像不咋常用这个)
容器监控
容器监控命令
docker top 容器ID
- 容器系统资源使用情况
### 持续输出
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 |
示例