目录
为什么要用到容器?
docker是什么?
容器与虚拟机的区别?
docker的三个核心概念:
docker容器操作
docker网络模式
bridge
host
container
none
自定义网络
CPU限制
内存限制
磁盘IO限制
为什么要用到容器?
1)容器可以屏蔽底层操作系统的差异性,让业务应用不管在哪里都是使用容器的环境运行,从而保证开发测试环境与生产环境的一致性
2)容器部署起来非常便捷和迅速,缩短开发测试部署的周期时间
容器引擎:docker containered podman rocket
虚拟化软件:Windows VMware Workstation 个人工作站版 VMware Sphere + ESXI 企业版 XEN
Linux KVM (基于linux内核的虚拟机) -> Openstack
docker是什么?
docker是用go语言开发并开源的容器引擎,用来运行容器里的应用。docker也是可用来管理容器和镜像的一种工具。
容器与虚拟机的区别?
容器 虚拟机
所有容器共享宿主机的内核 每个虚拟机都有独立的操作系统和内核
通过namespace实现资源隔离,通过cgroup实现限制资源的最大使用量 完全隔离。每个虚拟机都有独立的硬件资源
秒级启动速度 分钟级启动速度
容器相当于宿主机的进程,性能几乎没有损耗 需要通过hypervisor虚拟机管理程序对宿主机资源虚拟访问,有一定的性能损耗
单机容量能支持成百上千个容器 单机只能支持最多几十个虚拟机
docker的三个核心概念:
镜像:是创建容器的基础,是一个只读的模板文件,里面包含运行容器中的应用程序所需要的所有内容(应用程序文件、配置文件、运行库文件、依赖包等)
容器:是用镜像运行的实例,容器可以被创建、启动、停止、删除,每个容器之间默认是相互隔离的
仓库:是用来集中保存镜像的地方,有公有仓库和私有仓库之分
docker version
docker info
docker镜像操作
docker search 仓库|镜像的关键词
pull 仓库名/镜像名:标签 #如果不指定标签默认使用 :latest 标签
images [-q]
inspect 镜像名|镜像ID
tag 旧镜像名:旧标签 新镜像名:新标签
rmi 镜像名|镜像ID [-f]
save -o 镜像文件 镜像名|镜像ID
load -i|< 镜像文件
login #默认登录官方公有仓库
push 仓库名/镜像名:标签
docker容器操作
docker create [-i -t] [--name 容器名] 镜像名:标签 [容器启动命令]
start 容器名|容器ID
ps [-a -q]
inspect 容器名|容器ID
stop 容器名|容器ID #发送 SIGTERM 信号,默认等待10s
kill 容器名|容器ID #发送 SIGKILL 信号,强制停止容器
rm 容器名|容器ID [-f]
exec -it 容器名|容器ID bash|sh
logs 容器名|容器ID #查看容器中PID=1的主进程的日志
cp 宿主机文件路径 容器名|容器ID:绝对路径
cp 容器名|容器ID:绝对路径 宿主机文件路径
docker export -o 容器模板文件 容器名|容器ID docker export 容器名|容器ID > 容器模板文件
docker import 容器模板文件 -- 镜像名:标签 cat 容器模板文件 | docker import - 镜像名:标签
docker run -d [-i -t --name --rm] 镜像名:标签 [容器启动命令]
-P #使用从32768开始的随机端口映射容器
-p 宿主机端口:容器端口 #使用指定的宿主机端口映射容器
-v 宿主机绝对路径:容器绝对路径[:ro] #将宿主机目标|文件挂载到容器的数据卷
--volumes-from 数据卷容器名 #共享数据卷容器的数据卷
--link 目标容器名:连接别名 #可实现在容器内通过目标容器名或连接别名与目标容器通信
--network bridge|host|none|container:容器名或ID #设置容器的网络模式
docker run 的启动过程:1)检查本地是否有镜像,如果有则直接使用本地镜像创建容器,如果没有则从仓库拉取镜像再创建容器
2)在只读的镜像层上挂载一层可读可写的容器层
3)从docker网桥给容器分配一个虚拟接口和IP
4)使用镜像的默认启动命令或者指定的启动命令启动容器,直到容器中PID=1的主进程退出为止
docker网络模式
bridge
docker的默认网络模式。使用此模式的每个容器都有独立的网络命名空间namespace,即每个容器都有独立的IP、端口范围(每个容器可以用同一个端口)、路由、iptables规则等网络资源。
docker run [--network=bridge] ....
host
容器与宿主机共享网络namespace,即容器和宿主机使用同一个IP、端口范围(容器与宿主机或其它使用host模式的容器不能用同一个端口)、路由、iptables规则等网络资源。
docker run --network=host ....
container
和指定已存在的容器共享网络namespace,即这两个容器使用同一个IP、端口范围(容器与指定的容器不能用同一个端口)、路由、iptables规则等网络资源。
docker run --network=container:容器名|容器ID ....
none
每个容器都有独立的网络namespace,但是容器没有自己的eth0网卡、IP、端口等,只有lo网卡。
docker run --network=none ....
自定义网络
可以用来自定义创建一个网段、网桥、网络模式,从而可以创建容器时自定义容器IP
docker network create --subnet 自定义网段 --opt "com.docker.network.bridge.name"="自定义网桥名" 自定义网络模式名
docker run --network 自定义网络模式名 --ip 自定义容器IP ....
cgroup资源限制(限制容器进程对CPU 内存 磁盘IO 等资源的最大使用量)
CPU限制
设置单个容器进程能够使用的CPU使用率上限
针对新建的容器:
docker run --cpu-period 单个CPU调度周期时间(1000~1000000) --cpu-quota 容器进程能够使用的最大CPU时间(>=1000)
针对已存在的容器:
修改 /sys/fs/cgroup/cpu/docker/容器ID/ 目录下的 cpu.cfs_period_us(单个CPU调度周期时间) cpu.cfs_quota_us(容器进程能够使用的最大CPU时间) 文件的值
设置多个容器的CPU占用份额(只能在多个容器同时运行且CPU资源紧张时生效)
docker run --cpu-shares 容器进程最大占用CPU的份额(值为1024的倍数)
设置容器绑定指定的CPU
docker run --cpuset-cpus CPUID1[,CPUID2,....]
内存限制
设置容器能够使用的内存和swap的值
docker run -m 内存值 --memory-swap 内存和swap的总值
设置 0 或 不设置,表示swap为内存的2倍
设置 -1,表示不限制swap的值,宿主机有多少容器即可使用多少
设置 与 -m 一样的值,表示不使用swap
磁盘IO限制
docker run --device-read-bps 磁盘设备文件路径:速率 #限制容器在某个磁盘上读的速度
--device-write-bps 磁盘设备文件路径:速率 #限制容器在某个磁盘上写的速度
--device-read-iops 磁盘设备文件路径:次数 #限制容器在某个磁盘上读的次数
--device-write-iops 磁盘设备文件路径:次数 #限制容器在某个磁盘上写的速度