CentOS7.4中Docker以rw方式掛載volume報Permission denied問題

2021-01-04 GeekDevOps

一、問題背景

今天在CentOS7.4.1708上實踐Docker掛載volume,一切按照正常流程進行操作,無論是創建目錄、創建文件、還是查看、編輯主機上創建好的文件,都報"Permission denied",具體如下:

[root@ChatDevOps ~]# docker run -it -v /data/chatdevops:/data/webapp:rw ubuntu /bin/bash

root@4b92ff9fbced:/data/webapp# mkdir test

mkdir: cannot create directory 'test': Permission denied

root@4b92ff9fbced:/# cd /data/webapp/

root@4b92ff9fbced:/data/webapp# ll

ls: cannot open directory '.': Permission denied

root@4b92ff9fbced:/data/webapp# exit

反覆查閱各種資料,官方文檔都拜讀幾遍了,都沒找到原因。作業系統版本及docker版本信息如下:

[root@ChatDevOps ~]# cat /etc/redhat-release

CentOS Linux release 7.4.1708 (Core)

[root@ChatDevOps ~]# docker --version

Docker version 1.13.1, build 94f4240/1.13.1

二、解決過程

1.在CentOS7.4上出現這個問題,換個其他發行版是不是也出現一樣的問題呢?平日裡最常用的發行版莫過於CentOS和Ubuntu了,何不去Ubuntu上試試看呢? 2.說幹就幹,看一下我的Ubuntu系統信息及Docker版本信息:

root@chatdevops:~# cat /etc/issue

Ubuntu 18.04 LTS \n \l

root@chatdevops:~# docker --version

Docker version 17.12.1-ce, build 7390fc6

居然比CentOS7.4的yum安裝的docker版本號高很多!不管了,先看看是否跟作業系統有關!

3.在本機創建相關目錄,並執行docker運行命令:

root@chatdevops:~# mkdir -p /data/volume

root@chatdevops:~# docker run -it -v /data/volume:/data/webapp ubuntu /bin/bash

4.在Ubuntu新docker掛載點下創建目錄:

root@84bf1bb983ac:/data/webapp# mkdir test

root@84bf1bb983ac:/data/webapp# ll

total 12

drwxr-xr-x 3 root root 4096 Jun 7 11:37 ./

drwxr-xr-x 3 root root 4096 Jun 7 11:37 ../

drwxr-xr-x 2 root root 4096 Jun 7 11:37 test/

創建成功!果然跟作業系統有關,而不是與docker版本有關!

5.分析問題。

CentOS7.4與Ubuntu18.04Server版有啥區別呢?內核?SELinux?

為啥會想到SELinux而不是首先考慮內核呢?因為內核問題解決起來比較麻煩,這兩個發行版的內核版本相差較大,SELinux經常會成為一切問題的罪魁禍首!還有,剛剛ls的時候沒看到Ubuntu發行版權限列末尾的點,這個才是重點!來看一下CentOS的文件屬性:

[root@ChatDevOps data]# ll

總用量 0

drwxr-xr-x. 3 root root 18 6月 7 19:53 chatdevops

[root@ChatDevOps data]# ll -Z

drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 chatdevops

[root@ChatDevOps ~]# getenforce

Enforcing

以上三種辦法都核實了一下,SELinux確實是開啟的。

6.關閉SELinux看一下:

[root@ChatDevOps data]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

[root@ChatDevOps data]# reboot

[root@ChatDevOps ~]# docker run -it --rm -v /data/chatdevops:/data/chatdevops:rw ubuntu /bin/bash

root@816e6beff208:/data/chatdevops# mkdir test

root@816e6beff208:/data/chatdevops# ll

total 0

drwxr-xr-x. 3 root root 18 Jun 7 11:53 ./

drwxr-xr-x 3 root root 24 Jun 7 11:52 ../

drwxr-xr-x 2 root root 6 Jun 7 11:53 test/

問題圓滿解決!

三、總結

1.遇到問題的時候儘可能換個思路來試一下,不能總在一個地方轉圈。

2.驗證一些問題的時候儘量保持基礎軟體環境一致,不要一次性驗證多個條件,我今天這個操作就不太嚴謹。

3.CentOS7.4.1708默認是啟用SELinux的,而Ubuntu18.04 Server版則未啟用SELinux,禁用SELinux後需要重啟系統。

4.在CentOS7.4.1708的生產環境中使用docker時建議禁用SELinux,當然如果是對SELinux十分熟悉不禁用也是無妨的!

5.目前僅對CentOS7.4進行了驗證,其他開啟了SELinux的發行版也需要注意此問題。

