Day07

docker 镜像、容器的命令

commit 把容器提交为镜像
docker  save 可以用于容器的迁移
docker save -o nginx.tar.gz httpd:c1
然后在其他机器上
docker load -i nginx.tar.gz 就可以导入镜像了 
直接docker run -itd --name http-test  -p:82:80 httpd:c1
这样相当于是容器的迁移了
docker cp 宿主机: 容器 

docker export 将容器导出为一个压缩包 

镜像命令

docker image
build 构建镜像-dockfile文件
history 查看镜像历史分层
import 导入容器文件系统到tar.gz的文件包
inspect 镜像详细信息
load 加载来自tar.gz的镜像文件,可用于镜像迁移 -i
ls  列出当前所有镜像
prune 移除未使用镜像  -a
pull 下载拉取一个镜像
push  一般是tag打过标签的镜像,推送镜像到仓库中
rm  删除镜像 -f 
save 保存一个或者多个镜像归档到一个tar.gz文件中  -o
tag 给镜像打个标记

容器管理命令

docker containerd --help
attch : 进入依附这个容器里面
commit : 提交当前正在运行的容器到本地镜像
cp : 复制一个文件到容器,或者从容器复制文件到宿主机
create :创建一个容器
diff : 检查容器结构的更改
exec : 进入容器 -it
export: 一般不用,导出容器,但是不保存容器状态,一般都是用save
inspect : 列出容器详细信息
kill : 一般也不用这个,杀死容器
logs : 容器运行日志 -f
ls : 正在运行的容器
pause: 一般都是stop,暂停一个容器
port : 列出容器端口和特定映射
prune: 取出所有停止的容器
rename: 重命名容器
restart:重启容器
rm : 删除一个或者多个停止的容器
stats :查看容器实时流资源使用统计信息
stop:停止一个或者多个容器
top:显示容器正在运行的进程
unpause:取消暂停一个或者多个容器的进程
update : 更新容器配置
wait: 阻止一个或者多个容器停止,然后打印退出代码
网络这块的命令
htop:相比于top,htop更加人性化,支持鼠标操作。可以看到cpu状态、整体状态、内存状态、进程状态、管理控制
glances:资源监控工具,可以提供cpu使用率,内核统计信息和运行队列信息、内存使用情况、磁盘I/O速度,传输和读写比率、文件系统中可用空间、磁盘适配器、网络io速度、页面空间和页面速度、消耗资源最多的进程、计算机信息和系统资源
iftop:网络监测工具,实时查看服务器上网络接口的实时流量情况,包括流入和流出的数据量、数据包数量、流量占用比例等信息
netstat -nultp : 监控tcp\ip网络工具,显示路由表,实际的网络连接以及每一个网络接口设备的状态信息
lsof -i port:列出当前系统打开文件的工具
iostat:用于输出磁盘IO和CPU的统计信息
vmstat:虚拟内存统计,可用于操作系统的虚拟内存,进程、cpu活动进行监控,对系统的整体情况进行统计
# cpu
numactl  /etc/default/grub
top / htop / glances / iftop / iostat -x 1 4 

产线问题及产线的注意细节

# 容器启动的时候,后面带不带/bin/bash有什么区别,产线里面经常会遇到这种问题
比如跑了nginx 一个带了/bin/bash 一个没带
但是一个能访问页面,一个访问不了
/bin/bash 会覆盖掉 history中cmd的命令,也就是Nginx没有启动
表面上来看其实是一样的没有区别。实际上cmd被覆盖掉了


系统级别容器,如centos 不带这个起不来 /bin/bash
docker run -itd --name centos-test centos
一般系统级别的容器都是自带的/bin/bash 自己启动
有的系统镜像是不自带的,要手动去指定


linxu下面有几个shell?
/bin/sh
/bin/bash  带tab键补全
/usr/bin/sh
/usr/bin/bash
docker stats --no-stream
docker stats 实时更新状态

docker  run -itd --name nginx2 # 容器名称
-p 2030:90
-e flyfish=zhangyya
# 产线上项目的时候,比如Jdbc 会给一个地址、链接,调这个env就可以了  docker exec -it 容器Id env 也可查看到
# 环境变量 可以进入容器echo $flyfish
-h nginx-web #容器内部名称
--restart=always  # 重启策略
nginx


但是往常我们进入容器 很多命令都做不到,原因就是因为我们没有弄到容器的最大权限,在rocky9这个已经不行了,但是在rocky8还是OK的
docker run -itd --name busybox-test busybox
这个命令启动了一个busybox的镜像,但是我们在里面什么都做不了,服务也起不了,因为没有权限


容器的最大shell:
/usr/sbin/init --privileges=true

dockers-daemon配置文件

容器的内部大小(弹性)在哪里设置?
在以前设置为100MB,现在默认为10G,容器大小达到设置最大值了就需要去进行扩容,那怎么去进行设置扩容?
1、在执行命令的之后就可以声明 容器大小,如下图

2、在daemon.json 文件中进行配置

iptabls补充

