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

Posted 公号运维家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10-docker系列-docker文件共享和特权模式相关的知识,希望对你有一定的参考价值。

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

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


主旨

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文件共享和特权模式_3c_02


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

[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的相关操作。

以上是关于10-docker系列-docker文件共享和特权模式的主要内容,如果未能解决你的问题,请参考以下文章

您如何与部署为弹性 beanstalk 上的工作人员的 docker 容器共享特权信息?

docker数据卷备份恢复以及配置桥接网络

MongoDB系列之Docker里运行JS脚本

Docker教程-10-Docker Compose使用入门

Docker教程-10-Docker Compose使用入门

docker网络compose