百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程文章 > 正文

Docker 容器中通过 NFS 将内存挂载成高速硬盘使用

qiyuwang 2024-11-03 16:31 14 浏览 0 评论

一 背景

这是最近项目中遇到的一个问题。在已知的部署在 docker 容器云上某个应用中,读写非常频繁,对磁盘的性能要求极高,但是又不能在同一个容器内进行高强度读写。另外,该主机内存资源有冗余,允许使用特权模式运行容器,不要求该部分数据持久性存储。

通过对问题的分析,我采取了以下解决方案:

  • 通过把内存挂载成硬盘,可以大幅度提高磁盘的性能;
  • 由于不能在同一个容器内进行读写,可以使用 NFS 来解决;
  • 允许使用特权模式,可以在容器内部挂载磁盘;
  • 不要求数据持久存储,可以把内存当作告诉磁盘来使用;
  • 在同一台主机上,可以不考虑容器的跨主机互联。

在本文中已经对涉及到公司利益部分内容进行处理,例如:文中涉及到的镜像已经移除相关应用,直接以centos7.6.1810为基础镜像。

二 环境

2.1 宿主机OS

CentOS Linux release 7.6.1810 (Core)

2.2 硬件信息

内存:256GB

2.3 宿主机的初始化配置

#!/bin/bash
UserName='gysl'
PassWord='drh123'
# Install the Docker engine. This needs to be executed on every machine.
curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo>&/dev/null
if [ $? -eq 0 ] ;
 then
 yum remove docker \
 docker-client \
 docker-client-latest \
 docker-common \
 docker-latest \
 docker-latest-logrotate \
 docker-logrotate \
 docker-selinux \
 docker-engine-selinux \
 docker-engine>&/dev/null
 yum list docker-ce --showduplicates|grep "^doc"|sort -r
 yum -y install docker-ce-18.09.3-3.el7
 rm -f /etc/yum.repos.d/docker-ce.repo
 systemctl enable docker --now && systemctl status docker
 else
 echo "Install failed! Please try again! ";
 exit 110
fi
# Modify related kernel parameters. 
cat>/etc/sysctl.d/docker.conf<<EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF 
sysctl -p /etc/sysctl.d/docker.conf>&/dev/null 
# Turn off and disable the firewalld. 
systemctl stop firewalld 
systemctl disable firewalld 
# Disable the SELinux. 
sed -i.bak 's/=enforcing/=disabled/' /etc/selinux/config 
# Disable the swap. 
sed -i.bak 's/^.*swap/#&/g' /etc/fstab
# Install EPEL/vim/git. 
yum -y install epel-release vim git
yum repolist
# Add a docker user.
useradd $UserName
echo $PassWord|passwd $UserName --stdin
usermod $UserName -aG docker 
# Reboot the machine. 
reboot

执行以上脚本重启服务器之后,以用户名 gysl 登录系统。

三 实施步骤

3.1 构建 NFS 服务镜像

3.1.1 准备阶段

Dockefile内容如下:

FROM centos:7.6.1810
ENV SSD='/high-speed-storage' SIZE='10m'
COPY . /
RUN yum -y install nfs-utils && \
 mkdir $SSD 
CMD [ "/bin/bash","/start.sh" ]

start.sh脚本内容如下:

#!/bin/bash
echo "$SSD *(fsid=0,rw,no_root_squash,no_subtree_check)">>/etc/exports
mount -t tmpfs -o size=$SIZE tmpfs $SSD
/usr/sbin/exportfs -r
/usr/sbin/rpcbind
/usr/sbin/rpc.nfsd
/usr/sbin/rpc.mountd
/usr/sbin/rpc.rquotad
while true;
 do
 sleep 6000;
 done

3.1.2 构建阶段

新建一个目录,将上文中的 Dokcerfile 与 start.sh 放到该目录。

[gysl@gysl-dev ~]$ mkdir nfs
[gysl@gysl-dev ~]$ cd nfs
[gysl@gysl-dev nfs]$ docker build -t nfs:v1.0 .

