基于 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 | 指定主机端口和容器端口的映射关系 |
容器创建的一般流程
容器的自动启动策略
–restart
容器退出状态
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
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 份额限制
### 默认值就是1024 ,设置为0,相当于1024, (这块还不是很懂)
-c 1024
CPU 资源限制
指定 CPU 核心
--cpuset-cpus="0-2"/--cpuset-cpus="0,1,2"
磁盘的读写限制
### 设置权重,也可以指定设备
--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 内核底层技术实现的
示例
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
作为容器运行的安装方式
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
指定
支持配置日志驱动使日志重定向
日志驱动类型 | 说明 |
---|---|
none | 禁用容器日志,docker logs 不会任何输出 |
json-file | 日志保存在json文件中,docker负责格式化输出到标准设备 |
syslog | 日志消息写入syslog工具中,前提是 syslog 守护进程要在主机上运行 |
journald | 日志消息写入journald,前提也是一样 |
gelf | 日志消息写入日志文件收集系统(logstash)的GELF终端 |
fluentd | 日志消息写入fluentd工具中,前提是 fluentd守护进程要在主机上运行 |
splunk | 日志消息写入使用时间HTTP收集器的 splunk |
示例