10-docker系列-docker文件共享和特权模式

笛里谁知壮士心,沙头空照征人骨。这篇文章主要讲述10-docker系列-docker文件共享和特权模式相关的知识,希望能为你提供帮助。
声明:本文乃“运维家”原创,转载请注明出处,更多内容请关注公众号“运维家”。



主旨
docker容器使用过程中,经常会有将日志或者数据放到宿主机上,亦或者配置文件读取宿主机的,别的都使用docker容器里面的,这种情况下我们该如何配置呢?难不成每次都重新打镜像?而且你是不是还会发现容器里面明明就是root用户,咋执行一些命令还提示我没有权限呢?咋滴,还有比root用户权限更大的用户嘛?本文就是为了解决这种问题的。


环境


linux环境
docker环境



文件共享
在docker使用过程中,我们会遇到将日志或者数据放置到宿主机的情况,下面我们看下如何进行配置:
语法:
-v 宿主机目录:容器目录
实例:
[yunweijia@localhost ~]$ sudo docker images
REPOSITORYTAGIMAGE IDCREATEDSIZE
yunweijiajenkins976d65da21b92 days ago874MB
yunweijiapython331255eafafc32 days ago662MB
nginxlatestc316d5a335a52 weeks ago142MB
centos7eeb6ee3f44bd5 months ago204MB
[yunweijia@localhost ~]$ mkdir -pv docker/logs
mkdir: 已创建目录 "docker/logs"
[yunweijia@localhost ~]$ cd docker/logs/
[yunweijia@localhost logs]$ ls# 可以看到这个时候这个目录下是空的
[yunweijia@localhost logs]$ sudo docker run -d -p 80:80 -v /home/yunweijia/docker/logs:/var/log/nginx nginx
4e9a30da52b3de7daab70b667b6c3929a1ab3be726e5cf3bf4d4ff6e69e5245c
[yunweijia@localhost logs]$



使用浏览器访问几次nginx:



再看下这个目录下的内容:
[yunweijia@localhost logs]$ ls
access.logerror.log
[yunweijia@localhost logs]$ tail access.log
192.168.112.1 - - [16/Feb/2022:02:32:18 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/98.0.4758.102 Safari/537.36" "-"
[yunweijia@localhost logs]$



以上就是我们将宿主机目录和容器目录共享了,文件只保留在宿主机上了,容器中看到的也是这个目录下的文件,即,如果删除宿主机的文件,容器中也不存在了,如下:
[yunweijia@localhost logs]$ ls
access.logerror.log
[yunweijia@localhost logs]$ rm -f access.log
[yunweijia@localhost logs]$ ls
error.log
[yunweijia@localhost logs]$
[yunweijia@localhost logs]$ sudo docker ps
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
4e9a30da52b3nginx"/docker-entrypoint.…"5 minutes agoUp 5 minutes0.0.0.0:80-> 80/tcp, :::80-> 80/tcpmystifying_bartik
[yunweijia@localhost logs]$ sudo docker exec -it 4e9a /bin/bash
root@4e9a30da52b3:/# cd /var/log/nginx/
root@4e9a30da52b3:/var/log/nginx# ls
error.log
root@4e9a30da52b3:/var/log/nginx# exit
exit
[yunweijia@localhost logs]$



特权模式
使用docker容器的时候是不是发现有些命令,比如mount命令,执行的时候提示你没有权限,如下:
[yunweijia@localhost logs]$ sudo docker run -it centos:7 /bin/bash
[root@0133c4cbce0c /]#
[root@0133c4cbce0c /]# lsblk
lsblk: dm-0: failed to get device path
lsblk: dm-1: failed to get device path
lsblk: dm-0: failed to get device path
lsblk: dm-1: failed to get device path
NAMEMAJ:MIN RMSIZE RO TYPE MOUNTPOINT
sda8:0020G0 disk
|-sda18:101G0 part
`-sda28:2019G0 part
sr011:014.2G0 rom
[root@0133c4cbce0c /]# mkdir /123
[root@0133c4cbce0c /]# mount /dev/sda1 /123/
mount: permission denied
[root@0133c4cbce0c /]#



原来,docker里面的root用户,默认就是一个普通用户的权限,如果你想真正拥有root权限,那么你就需要在启动的时候添加如下参数:
语法:
--privileged=true
实例:
[yunweijia@localhost logs]$ sudo docker run -it --privileged=true centos:7 /bin/bash
[root@8a263617b20e /]# lsblk
lsblk: dm-0: failed to get device path
lsblk: dm-1: failed to get device path
lsblk: dm-0: failed to get device path
lsblk: dm-1: failed to get device path
NAMEMAJ:MIN RMSIZE RO TYPE MOUNTPOINT
sda8:0020G0 disk
|-sda18:101G0 part
`-sda28:2019G0 part
sr011:014.2G0 rom
[root@8a263617b20e /]# mkdir /123/
[root@8a263617b20e /]# mount /dev/sda1 /123/
[root@8a263617b20e /]# df -h
FilesystemSizeUsed Avail Use% Mounted on
overlay17G11G6.5G62% /
tmpfs64M064M0% /dev
tmpfs1.9G01.9G0% /sys/fs/cgroup
shm64M064M0% /dev/shm
/dev/mapper/centos-root17G11G6.5G62% /etc/hosts
/dev/sda11014M170M845M17% /123
[root@8a263617b20e /]# exit
exit
[yunweijia@localhost logs]$



当然了,不仅仅是只有mount命令这样,其他命令肯定也有类似的情况,你只要记住,只要是在docker容器中报错没有权限(permission denied),你就需要用特权模式来启动了,提升你的root用户获取真正的root权限即可解决。


【10-docker系列-docker文件共享和特权模式】至此,本文的文件共享和特权模式完毕,下来我们介绍下compose的相关操作。

    推荐阅读