Docker目錄掛載

Docker容器啟動的時候,如果要掛載宿主機的一個目錄,可以用-v參數指定。

譬如我要啟動一個centos容器,宿主機的/test目錄掛載到容器的/soft目錄,可通過以下方式指定:

# docker run -it -v /test:/soft centos /bin/bash

這樣在容器啟動后,容器內會自動創建/soft的目錄。通過這種方式,我們可以明確一點,即-v參數中,冒號":"前面的目錄是宿主機目錄,后面的目錄是容器內目錄。

貌似簡單,其實不然,下面我們來驗證一下:

一、容器目錄不可以為相對路徑

[root@localhost ~]# docker run -it -v /test:soft centos /bin/bash
invalid value "/test:soft" for flag -v: soft is not an absolute path
See 'docker run --help'.

直接報錯,提示soft不是一個絕對路徑,所謂的絕對路徑,必須以下斜線“/”開頭。

二、宿主機目錄如果不存在,則會自動生成

如果宿主機中存在/test目錄,首先刪除它

[root@localhost ~]# rm -rf /test
[root@localhost ~]# ls /
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

啟動容器

[root@localhost ~]# docker run -it -v /test:/soft centos /bin/bash
[root@a487a3ca7997 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  soft  srv  sys  tmp  usr  var

查看宿主機,發現新增了一個/test目錄

[root@localhost ~]# ls /
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var

三、宿主機的目錄如果為相對路徑呢?

這次,我們換個目錄名test1試試

# docker run -it -v test1:/soft centos /bin/bash

再到宿主機上查看是否新增了一個/test1目錄,結果沒有,是不是因為我用的是相對路徑,所以生成的test1目錄在當前目錄下,結果發現還是沒有。那容器內的/soft目錄掛載到哪里去了?通過docker inspect命令,查看容器“Mounts”那一部分,我們可以得到這個問題的答案。

復制代碼

    "Mounts": [{"Name": "test1","Source": "/var/lib/docker/volumes/test1/_data","Destination": "/soft","Driver": "local","Mode": "z","RW": true}],

復制代碼

可以看出,容器內的/soft目錄掛載的是宿主機上的/var/lib/docker/volumes/test1/_data目錄

原來,所謂的相對路徑指的是/var/lib/docker/volumes/,與宿主機的當前目錄無關。

四、如果只是-v指定一個目錄,這個又是如何對應呢?

啟動一個容器

[root@localhost ~]# docker run -it -v /test2 centos /bin/bash
[root@ea24067bc902 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  test2  tmp  usr  var

同樣使用docker inspect命令查看宿主機的掛載目錄

復制代碼

   "Mounts": [{"Name": "96256232eb74edb139d652746f0fe426e57fbacdf73376963e3acdb411b3d73a","Source": "/var/lib/docker/volumes/96256232eb74edb139d652746f0fe426e57fbacdf73376963e3acdb411b3d73a/_data","Destination": "/test2","Driver": "local","Mode": "","RW": true}],

復制代碼

可以看出,同3中的結果類似,只不過,它不是相對路徑的目錄名,而是隨機生成的一個目錄名。

五、如果在容器內修改了目錄的屬主和屬組,那么對應的掛載點是否會修改呢?

首先開啟一個容器,查看容器內/soft目錄的屬性

[root@localhost ~]# docker run -it -v /test:/soft centos /bin/bash
[root@b5ed8216401f /]# ll -d /soft/
drwxr-xr-x 2 root root 6 Sep 24 03:48 /soft/

查看宿主機內/test目錄的屬性

[root@localhost ~]# ll -d /test/
drwxr-xr-x 2 root root 6 Sep 24 11:48 /test/

在容器內新建用戶,修改/soft的屬主和屬組

[root@b5ed8216401f /]# useradd victor
[root@b5ed8216401f /]# chown -R victor.victor /soft/
[root@b5ed8216401f /]# ll -d /soft/
drwxr-xr-x 2 victor victor 6 Sep 24 03:48 /soft/

再來看看宿主機內/test目錄的屬主和屬組是否會發生變化?

[root@localhost ~]# ll -d /test/
drwxr-xr-x 2 mycat mycat 6 Sep 24 11:48 /test/

竟然變為mycat了。。。

原來,這個與UID有關系,UID,即“用戶標識號”,是一個整數,系統內部用它來標識用戶。一般情況下它與用戶名是一一對應的。

首先查看容器內victor對應的UID是多少,

[root@b5ed8216401f /]# cat /etc/passwd | grep victor
victor:x:1000:1000::/home/victor:/bin/bash

victor的UID為1000,那么宿主機內1000對應的用戶是誰呢?

[root@localhost ~]# cat /etc/passwd |grep 1000
mycat:x:1000:1000::/home/mycat:/bin/bash

可以看出,宿主機內UID 1000對應的用戶是mycat。

六、容器銷毀了,在宿主機上新建的掛載目錄是否會消失?

在這里,主要驗證兩種情況:一、指定了宿主機目錄,即?-v /test:/soft。二、沒有指定宿主機目錄,即-v /soft

第一種情況:

復制代碼

[root@localhost ~]# rm -rf /test    --首先刪除宿主機的/test目錄
[root@localhost ~]# ls /    --可以看到,宿主機上無/test目錄
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@localhost ~]# docker run -it --name=centos_test -v /test:/soft centos /bin/bash  --啟動容器,為了刪除方便,我用--name參數指定了容器的名字
[root@82ad7f3a779a /]# exit
exit
[root@localhost ~]# docker rm centos_test   --刪除容器
centos_test
[root@localhost ~]# ls /   --發現 /test目錄依舊存在
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var

復制代碼

可以看出,即便容器銷毀了,新建的掛載目錄不會消失。進一步也可驗證,如果宿主機目錄的屬主和屬組發生了變化,容器銷毀后,宿主機目錄的屬主和屬組不會恢復到掛載之前的狀態。

第二種情況,通過上面的驗證知道,如果沒有指定宿主機的目錄,則容器會在/var/lib/docker/volumes/隨機配置一個目錄,那么我們看看這種情況下的容器銷毀是否會導致相應目錄的刪除

首先啟動容器

[root@localhost ~]# docker run -it --name=centos_test -v /soft centos /bin/bash
[root@6b75579ec934 /]# exit
exit

通過docker inspect命令查看容器在宿主機上生成的掛載目錄

復制代碼

    "Mounts": [{"Name": "b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301","Source": "/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301/_data","Destination": "/soft","Driver": "local","Mode": "","RW": true}],

復制代碼

對應的是/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301/_data目錄

銷毀容器,看目錄是否存在

[root@localhost ~]# docker rm centos_test
centos_test
[root@localhost ~]# ll /var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301
total 0
drwxr-xr-x 2 root root 6 Sep 24 14:25 _data

發現該目錄依舊存在,即便重啟了docker服務,該目錄依舊存在

[root@localhost ~]# systemctl restart docker
[root@localhost ~]# ll /var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301
total 0
drwxr-xr-x 2 root root 6 Sep 24 14:25 _data

七、掛載宿主機已存在目錄后,在容器內對其進行操作,報“Permission?denied”。

可通過兩種方式解決:

1> 關閉selinux。

臨時關閉:# setenforce 0

永久關閉:修改/etc/sysconfig/selinux文件,將SELINUX的值設置為disabled。

2> 以特權方式啟動容器?

指定--privileged參數

如:# docker run -it --privileged=true?-v /test:/soft centos /bin/bash

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535342.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535342.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535342.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis主從復制原理學習

Redis主從復制原理學習總結 - 運維筆記 和Mysql主從復制的原因一樣,Redis雖然讀取寫入的速度都特別快,但是也會產生讀壓力特別大的情況。為了分擔讀壓力,Redis支持主從復制,Redis的主從結構可以采用一主多從或者級聯結構&#xff…

redis數據恢復

公司線上一個項目數據存儲采用MySQL,共分為10個庫,分布在4臺機器上,每個庫數據量約為10G,各機器均采用RAID5加速磁盤訪問; 當同時在線人數達高峰期(10w),DB磁盤IO壓力巨大&#xff0…

Redis哨兵模式(sentinel)學習總結及部署記錄(主從復制、讀寫分離、主從切換)

Redis的集群方案大致有三種:1)redis cluster集群方案;2)master/slave主從方案;3)哨兵模式來進行主從替換以及故障恢復。 一、sentinel哨兵模式介紹 Sentinel(哨兵)是用于監控redis集群中Master狀態的工具&…

