基础设施

Docker的安装和使用技巧使Docker开销降低性能基准

 

什么是Docker及其用法

Docker是一个像流浪者一样的虚拟环境,但是存在以下差异。
-底层内核在运行中的容器(=虚拟环境)之间共享,并且其开销远远小于Vagrant,后者对于每个虚拟环境和必需的资源都需要操作系统
-通过在文件中描述系统设置,可以确保同一系统的可重复性
-已经创建,共享和分发了许多应用程序的许多docker映像,就像编程语言库一样

您必须谨慎地将Docker用于生产环境,但它绝对适合定义和共享开发与测试环境的目的。

由于Docker开销而导致性能下降的基准

尽管docker被认为比无业游民的开销要小,但它无法避免开销(使用额外的资源)。

问题是性能下降多少?
这是基准测试的结果。

[基准条件]
使用的服务器: Linode 专用实例,2CPU(AMD EPYC 7501 32 -Core Processor)+内存4GB
基准:Unixbench(什么是Unixbench?
比较目标:
1)没有码头工人
2)码头工人
3)带有选项的Docker可以降低性能的安全性(–security-opt seccomp = unconfined)

总CPU得分17351255(-28%)1331(-23%)
1 CPU得分1124822(-27%)895(-20%)
Dhrystone 2使用寄存器变量353634853542
双精度磨刀石164616331647
Execl吞吐量133213001324
文件复制1024个bufsize 2000个maxblocks250313291369
文件复制256个bufsize 500个maxblocks1646841863
文件复制4096个bufsize 8000个maxblocks409125302810
管道吞吐量124311621249
基于管道的上下文切换750594625
流程创建12916331016
Shell脚本(并发1个)200711131142
Shell脚本(并发8个)195310391071
系统调用开销12018931197

因此,如果您使应用程序在docker上运行而不是在没有docker的情况下运行,则必须期望性能下降约25%。
特别
–文件IO
–执行Shell脚本,通常代表CPU和OS的性能
性能下降更多。

看到结果后,如果我们关闭Docker的安全性,则可以期待一定程度的性能改进,而并不是说进程创建可以带来更多的改进。

而且,如果您使用Docker,则必须注意Docker容器和映像使用了多少磁盘空间。

如何安装Docker

如果您要安装最新版本的官方docker,而不是Linux发行商的最新版本,则可以这样做。

对于CentOS 8或更高版本

sudo dnf remove docker docker-common docker-selinux docker-engine;
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo;
sudo dnf install docker-ce;

如果您遇到这样的错误消息,
您应该从下载最新的containerd.io
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.13-3.2.el7.x86_64.rpm;
dnf remove containerd.io;
dnf install -y containerd.io-1.2.13-3.2.el7.x86_64.rpm;
dnf install -y docker-ce docker-ce-cli;

对于CentOS 7或更早的版本

sudo yum remove docker docker-common docker-selinux docker-engine
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce

运行Docker Daemon

sudo systemctl enable docker.service;
sudo systemctl start docker.service

运行hello world docker并检查操作

docker run hello-world

如果您具有root用户特权,则可以使其运行,但是如果您是一般用户,则可能会遇到以下错误消息。

docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/create: dial unix/var/run/docker.sock: connect: permission denied.

在这种情况下,只能由属于docker组的用户执行docker。
将用户添加到Docker组以解决问题。

sudo gpasswd -a $USERID docker;

请注意,即使将用户添加到组中,您也必须注销并重新登录。

然后输入

docker run hello-world

并检查结果是否正确显示。

Docker常用的命令

从Dockerfile创建Docker映像

docker build --rm -t $IMAGENAME;

列出正在运行的Docker进程

docker ps;

在指定的Docker容器中执行命令

docker exec -i -t $container id $something $command

停止所有正在运行的Docker进程

docker kill $(docker ps -q);

删除Docker映像

docker rmi $IMAGE;

删除所有Docker映像

docker images -aq | xargs docker rmi;

删除所有停止的Docker容器

docker rm $(docker ps -a -q);

将docker-compose作为守护程序运行(=始终运行进程)

docker-compose up -d

停止docker-compose启动的进程

docker-compose stop