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 镜像信息

实现原理

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

示例

容器限制

限制容器内存

  • 物理内存
  • 交换内存

用户内存限制

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

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

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

内核内存限制

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

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

内存预留

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

禁止杀死容器的进程

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

交换限制

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

限制容器CPU

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

CPU 份额限制

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

CPU 资源限制

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

指定 CPU 核心

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

限制容器块IO带宽

磁盘的读写限制

  • 设置权重:只对直接IO,范围10-1000
  • 限制 bit/s:每秒读写的字节数 KM MB GM
  • 限制 io/s:每秒 io 的次数,正整数
shell 复制代码
### 设置权重,也可以指定设备
--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子系统
    • ...

示例

shell 复制代码
docker run -d -m 100M -c 512  busybox sleep 3000

动态修改容器配置

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

容器监控

容器监控命令

  1. docker top 容器ID
  1. 容器系统资源使用情况
shell 复制代码
### 持续输出
docker stats

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

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

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

cAdvisor 监控容器

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

作为容器运行的安装方式

shell 复制代码
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

示例

相关推荐
Sheffield4 小时前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker
Sheffield12 小时前
Alpine是什么,为什么是Docker首选?
linux·docker·容器
马艳泽13 小时前
win10下运行Start Broker and Proxy报错解决
docker
舒一笑1 天前
程序员效率神器:一文掌握 tmux(服务器开发必备工具)
运维·后端·程序员
NineData1 天前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库
用户13573999256601 天前
Windows 从 0 搭建 WSL2 原生 AI 开发环境:Codex + Docker + VSCode
docker
vi_h2 天前
在 macOS 上通过 Docker 安装并运行 Ollama(详细可执行教程)
macos·docker·ollama
黑心老魔2 天前
通过 Docker 创建开发环境
docker·开发环境
冬奇Lab2 天前
一天一个开源项目(第41篇):Workout.cool - 现代化开源健身教练平台,训练计划与进度追踪
docker·开源·资讯
梦想很大很大2 天前
拒绝“盲猜式”调优:在 Go Gin 项目中落地 OpenTelemetry 链路追踪
运维·后端·go