Redis之Redis內存模型

Redis是目前最火爆的內存數據庫之一,通過在內存中讀寫數據,大大提高了讀寫速度,可以說Redis是實現網站高并發不可或缺的一部分。 我們使用Redis時,會接觸Redis的5種對象類型(字符串、哈希、列表、集合、有序集合&…

MySQL 數據庫誤刪除后的數據恢復操作說明

在日常運維工作中,對mysql數據庫的備份是萬分重要的,以防在數據庫表丟失或損壞情況出現,可以及時恢復數據。 線上數據庫備份場景: 每周日執行一次全量備份,然后每天下午1點執行MySQLdump增量備份. 下面對這種備份方案…

MySQL 之binlog日志說明及利用binlog日志恢復數據操作記錄

眾所周知,binlog日志對于mysql數據庫來說是十分重要的。在數據丟失的緊急情況下,我們往往會想到用binlog日志功能進行數據恢復(定時全備份binlog日志恢復增量數據部分),化險為夷! 一、簡單了解binlog MySQ…

zabbix巡檢腳本

#!/bin/bash BIN/usr/local/zabbix/binpasswort() { name$2 while read line do ipecho $line|awk -F {print $1} timeecho $line|awk -F {print $2} echo -e "${name}passport${ip}探活時間\t $time" done <$1 }for i in 100.245.160.113 100.245.160.141 1…

mysqldump備份(全量+增量)

在日常運維工作中&#xff0c;對mysql數據庫的備份是萬分重要的&#xff0c;以防在數據庫表丟失或損壞情況出現&#xff0c;可以及時恢復數據。 線上數據庫備份場景&#xff1a; 每周日執行一次全量備份&#xff0c;然后每天下午1點執行MySQLdump增量備份. 下面對這種備份方案…

查找指定日期數據所在分區數據

select a.subobject_namefrom dba_objects a join (select dbms_rowid.rowid_object(rowid) object_idfrom NEWLOG4 where TO_CHAR(autudt,YYYY-MM-DD) 2021-06-22) b on a.object_id b.object_id and object_name UPPER(NEWLOG4) group by a.subobject_name

統計內存使用率shell

#!/bin/bashdatedate "%Y-%m-%d %H:%M:%S"#顯示消耗資源內存最高的進程名firstps aux | grep -v "grep" | grep -v "USER" | sort -rn -k 4 | head -4 | awk -F {print $13} | sed -n 1pSecondps aux | grep -v "grep" | grep -v &q…

Oracle 11g系統自動收集統計信息

從Oracle Database 10g開始&#xff0c;Oracle在建庫后就默認創建了一個名為GATHER_STATS_JOB的定時任務&#xff0c;用于自動收集CBO的統計信息&#xff0c;調用DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC收集統計信息。該過程首先檢測統計信息缺失和陳舊的對象。然后確定優先…

Redis監控指標

監控指標 ?性能指標&#xff1a;Performance?內存指標: Memory?基本活動指標&#xff1a;Basic activity?持久性指標: Persistence?錯誤指標&#xff1a;Error 性能指標&#xff1a;Performance NameDescriptionlatencyRedis響應一個請求的時間instantaneous_ops_per_s…

innobackupex參數說明

1、備份&#xff1a; #常用參數     --user&#xff1a;該選項表示備份賬號。     --password&#xff1a;該選項表示備份的密碼。     --port&#xff1a;該選項表示備份數據庫的端口。     --host&#xff1a;該選項表示備份數據庫的地址。     --socket…

innobackupex遠程備份腳本

#!/bin/sh #備份主機 remote_ip10.2.142.161 Master_ip10.2.142.148 VIP103.2.132.136 #備份用戶 userroot #密碼 password123456 # 返回年月日 backup_datedate %F # 返回時分秒 backup_timedate %H-%M-%S # 返回今天是這周的第幾天 backup_week_daydate %u backup_ok0 #備份目…

MySQL管理利器 MySQL Utilities---mysqlreplicate

mysqlreplicate 工具是在兩臺服務器間設置和啟動復制。用戶提供登錄從服務器信息和連接到主的信息。也可以指定一個數據庫用于測試復制。 該工具報告條件是當主和從的存儲引擎不一樣時。如果主和從的存儲引擎不同將產生告警信息。對于Innodb存儲引擎而言&#xff0c;必需完全…

MySQL管理工具MySQL Utilities — 如何連接MySQL服務器

連接參數 連接到一個服務器&#xff0c;必須指定連接參數&#xff0c;如用戶名&#xff0c;主機名稱&#xff0c;密碼&#xff0c;端口號&#xff0c;socket。MySQL Utilities提供了三種提供這些參數的方法&#xff0c;這些方法都需要通過命令行指定。 使用.mylogin.cnf文件&…

MHA高可用

manager 組件 masterha_manger # 啟動MHA masterha_check_ssh # 檢查MHA的SSH配置狀況 masterha_check_repl # 檢查MySQL復制狀況&#xff0c;配置信息 masterha_master_monitor # 檢測master是否宕機 masterha_check_status # 檢測當…

MySQL Replication需要注意的問題

主庫意外宕機 如果沒有設置主庫的sync_binlog選項&#xff0c;就可能在奔潰前沒有將最后的幾個二進制日志事件刷新到磁盤中。備庫I/O線程因此也可一直處于讀不到尚未寫入磁盤的事件的狀態中。當主庫從新啟動時&#xff0c;備庫將重連到主庫并再次嘗試去讀該事件&#xff0c;但…

update和delete操作忘加where條件導致全表更新的處理方法

在數據庫日常維護中&#xff0c;開發人員是最讓人頭痛的&#xff0c;很多時候都會由于SQL語句寫的有問題導致服務器出問題&#xff0c;導致資源耗盡。最危險的操作就是在做DML操作的時候忘加where條件&#xff0c;導致全表更新&#xff0c;這是作為運維或者DBA的我們改如何處理…

Innodb結構

從MySQL5.5版本開始默認使用InnoDB作為引擎&#xff0c;它擅長處理事務&#xff0c;具有自動崩滿恢復的特性&#xff0c;在日常開發中使用非常廣泛&#xff0c;下面是言方的InnoDB引擎美構圖&#xff0c;主要分為內存結構和磁盤結構兩大部分。 內存結構主要包括Buffer Pool、C…