中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 服務器 > 
  • 云計算 > 
  • 在以 CentOS7.6 為基礎鏡像的 Docker 容器中通過 NFS 將內存掛載成高速硬盤使用

在以 CentOS7.6 為基礎鏡像的 Docker 容器中通過 NFS 將內存掛載成高速硬盤使用

發布時間:2020-08-07 19:25:05 來源:網絡 閱讀:1061 作者:耕耘實錄 欄目:云計算

在以 CentOS7.6 為基礎鏡像的 Docker 容器中通過 NFS 將內存掛載成高速硬盤使用

一 背景

這是最近項目中遇到的一個問題。在已知的部署在 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='drh223'
# 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 在容器中的一個比較流行的解決方案。更多資料可參閱:<https://access.redhat.com/documentation/en-US/Red_Hat_Storage/2.1/html/Administration_Guide/sect-NFS_Ganesha.html>

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

曲阜市| 融水| 云霄县| 塔城市| 霸州市| 遵化市| 略阳县| 民权县| 象山县| 连山| 绵阳市| 乌审旗| 榆林市| 浑源县| 普安县| 武安市| 旌德县| 萍乡市| 鹰潭市| 钟祥市| 宣汉县| 钟山县| 阆中市| 喜德县| 乐山市| 锦屏县| 亳州市| 正蓝旗| 凉城县| 保山市| 绵阳市| 白山市| 榆林市| 东丰县| 米林县| 西华县| 云林县| 怀化市| 育儿| 沙洋县| 中宁县|