暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

运维家 2022-02-17
261

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


主旨

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:


      再看下这个目录下的内容:
        [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的相关操作。
              文章转载自运维家,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论