3.1.3 启动 NFS 服务容器

启动容器内的 NFS 服务,命令如下:

[gysl@gysl-dev nfs]$ docker run -itd --privileged --rm nfs:v1.0
953dd0cf03e024447ba3a7f1be6dce6217226b25c13ffa2b9967941c96b73f4e

3.1.4 记下 NFS 服务容器的IP

[gysl@gysl-dev nfs]$ docker inspect 953|grep -w 'IPAddress'
 "IPAddress": "172.17.0.2",
 "IPAddress": "172.17.0.2",

3.2 修改应用镜像

3.2.1 在应用所在的镜像内添加 NFS 服务

修改 Dockerfile ,内容如下:

FROM centos:7.6.1810
ENV SSD='/high-speed-storage' DATA='/data'
COPY . /
RUN yum -y install nfs-utils && \
 mkdir $DATA
CMD [ "/bin/bash","/start-client.sh" ]

添加 start-client.sh 脚本,脚本内容如下:

#!/bin/bash
mount -t nfs 172.17.0.2:$SSD $DATA
while true; do sleep 6000; done

3.2.2 重新构建应用镜像

新建一个目录,把修改后的 Dockerfile 和 start-client.sh 放到同一目录,执行命令如下:

[gysl@gysl-dev ~]$ mkdir nfs-client
[gysl@gysl-dev ~]$ cd nfs-client/
[gysl@gysl-dev nfs-client]$ vi Dockerfile
[gysl@gysl-dev nfs-client]$ vi start-client.sh
[gysl@gysl-dev nfs-client]$ docker run --privileged -itd --rm nfs-client:v1.0
7e01276f49815b76dd4dc3ae3ff9a80b8d4f32814f46c4e58f7cfab0d945cebf

3.3.3 验证是否挂载成功

进入应用容器,查看是否挂载成功:

[root@7e01276f4981 /]# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 8.0G 2.6G 5.5G 32% /
tmpfs 64M 0 64M 0% /dev
tmpfs 455M 0 455M 0% /sys/fs/cgroup
/dev/mapper/centos-root 8.0G 2.6G 5.5G 32% /etc/hosts
shm 64M 0 64M 0% /dev/shm
172.17.0.2:/high-speed-storage 10M 0 10M 0% /data
[root@7e01276f4981 /]# touch /data/test

成功!问题解决!

四 总结及拓展

4.1 本案例的缺点

  • 不符合一个容器一个进程的容器运用的主流标准;
  • 数据不能持久化保存,重启容器数据会被清除;
  • 容器存在依赖性,必须先启动提供 NFS 服务的容器;
  • 适用范围狭窄;
  • 不能通过 systemd 来管理服务;
  • 生产环境中不推荐使用此方案。

4.2 拓展知识

4.2.1 把内存挂载成高速硬盘有 tmpfs 和 ramdisk 两种方案

linux下的 ramdisk 是由内核提供的,mount 命令挂载即可使用。它会被视为块设备,使用时需要格式化该文件系统。ramdisk 一旦创建就会占用固定大小的物理内存,tmpfs则是动态分配。

4.2.2 Docker 容器的互联

在同一台主机的未指定网络方案的情况下,Docker 是通过 bridge 的方式进行桥接的。如果涉及到跨主机的互联,那么可能需要使用其他方案。

4.2.3 在容器中的其他 NFS 解决方案

nfs-ganesha 也是 NFS 在容器中的一个比较流行的解决方案。

相关推荐

windows开启telnet服务,检测远程服务端口是否可以连通

本文介绍windwos开启telnet服务,telnet服务一般可以用于检测远程主机的某个端口服务是否可以连通,在日常的工作中,我们经常会遇到在本地的windows检测远程服务端口是否可以连通。win...

仅在Web登录新华三交换机条件下启用设备Telnet登录方式

