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

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

10-docker系列-docker文件共享和特权模式_第1张图片

主旨

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

环境

linux环境
docker环境

文件共享

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

语法:
  -v 宿主机目录:容器目录
实例:
[yunweijia@localhost ~]$ sudo docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
yunweijia    jenkins   976d65da21b9   2 days ago     874MB
yunweijia    python3   31255eafafc3   2 days ago     662MB
nginx        latest    c316d5a335a5   2 weeks ago    142MB
centos       7         eeb6ee3f44bd   5 months ago   204MB
[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:

10-docker系列-docker文件共享和特权模式_第2张图片

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

[yunweijia@localhost logs]$ ls
access.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]$ ls
access.log  error.log
[yunweijia@localhost logs]$ rm -f access.log 
[yunweijia@localhost logs]$ ls
error.log
[yunweijia@localhost logs]$ 
[yunweijia@localhost logs]$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                               NAMES
4e9a30da52b3   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/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
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      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 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
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      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 -h
Filesystem               Size  Used Avail Use% Mounted on
overlay                   17G   11G  6.5G  62% /
tmpfs                     64M     0   64M   0% /dev
tmpfs                    1.9G     0  1.9G   0% /sys/fs/cgroup
shm                       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 /]# exit
exit
[yunweijia@localhost logs]$ 

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

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

你可能感兴趣的:(docker,docker,容器,运维)