# 三表五链
iptables的概述
iptables 实际上就是一种包过滤型防火墙。 就是通过书写一些接受哪些包,拒绝哪些包的规则,实现数
据包的过滤。这些规则存储在专用的信息包过滤表中,而这些表集成在Linux 内核中。在信息包过滤表
中,规则被分组放在我们所谓的链(chain)中。
iptables的组成
iptables由两部分组成:
(1)framework: netfilter hooks function钩子函数,实现网络过滤器的基本框架
(2)rule utils: iptables 规则管理工具
iptables的三链五表
总体说来,iptables就是由“三表五链”组成。

压测实验-容器

限制cpu使用为20%压测

docker run -itd --name centos7-cpu-test --cpu-quota 20000 centos:7 /bin/bash

这个时候我们要进行什么操作?进入容器,下载一个bc,进行Cpu测试
docker  exec -it 701be /bin/bash
# 容器内查看cpu 
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us

# 容器外部
cat /sys/fs/cgroup/cpu/docker/容器id/cpu/cpu.cfs_quota_us

但是这个时候我们要执行 yum install -y bc 是不能的,因为我们没有源,所以我们要把centos7的源cp到容器里面来
cd /etc/yum.repos.d
mkdir yumbak
把里面的repo进行备份 mv CentOS-* yumbak/
在从容器外部进行cp 
docker cp CentOS7-Base.repo 镜像id:/etc/yum.repos.d/

这个时候执行
yum update 即可更新
这块要安装的东西比较多,所以要等待一会

# 注意 这个时候容器的/etc/yum.repos.d/下会重新出现我们备份的东西
我们把他们删除即可

yum makecache fast
yum install -y bc

echo "scale=5000;4*a(1)"|bc -l -q

# 在开一个端口查看
docker stats

限制容器权重压测

docker run -itd --name=cpu-512 --cpu-shares 512 centos:7 /bin/bash
docker run -itd --name=cpu-1024 --cpu-shares 1024 centos:7 /bin/bash


cd /etc/yum.repos.d
mv Cenot-* yumbak/
docker cp CentOS7-Base.repo 镜像id:/etc/yum.repos.d/

在开一个终端 一个进cpu512 一个cpu1024
执行命令 yum install -y epel-release
yum install -y stress

yum clean all
yum makecache fast

# 压力测试
stress -c 4
stress -c 8
htop 查看 已经压满了

 stress -c 2 还可以

指定使用cpu

也可以测试某一个cpu
# cpu 从0开始,所以这是指定使用第2,4个
docker run -itd --name=cpu-chose --cpuset-cpus 1,3 centos:7 /bin/bash
docker cp CentOS7-Base.repo cpu-chose:/etc/yum.repos.d/
yum clean all 
yum makecache fast

yum install -y epel-release
yum install -y stress
stress -c 2

此外,还可以设置内存和swap的限制

# 这块要先下载镜像的
docker pull progrium/stress
docker run -itd --name=centos-7-200M -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
# -m 设置内存使用限额
# -memory-swap 设置内存+swap的使用限额
# --vm 1 启动一个内存工作线程
# --vm-bytes 每个线程分配280M内存
# 如果分配的内存大于等于设定的200M ,stress线程会报错,容器推出

限制io

#-device-write-bps 限制某个设备上的写速度
docker run -itd -v /root/:/root/ --device /dev/sda:/dev/sda --device-write-bps /dev/sda:512kb --privileged=true -u root centos /bin/bash

# 我们的系统中没有设置/dev/sda 所以暂时先不动了
time dd if=/dev/sda of=/root/123.out bs=1M count=30 oflag=direct,nonblock
# 从/dev/sda磁盘中读取数据并输出到/root/123.out文件中,共写入30块1M大小的数据块
# direct 和 nonblock 表示对数据的读写采用直接和阻塞I/O的方式
# timd用于计算该命令执行所用时间

Docker 容器内实现ssh服务

容器如何上网?

容器是如何实现上网的?
容器ip -> docker-0 虚拟网卡-> nat地址转换->物理网卡

容器最大权限-初始化

# 开始 容器最大权限
docker run -itd --name centos-ssh --privileged=true centos:7 /usr/sbin/init
cd /etc/yum.repos.d/
mkdir yumbak
mv CentOS-* yumbak/
docker cp CentOS7-Base.repo 镜像id:/etc/yum.repos.d/

yum clean all
yum makecache fast
yum install -y initscripts openssh-server openssl openssl-devel net-tools

配置、开启服务

service sshd start
ss -tan
vim /etc/ssh/sshd_config  #找到permitrootlogin yes,取消注释 保存退出,和ubuntu操作一样

echo 123456 | passwd --stdin root
exit

提交容器

docker commit centos-ssh  sshd-test/centos:7
docker rm -f centos-ssh # 删除容器

docker run -itd -p:5055:22 --privileged=true sshd-test/centos:7 /usr/sbin/init

进入容器,测试ssh

ifconfig
vim /etc/hostname 改为sshd-test

# 开启192.168.0.12 机器进行测试
talnet 192.168.0.11:5055

ssh -p 5055 root@192.168.0.11