相關焦點

  • 關於Docker目錄掛載的總結
    docker容器啟動的時候,如果要掛載宿主機的一個目錄,可以用-v參數指定。譬如我要啟動一個centos容器,宿主機的/test目錄要給容器的/soft目錄掛載,可通過以下方式指定:docker run -it -v /test:/soft centos /bin/bash這樣在容器啟動後,容器內會自動創建/soft的目錄。
  • Centos 7.2 系統下安裝部署Docker Swarm
    -1.el7.centos dockerrepodocker-engine.x86_64 1.8.3-1.el7.centos dockerrepodocker-engine.x86_64 1.8.2-1.el7.centos dockerrepodocker-engine.x86
  • 詳解Docker 中 Image、Container 與 Volume 的遷移
    $ docker run --rm -d --name test test-img tail -f /dev/nullee29cb63bb2d3ed8ac890789ba80c4fe4078b9d5343a8952b6217d64b4dcbe23  $ docker exec test ls -hl proof-rw-r--r-- 1 root root
  • DockerImageContainer Volume 遷移
    $ docker run --rm -d --name test test-img tail -f /dev/nullee29cb63bb2d3ed8ac890789ba80c4fe4078b9d5343a8952b6217d64b4dcbe23$ docker exec test ls -hl proof-rw-r
  • 巧用Docker Volume:數據備份的新潮流!
    使用docker volume 作為資料庫數據備份的新方式。容器化的時代確實來了,有狀態的資料庫容器、無狀態的應用容器,在docker化的世界裡爭相鬥豔!你可以保留傳統的操作方式、運維模式,但請不要拒絕任何能提升生產力,解放雙手的終極信仰!
  • Docker 數據卷
    首先 docker 對於數據管理有兩種方式,數據卷:Data Volumes,把容器中的數據映射到宿主機上;數據卷容器:Data Volume Containers,創建一個容器來維護數據卷;這篇文章我們將介紹一下
  • IT工程師都需要掌握的容器技術之Docker存儲管理
    針對上述問題,Docker 提供了四種不同的方式將數據從 Docker 主機直接掛載到容器中,分別為卷(volumes),綁定掛載(bind mounts),臨時文件系統(tmpfs)及命名通道(named pipe),這四種方式的named pipe是windows系統獨有的(因為實際工作中容器大多都是部署在linux系統上的,所以本篇文章我們主要介紹前三種掛載方式)。
  • 面向初學者的DOCKER快速入門指南
    (LINUX)yum源:https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo為了速度可以替換文件中的url
  • 使用docker數據卷對容器數據持久化
    volume是用於對docker容器生成和使用的數據持久化的首選機制。如果您的容器生成非持久狀態數據,請考慮使用 tmpfs掛載以避免將數據永久存儲在任何地方,並通過避免寫入容器的可寫層來提高容器的性能。
  • 使用數據卷管理數據 | Docker 系列
    當然不需要,Docker 非常貼心的提供了數據持久化方案,叫數據卷 volume。使用 volume 有四大優勢:volume 可以在容器之間以及容器和主機之間共享和重用。volume 在某一掛載的位置被修改,所有使用該 volume 的地方都會同時更新。volume 的更新不會影響鏡像。
  • 如何通過Volume實現Docker容器間共享同一份數據
    概述:在docker容器上可能部署多臺容器,這些容器的數據文件又都是一樣的,如果其中一個文件更改,如果不採用共享數據的方式,那基本每一個容器的文件都要改一次,工作量非常大,所以,實現容器間的數據共享成了必須要做的事情
  • Docker 日誌管理最佳實踐
    當日誌量比較大的時候,我們使用 docker logs 來查看日誌,會對 docker daemon 造成比較大的壓力,容器導致容器創建慢等一系列問題。09:41 container.log.2.gz-rw-r-----. 1 root root 3805668 May 16 09:41 container.log.3.gz-rw-r-----. 1 root root 3744104 May 16 09:41 container.log.4.gz那麼當超過了
  • Linux或macOS利用Dockerfile構建鏡像測試
    只要報錯就會退出。5.6s => [1/9] FROM docker.io/library/centos@sha256:76d24f3ba3317fa945743bb3746 161.6s => => resolve docker.io/library/centos@sha256:76d24f3ba3317fa945743bb3746fb 0.0s => => sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f96192249
  • 詳解Docker中鏡像容器卷的遷移
    $ docker run --rm -d --name test test-img tail -f /dev/nullee29cb63bb2d3ed8ac890789ba80c4fe4078b9d5343a8952b6217d64b4dcbe23$ docker
  • 製作docker鏡像centos專題及常見問題 - CSDN
    一、製作docker鏡像a.拉取centos鏡像 docker pull centosc.啟動centos容器,將jdk壓縮包放到容器中    交互式命令啟動:docker run --name testimage -i -t centos /bin/bash
  • EACCES: permission denied,mkdir … npm install 安裝依賴問題解決
    > cwebp-bin@4.0.0 postinstall /home/hugegraph/my-hugegraph-studio/studio-ui/node_modules/cwebp-bin> node lib/install.js ⚠ EACCES: permission denied, mkdir '/home/hugegraph/my-hugegraph-studio
  • Docker容器中鏡像、容器、數據卷遷移實踐
    $ docker run --rm -d --name test test-img tail -f /dev/nullee29cb63bb2d3ed8ac890789ba80c4fe4078b9d5343a8952b6217d64b4dcbe23$ docker exec
  • Docker 最常用的鏡像命令和容器命令
    容器與宿主機之間的數據卷屬於引用的關係,數據卷是從外界掛載到容器內部中的,所以可以脫離容器的生命周期而獨立存在,正是由於數據卷的生命周期並不等同於容器的生命周期,在容器退出或者刪除以後,數據卷仍然不會受到影響,數據卷的生命周期會一直持續到沒有容器使用它為止。
  • permission denied (publickey)問題的解決方法
    使用ssh key這種方式進行clone ,pull github上面的項目,使用 git clone或者git pull origin master出現permission denied (publickey),原因是因為ssh key過期失效或者沒有ssh key。
  • docker-製作自己的基礎centos鏡像
    前言在使用docker的時候,有時候很害怕自己從別人那邊pull下來的鏡像是不是有問題?是否有什麼後門之類的。那就自己來做基礎鏡像吧。本地鏡像0x00 利用虛擬機製作鏡像,在虛擬機裡面安裝好自己需要打包的作業系統,由於被打包的系統需要在關閉的情況下才能被完整精簡打包,可以利用光碟的急救模式,然後掛載上系統盤,然後刪除掉鏡像不需要的文件(比如:內核文件、初始化引導文件、不需要的幫助文檔等等),然後就可以開始打包了。