一、問(wèn)題背景
今天在CentOS7.4.1708上實(shí)踐Docker掛載volume,一切按照正常流程進(jìn)行操作,無(wú)論是創(chuàng)建目錄、創(chuàng)建文件、還是查看、編輯主機(jī)上創(chuàng)建好的文件,都報(bào)“Permission denied”,具體如下:
[root@linuxidc ~]# docker run -it -v /data/linuxidc:/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# exit1234567
反復(fù)查閱各種資料,官方文檔都拜讀幾遍了,都沒找到原因。操作系統(tǒng)版本及docker版本信息如下:
[root@linuxidc ~]# cat /etc/RedHat-release
CentOS Linux release 7.4.1708 (Core)
[root@linuxidc ~]# docker –version
Docker version 1.13.1, build 94f4240/1.13.1
二、解決過(guò)程
1.在CentOS7.4上出現(xiàn)這個(gè)問(wèn)題,換個(gè)其他發(fā)行版是不是也出現(xiàn)一樣的問(wèn)題呢?平日里最常用的發(fā)行版莫過(guò)于CentOS和Ubuntu了,何不去Ubuntu上試試看呢?
2.說(shuō)干就干,看一下我的Ubuntu系統(tǒng)信息及Docker版本信息:
root@linuxidc:~# cat /etc/issue
Ubuntu 18.04 LTS n l
root@linuxidc:~# docker –version
Docker version 17.12.1-ce, build 7390fc6
居然比CentOS7.4的yum安裝的docker版本號(hào)高很多!不管了,先看看是否跟操作系統(tǒng)有關(guān)!
3.在本機(jī)創(chuàng)建相關(guān)目錄,并執(zhí)行docker運(yùn)行命令:
root@linuxidc:~# mkdir -p /data/volume
root@linuxidc:~# docker run -it -v /data/volume:/data/webapp ubuntu /bin/bash
4.在Ubuntu新docker掛載點(diǎn)下創(chuàng)建目錄:
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/
創(chuàng)建成功!果然跟操作系統(tǒng)有關(guān),而不是與docker版本有關(guān)!
5.分析問(wèn)題。
CentOS7.4與Ubuntu18.04Server版有啥區(qū)別呢??jī)?nèi)核?SELinux?
為啥會(huì)想到SELinux而不是首先考慮內(nèi)核呢?因?yàn)閮?nèi)核問(wèn)題解決起來(lái)比較麻煩,這兩個(gè)發(fā)行版的內(nèi)核版本相差較大,SELinux經(jīng)常會(huì)成為一切問(wèn)題的罪魁禍?zhǔn)祝∵€有,剛剛ls的時(shí)候沒看到Ubuntu發(fā)行版權(quán)限列末尾的點(diǎn),這個(gè)才是重點(diǎn)!來(lái)看一下CentOS的文件屬性:
[root@linuxidc data]# ll
總用量 0
drwxr-xr-x. 3 root root 18 6月 7 19:53 linuxidc
[root@ChatDevOps data]# ll -Z
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 linuxidc
[root@ChatDevOps ~]# getenforce
Enforcing
以上三種辦法都核實(shí)了一下,SELinux確實(shí)是開啟的。
6.關(guān)閉SELinux看一下:
[root@linuxidc data]# sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config
[root@linuxidc data]# reboot
[root@linuxidc ~]# docker run -it –rm -v /data/linuxidc:/data/chatdevops:rw ubuntu /bin/bash
root@816e6beff208:/data/linuxidc# mkdir test
root@816e6beff208:/data/linuxidc# 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/
問(wèn)題圓滿解決!
三、總結(jié)
1.遇到問(wèn)題的時(shí)候盡可能換個(gè)思路來(lái)試一下,不能總在一個(gè)地方轉(zhuǎn)圈。
2.驗(yàn)證一些問(wèn)題的時(shí)候盡量保持基礎(chǔ)軟件環(huán)境一致,不要一次性驗(yàn)證多個(gè)條件,我今天這個(gè)操作就不太嚴(yán)謹(jǐn)。
3.CentOS7.4.1708默認(rèn)是啟用SELinux的,而Ubuntu18.04 Server版則未啟用SELinux,禁用SELinux后需要重啟系統(tǒng)。
4.在CentOS7.4.1708的生產(chǎn)環(huán)境中使用docker時(shí)建議禁用SELinux,當(dāng)然如果是對(duì)SELinux十分熟悉不禁用也是無(wú)妨的!
5.目前僅對(duì)CentOS7.4進(jìn)行了驗(yàn)證,其他開啟了SELinux的發(fā)行版也需要注意此問(wèn)題。
6.在CentOS7.4及7.5中的Docker version 18.06.0-ce, build 0ffa825不存在這個(gè)問(wèn)題。