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

声明:本文乃“运维家”原创,转载请注明出处,更多内容请关注公众号“运维家”。

主旨

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

环境

linux环境docker环境

文件共享

在docker使用过程中,我们会遇到将日志或者数据放置到宿主机的情况,下面我们看下如何进行配置:

语法:  -v 宿主机目录:容器目录实例:[yunweijia@localhost ~]$ sudo docker imagesREPOSITORY   TAG       IMAGE ID       CREATED        SIZEyunweijia    jenkins   976d65da21b9   2 days ago     874MByunweijia    python3   31255eafafc3   2 days ago     662MBnginx        latest    c316d5a335a5   2 weeks ago    142MBcentos       7         eeb6ee3f44bd   5 months ago   204MB[yunweijia@localhost ~]$ mkdir -pv docker/logsmkdir: 已创建目录 "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 nginx4e9a30da52b3de7daab70b667b6c3929a1ab3be726e5cf3bf4d4ff6e69e5245c[yunweijia@localhost logs]$

使用浏览器访问几次nginx:

再看下这个目录下的内容:

[yunweijia@localhost logs]$ lsaccess.log  error.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]$ lsaccess.log  error.log[yunweijia@localhost logs]$ rm -f access.log [yunweijia@localhost logs]$ lserror.log[yunweijia@localhost logs]$ [yunweijia@localhost logs]$ sudo docker psCONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                               NAMES4e9a30da52b3   nginx     "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   mystifying_bartik[yunweijia@localhost logs]$ sudo docker exec -it 4e9a /bin/bashroot@4e9a30da52b3:/# cd /var/log/nginx/root@4e9a30da52b3:/var/log/nginx# lserror.logroot@4e9a30da52b3:/var/log/nginx# exitexit[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 pathlsblk: dm-1: failed to get device pathlsblk: dm-0: failed to get device pathlsblk: dm-1: failed to get device pathNAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTsda      8:0    0   20G  0 disk |-sda1   8:1    0    1G  0 part `-sda2   8:2    0   19G  0 part sr0     11:0    1  4.2G  0 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 pathlsblk: dm-1: failed to get device pathlsblk: dm-0: failed to get device pathlsblk: dm-1: failed to get device pathNAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTsda      8:0    0   20G  0 disk |-sda1   8:1    0    1G  0 part `-sda2   8:2    0   19G  0 part sr0     11:0    1  4.2G  0 rom  [root@8a263617b20e /]# mkdir /123/[root@8a263617b20e /]# mount /dev/sda1 /123/[root@8a263617b20e /]# df -hFilesystem               Size  Used Avail Use% Mounted onoverlay                   17G   11G  6.5G  62% /tmpfs                     64M     0   64M   0% /devtmpfs                    1.9G     0  1.9G   0% /sys/fs/cgroupshm                       64M     0   64M   0% /dev/shm/dev/mapper/centos-root   17G   11G  6.5G  62% /etc/hosts/dev/sda1               1014M  170M  845M  17% /123[root@8a263617b20e /]# exitexit[yunweijia@localhost logs]$ 

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

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

本文使用 文章同步助手 同步

你可能感兴趣的:(10-docker系列-docker文件共享和特权模式)