服务 | 说明 | 应用 |
---|---|---|
IAAS | 基础设施及服务 | 硬件(服务器、网络设置、防火墙等)虚拟化 网络虚拟化(大二层) 例:openstack |
PAAS | 平台及服务 | 环境 例:数据库、 docker 、kubernetes |
SAAS | 应用及服务 | 应用 例:应用商店的应用 |
而Docker就是PAAS中的技术。
Docker是一种轻量级的“虚拟机”,是一个开源的应用容器引擎。容器是完全使用沙箱机制,相互之间不会有任何接口
对比参数 | 虚拟机 | 容器 |
---|---|---|
启动时间 | 慢 (分钟级别) | 快速(毫秒级别) |
占用空间 | 大(整个系统的大小,几G) | 小(内核大小,几M) |
系统隔离 | 逻辑隔离 | 依赖于内核(内核共享) |
安全性 (因为隔离性) | 高 | 低(使用原系统内核) |
yum install -y yum-utils device-mapper-persistent-data lvm2
#yum-utils提供了yum-config-manager
#device mapper存储驱动程序需要device-mapper-persistent-data和lvm2
#Device Mapper 是Linux2.6内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
systemctl start docker.service
systemctl enable docker.service
systemctl daemon-reload
systemctl restart docker
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
service network restart
systemctl restart docker
查看docker版本信息
docker version
docker search 服务名
例如:
docker search nginx
docker pull 服务名
例如:
docker pull nginx
docker images
docker inspect 镜像的ID
例如
docker images
docker inspect 08b152afcfae
docker tag 仓库名:原镜像名 仓库名:新镜像名
例如:
docker tag nginx:latest nginx:test
docker images
docker images | grep nginx
docker rmi 镜像的ID
docker rmi 仓库名:镜像名
例如:
docker rmi 08b152afcfae
docker images
docker rmi nginx:test
docker images
docker save -o 存放镜像的位置 仓库名:镜像名
例如:
docker save -o /opt/nginx_latest nginx:latest
方法一:
docker load < 本地导出的镜像名
方法二:
docker --input 本地导出的镜像名
例如:
docker load < nginx_latest
docker load --input nginx_latest
docker push [OPTIONS] NAME[:TAG]
例如:按照下面的流程就可以上传到公有云,有兴趣的可以上传
#改标签
docker tag 仓库名:镜像名 用户名/仓库名:镜像名
#登录
docker login
Username: #用户名
Password: #密码
#上传
docker push 用户名/仓库名:镜像名
查看容器运行状态
docker ps #查看运行中的容器
docker ps -a #加-a 列出所有的容器,包括未运行的容器
docker create [选项] 镜像运行的程序
-i:让容器的标准输入保持打开
-t:让Docker分配一个伪终端
例;
docker create -it nginx:latest /bin/bash
docker start 容器ID:启动一个或多个已经被停止的容器
docker stop 容器ID:停止一个运行中的容器
docker restart 容器ID:重启容器
例:
docker start b85c03c58f37
docker ps -a
docker stop b85c03c58f37
docker ps -a
docker restart b85c03c58f37
docker run [选项] 镜像 [命令] [变量]
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-c 命令表示后面的参数将会作为字符串读入作为执行的命令
-v: 绑定一个卷
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
--name="名称": 为容器指定一个名称
--link name:alias 添加链接到另一个容器,格式“--link容器名:别名”
例如:
docker run nginx
docker run -d nginx
docker run -d nginx /bin/bash -c "ls"
docker exec [选项] 容器 命令
例:
docker exec -it b85c03c58f37 /bin/bash
exit//退出容器
#容器导出
docker export 容器ID > 备份文件名
#容器导入(会生成镜像,而不会创建容器)
cat 备份文件名 | docker import - 仓库名:镜像名
例如:
docker export 42233cbb9bfa > nginx_up
docker export fef292fce501 > nginx_exited
cat nginx_up | docker import - nginx:web
docker rm 容器ID
例如:
docker rm 4d8dcf51a4ef
//批量删除容器
docker ps -a | awk '{print "docker rm "$1}' | bash
docker network ls #查看docker网络列表
Host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
None:该模式关闭了容器的网络功能。
Bridge:默认为该模式,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat 表配置与宿主机通信。
自定义网络
#使用docker run创建Docker容器时,可以用 --net 或 --network 选项指定容器的网络模式
host模式
container模式
docker ps -a #查看容器
docker inspect -f '{{.State.Pid}}' fef292fce501 #查看容器进程号
ls -l /proc/54182/ns #查看容器的进程、 网络、文件系统等命名空间编号
docker run -itd --name test1 --net=container:fef292fce501 centos:7 /bin/bash
docker ps -a
docker inspect -f '{{.State.Pid}}' 2d56bd745e6a
ls -l /proc/27123/ns
自定义网络
#直接使用bridge,无法支持指定IP运行docker
docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:7 /bin/bash
#可以先自定义网络,再使用指定IP运行docker
docker network create --subnet=172.18.0.0/24 mynetwork
docker run -itd --name test2 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash
设置CPU使用率上限
docker run -itd --name test2 centos:7 /bin/bash
docker ps -a
cd /sys/fs/cgroup/cpu/docker/c9a25708747a02569235cb4df245e22eeb9e55ae00ddaf0abc01cb1f44fe29d7/
cat cpu.cfs_quota_us #cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用 us 表示),默认为100000。
cat cpu.cfs_period_us #cpu.cfs_quota_us:表示该control group限制占用的时间(微秒),默认为-1,表示不限制。 如果设为50000,表示占用50000/100000=50%的CPU。
docker exec -it c9a25708747a /bin/bash
vi cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
chmod +x /cpu.sh
./cpu.sh
exit
top #可以看到这个脚本占了很多的cpu资源
docker run -itd --name c1 --cpu-shares 512 centos:7
docker run -itd --name c2 --cpu-shares 1024 centos:7
#创建两个容器为 c1 和 c2,若只有这两个容器,设置容器的权重,使得c1和c2的CPU资源占比为1/3和2/3。
分别进入容器,进行压力测试
yum install -y epel-release
yum install stress -y
stress -c 4 #产生四个进程,每个进程都反复不停的计算随机数的平方根
exit
查看容器运行状态(动态更新)
docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
c3ee18e65852 c2 66.50% 5.5MiB / 976.3MiB 0.56% 20.4MB / 265kB 115MB / 14.2MB 4
bb02d3b345d8 c1 32.68% 2.625MiB / 976.3MiB 0.27% 20.4MB / 325kB 191MB / 12.7MB 4
先分配虚拟机4个CPU核数
docker run -itd --name test3 --cpuset-cpus 1,3 centos:7 /bin/bash
#进入容器,进行压力测试
yum install -y epel-release
yum install stress -y
stress -c 4
exit
#退出容器,执行 top 命令再按 1 查看CPU使用情况。
对内存使用的限制
docker run -itd --name test3 -m 512m centos:7 /bin/bash
docker stats
–device-read-bps:限制某个设备上的读速度bps(数据量),单位可以是kb、mb(M)或者gb。
–device-write-bps : 限制某个设备上的写速度bps(数据量),单位可以是kb、mb(M)或者gb。
–device-read-iops :限制读某个设备的iops(次数)
–device-write-iops :限制写入某个设备的iops(次数)
创建容器,并限制写速度
docker run -it --name test5 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
#通过dd来验证写速度
dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct #添加oflag参数以规避掉文件系统cache
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 10.0025 s, 1.0 MB/s
总结
1、镜像
查找镜像(search)—上传(pull)、下载(push)—打标签(tag)—删除(rm)—导出(save)、导入(load)
2、容器
查看(ps)—创建(create)—启动(start)、停止(stop)、重启(restart)—运行(run)—进入(exec)、退出(exit)—导入(import)、导出(export)—删除(rmi)