概述Web登录新华三交换机可以在“网络-服务”页面中启用设备Telnet服务或SSH服务,也可以在“设备-管理员”设置管理员用户的可用服务,然而,在设备Web页面中,无法设置lineVTY用户线【l...

思科交换机,路由器如何关闭telnet 开启ssh服务

SSH为建立在应用层基础上的安全协议。SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。今天我们就来说说思科交换机,路...

智能化弱电行业常用的DOS命令,掌握了你也能成为...

前言在做智能化弱电项目时,前端摄像头设备安装结束后,我们会对网络摄像头进行调试,调试过程中会遇到前端摄像头没有图像或者图像出来了画面卡顿的现象。我们会采用ping命令来测试网络的连通性和网络承载能力。...

「干货」eNSP模拟器之配置Telnet登录

配置说明:配置Telnet,使R2(模拟PC)通过SW1登录到R1进行管理和配置。操作步骤:system-view##进入系统视图[Huawei]sysnameR1##改名为R1[R1]int...

win11开启telnet服务怎么操作 win11打开telent指令是什么

telnet服务是我们在进行远程连接的时候,必须要打开的一项功能。但是有不少用户们不清楚在windows11系统中怎么开启telnet服务。今天小编就使用详细的图文教程,来给大家说明一下打开telen...

华三(H3C)交换机Telnet的远程登陆

一,配置交换机管理IP[SW1]vlan20//创建管理vlan[SW1]interfacevlan20//进入vlan接口[SW1-Vlanif20]ipaddress192.168....

win10 telnet命令怎么查看端口是否打开

可能大家也会遇到这个问题,win10telnet命令查看端口是否打开的步骤是什么?具体方法如下:1、键盘输入快捷键WIN+R,打开运行窗口。2、输入cmd,点击确定按钮。3、弹出cmd命令行窗...

Windows 7如何打开Telnet功能(win7系统打开telnet)

Windows7默认安装后是没有开启telnet客户端功能的,例如,我们在开始菜单中输入cmd,然后使用telnet命令,会弹出下图提示:‘telnet’不是内部或外部命令,也不是可运行程序或批处理文...

为锐捷路由器交换机开启web和telnet,实现轻松管理

笔者上一篇文章写了关于锐捷二层交换机配置教程,那么接下来讲一下锐捷的路由交换设备配置web、telnet技巧。同样,今天的教程也是基于命令行,比较简单,适合新手小白进行学习。准备工作配置前准备:con...

一文学会telnet命令的用途和使用方法

Telnet是一个古老的远程登录协议,可以让本地计算机获得远程计算机的工作能力。它采用了TCP的可靠连接方式,可以连接任何网络互通的远程计算机。不过由于它采用了明文传输方式,存在安全风险,目前已经很少...

Telnet命令是什么?如何使用?(telnet命令在哪里开启)

telnet命令是一个常用的远程登陆工具,使用它,我们可以快捷地登陆远程服务器进行操作。那么如何使用telnet命令呢?首先,我们需要打开telnet功能,任何电脑默认是关闭此功能的,开启方式如下:打...

win11系统如何开启telnet服务(拷贝版本)

  我们要知道,Telnet协议是Internet远程登陆服务的标准协议,可以使用户在本地计算机上完成远程主机的工作,不过对于一些刚接触win11中文版系统的用户来说,可能还不知道telnet服务在哪...

如何开启telnet客户端(如何开启telnet服务)

Telnet协议是TCP/IP协议家族中的一员,是Internet远程登陆服务的标准协议和主要方式,Telnet是常用的远程控制Web服务器的方法。工作中经常用到telnet客户端,但在windows...

Telnet 是什么,如何启用它?(telnet有什么用)

对于Internet等TCP/IP网络,Telnet是一个终端仿真程序。Telnet软件在您的系统上运行并将您的个人计算机链接到网络服务器。它将所有数据转换为纯文本这一事实被认为是易受...

取消回复欢迎 发表评论: