Dockerfile文件中CMD和EMTRYPOINT的区别

第一种:数组格式 运行一个可执行的文件并提供参数
[root@foundation40 docker]# mkdir test [root@foundation40 docker]# cd test/
[root@foundation40 test]# vim Dockerfile FROM rhel7 CMD echo "hello world!"
[root@foundation40 test]# docker build -t rhel7:v4 . [root@foundation40 test]#
docker run --rm rhel7:v4 hello world!

[root@foundation40 test]# docker run --rm rhel7:v4 echo westos [root
@foundation40 test]# docker rmi rhel7:v4


第二种:为ENTRYPOINT指定参数
[root@foundation40 test]# vim Dockerfile FROM rhel7 ENTRYPOINT echo "hello
world!" [root@foundation40 test]# docker build -t rhel7:v4 . [root@foundation40
test]# docker run --rm rhel7:v4 [root@foundation40 test]# docker run --rm
rhel7:v4 echo westos [root@foundation40 test]# docker rmi rhel7:v4 #删除v4


第三种:以”/bin/sh -c”的方法执行的命令
[root@foundation40 test]# vim Dockerfile FROM rhel7 ENV name westos
ENTRYPOINT ["/bin/sh","-c","echo $name"] [root@foundation40 test]# docker build
-t rhel7:v4 . [root@foundation40 test]# docker run --rm rhel7:v4


对容器CPU资源进行限制

默认情况下容器可以使用的主机 CPU 资源是不受限制的。和内存资源的使用一样,如果不对容器可以使用的 CPU 资源进行限制,一旦发生容器内程序异常使用
CPU 的情况,很可能把整个主机的 CPU 资源耗尽,从而导致更大的灾难。

1.设置允许容器占用的内存大小和swap分区大小
get stress.tar [root@foundation40 ~]# docker load -i stress.tar [
root@foundation40 ~]# docker run --rm -it --name vm1 -m 100M --memory-swap 100M
stress --vm 1 --vm-bytes 100M #
设置提供和给vm1的内存大小为100M,内存加交换分区的大小为100M,则能处理的最大压测也是100M
2.限制容器占用的cpu
[root@foundation40 ~]# lscpu #查看cpu个数 [root@foundation40 ~]# docker run --rm
-it --cpu-shares 512 stress -c 4 [root@foundation40 ~]# docker run --rm -it
--cpu-shares 1024 stress -c 4
3.监控查看:体现优先级,1024的优先级较高
[root@foundation40 ~]# top


4.按每秒写入块设备的数据量设定上限
[root@foundation40 ~]# docker run --rm -it --device-write-bps /dev/sda:10M
ubuntu root@ec8852faa891:~# time dd if=/dev/zero of=testfile bs=1M count=20
oflag=direct


docker pause用法
[root@foundation40 ~]# docker run -it --name vm1 ubuntu root@6a589ed56381:/#
root@6a589ed56381:/# 按ctrl+pq打入后台 [root@foundation40 ~]# docker container pause
vm1 #暂停 [root@foundation40 ~]# docker ps [root@foundation40 ~]# docker
container unpause vm1 #开启

将vm1暂停后可以依旧可以看到IP,但如果将vm1 stop后,将看不到一切信息

cgroup操作

cgroup功能:
1.限制进程组可以使用的资源数量(Resource limiting )。比如:memory子系统可以为进程组设定一个memory
使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发OOM(out ofmemory)。 2.进程组的优先级控制(Prioritization
)。比如:可以使用cpu子系统为某个进程组分配特定cpu share。3.记录进程组使用的资源数量(Accounting
)。比如:可以使用cpuacct子系统记录某个进程组使用的cpu时间4.进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的
namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。 5.
进程组控制(Control)。比如:使用freezer子系统可以将进程组挂起和恢复。
对内存进行限制

1.实验环境: RHEL6.5 172.25.40.1 server1
2.Cgroup的安装
[root@server1 ~]# yum install -y libcgroup.x86_64 [root@server1 ~]# cd /cgroup/
[root@server1 cgroup]# /etc/init.d/cgconfig start [root@server1 cgroup]# ls
blkio cpu cpuacct cpuset devices freezer memory net_cls [root@server1 memory]#
vim /etc/cgconfig.conf 添加:28 group x1 { 29 memory { 30 memory.limit_in_bytes = ;
31 } 32 } [root@server1 memory]# free -m #查看内存情况

[root@server1 memory]# vim /etc/cgconfig.conf memory.limit_in_bytes =
209715200; #bytes=1024*200*1024 [root@server1 memory]# cd [root@server1 ~]#
/etc/init.d/cgconfig restart [root@server1 shm]# dd if=/dev/zero of=file1 bs=1M
count=100 [root@server1 shm]# free -m

[root@server1 shm]# free -m [root@server1 shm]# dd if=/dev/zero of=file1 bs=1M
count=300 [root@server1 shm]# cgexec -g memory:x1 dd if=/dev/zero of=file1
bs=1M count=300 [root@server1 shm]# free -m

[root@server1 ~]# vim /etc/cgconfig.conf group x1 { memory { memory.limit_in
_bytes =209715200; #200*1024*1024=209715200 限200M memory.memsw.limit_in_bytes =
209715200; # 限制内存和交换分区的大小之和,即交换分区的大小为0,可以分别打开交换分区和注释交换分区来做测试 } } [root@server1
~]# /etc/init.d/cgconfig restart
3.进行压力测试
[root@server1 ~]# free -m [root@server1 ~]# rm file1 rm: remove regular file
`file1'? y [root@server1 ~]# cd /dev/shm [root@server1 shm]# cgexec -g
memory:x1 dd if=/dev/zero of=file1 bs=1M count=300


执行脚本对内存限制:

下载脚本 memapp1 memapp2 两个均为 4096 pages of memory (1个pages of memory = 4字节) 加执
行权限,现令memapp1可以执行,memapp2不可以
[root@server1 shm]# cd [root@server1 ~]# ls memapp1 memapp2 [root@server1 ~]#
chmod +x memapp* [root@server1 ~]# ./memapp1 [root@server1 ~]# yum install -y
/lib/ld-linux.so.2 [root@server1 ~]# ./memapp1 [root@server1 ~]# ./memapp2

[root@server1 ~]# vim /etc/cgconfig.conf 30 memory.limit_in_bytes = 20480000;
31 memory.memsw.limit_in_bytes = 20480000; [root@server1 ~]#
/etc/init.d/cgconfig restart [root@server1 ~]# useradd haha [root@server1 ~]#
cd /dev/shm/ [root@server1 shm]# rm -fr file1 [root@server1 shm]# vim
/etc/cgrules.conf haha:memapp1 memory x1/ haha:memapp2 memory x1/
##限制任何人在执行这两个脚本时,都遵循x1里的限制 [root@server1 shm]# /etc/init.d/cgred start [root
@server1 shm]# cd [root@server1 ~]# mv * /home/haha/ [root@server1 ~]# su - haha
[haha@server1 ~]$ ls [haha@server1 ~]$ ./memapp1 [haha@server1 ~]$ ./memapp2


限制cpu的使用

优先级区间19 ~ -20 ,19为最低优先级
1.修改配置文件,对CPU的资源进行限制
[root@server1 ~]# vim /etc/cgconfig.conf 添加: group x2 { cpu{ cpu.shares = 100;
#优先级设为100,小于默认的1024 } } [root@server1 ~]# /etc/init.d/cgconfig restart
2.占用cpu
[root@server1 ~]# cgexec -g cpu:x2 dd if=/dev/zero of=/dev/null & [1] 6897
[root@server1 ~]# cd /sys/ [root@server1 sys]# cd devices/ [root@server1
devices]# cd system/ [root@server1 system]# cd cpu/ [root@server1 cpu]# ls cpu0
cpufreq cpuidle kernel_max offline online possible present
3.进行压力测试 只有一个资源在占用cpu



IO资源限制

1.编辑配置文件,对块设备的读写速度进行限制
[root@server1 ~]# cd /cgroup/blkio/ [root@server1 blkio]# ll /dev/vda #查看块设备的信息
brw-rw----1 root disk 252, 0 Aug 21 15:01 /dev/vda [root@server1 blkio]# vim
/etc/cgconfig.conf group x3 { blkio { blkio.throttle.read_bps_device="252:0
1000000"; # 252:0是/dev/vda这个块设备的信息 } } [root@server1 blkio]# cd [root@server1 ~]
# /etc/init.d/cgconfig restart [root@server1 ~]# cgexec -g blkio:x3 dd
if=/dev/vda of=/dev/null & # 在/dev/vda上读数据,查看速度
2.进行压力测试,用监控查看io的负载情况:


限制freezer

1.编辑配置文件,允许对进程的状态进行改变
[root@server1 ~]# vim /etc/cgconfig.conf group x4 { freezer {} } [root@server1
~]# /etc/init.d/cgconfig restart [root@server1 ~]# cd /cgroup/ [root@server1
cgroup]# cd freezer/ [root@server1 freezer]# cd x4 [root@server1 x4]# ps ax 6897
pts/0 R 31:45 dd if=/dev/zero of=/dev/null [root@server1 x4]# echo 6897 > tasks
2.当我们利用截取命令之后,发现系统的CPU立即被消耗至大致百分之百
[root@server1 x4]# cat freezer.state THAWED #活跃状态  [root@server1 x4]# echo
FROZEN > freezer.state #冻结状态
3.进行压力测试,用监控查看已经没有dd的进程

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信