docker容器的存儲資源(volume)


docker容器的存儲資源(volume)

/var/lib/docker/image # 存儲鏡像層的資源
/var/lib/docker/overlay2 # 存儲容器層的資源

容器資源掛載方式又兩種思考方向:
1. bind mount:將宿主機中目錄掛載到容器中
    1) docker run -d -p 80:80 --name web -v ~/htdocs:/usr/local/apache/htdocs httpd # 宿主機htdocs目錄掛載到容器內,默認默認為rw權限,而且是雙向讀寫(宿主機和容器內都可以對其目錄讀寫)
	
    2) docker run -d -p 80:80 --name web -v ~/htdocs:/usr/local/apache/htdocs:ro httpd # 掛載宿主機目錄htdocs到容器內為ro的權限,在登錄到容器內,usr/local/apache/htdocs目錄的權限為只讀;
	docker inspect web # 如圖1
    docker exec -it web bash
    cd /usr/local/apache/htdocs
    echo "123" > index.html # 提示此目錄是只讀的文件系統 如下圖2

	3) 權限的另外一種修正方法:selinux標簽
        如果使用--mount選項掛載了-Z或z,會忽略rw的權限
        selinux:-Z,表示掛載內容是私有的,不能在其它容器之間共享
        selinux:-z,掛載目錄內的多個容器之間可以共享這個數據內容
        docker run -itd --name devtest -v "$(pwd)"/htdoc:/usr/share/nginx/html:z nginx:latest
        ls -Zd htdoc  # 如下圖3
        docker exec -it devtest bash
        cd /usr/share/nginx/	
		ls -Zd html/  # 如下圖3
        docker inspect devtest # 如下圖4
       
2. tmpfs mounts: 將容器中的目錄存放到宿主機內存中
    docker run -itd --name tmpfs --tmpfs /app busybox
    docker exec -it tmpfs sh
    
3. managed volume: 將容器內的某個目錄持久化到宿主機指定目錄
	docker run -d --name web -p 80:80 --volume /usr/local/apache2/htdocs httpd # 掛載的時候不指定掛載的源地址(宿主機地址),默認掛載在/var/lib/docker/volumes/...隨機字符串.../_data,隨機字符串是容器掛載到宿主機的卷名(VOLUME NAME) 如下圖5
    curl 192.168.31.168:80
        '''
        <html><body><h1>It works!</h1></body></html>
        '''
	docker inspect web # 如下圖5
    cd /var/lib/docker/volumes/...隨機字符串.../_data
    ls
    	'''
    	index.html
    	'''
	echo "Hello,Sir." > index.html
    curl 192.168.31.168:80
        '''
        Hello,Sir.
        '''
	docker volume ls
	'''
	...VOLUME NAME...
	'''
    docker volume inspect VOLUME-NAME # 下圖6
    docker rm -f web # 刪除容器web,這時只要/var/lib/docker/volumes/...隨機字符串.../_data的這個卷的數據還在,那這個被刪除的容器的持久化到本地的數據就永遠在 下圖7
	docker volume ls
    docker volume inspect VOLUME-NAME # 下圖7
    cat /var/lib/docker/volumes/...隨機字符串.../_data/index.html # 下圖7


圖1:

圖2:

圖3:

圖4:

圖5:

圖6:

圖7:

docker -v 選項配置詳細的細節信息(--mount)

docker run -d --name webtest --mount type=bind,source=/root/htdocs,destination=/usr/local/apache2/htdocs httpd
docker run -d --name devtest --mount type=bind source="$(pwd)/htdocs",target=/usr/share/nginx/html nginx:latest
docker rm -f devtest
docker run -d --name devtest --mount type=bind source="$(pwd)/htdocs",target=/usr/share/nginx/html,readonly nginx:latest
docker inspect devtest # 如下圖1

圖1:

上圖Propagation屬性是什么?傳播方向,默認是給綁定掛載和卷模式提供rprivate
rprivate代表遞歸目錄下所有的,只有在bind mount配置的時候使用,而且在linux主機(相對於容器,就是宿主機)上配置

propagation:rshared|rslave|rprivate  # r代表遞歸所有目錄都生效
	shared:原始掛載的子掛載只公開給父掛載,父掛載的子掛載也傳播給原始掛載
	slave:類似於共享掛載,但是只有一個方向;如果原始掛載公開子掛載,則父子掛載可以看到它;但是如果父子掛載公開子掛載,則原始掛載是沒辦法看到它,就是宿主機目錄一旦掛載,就不能再共享給別人。# 如下圖1
	private:mount私有的掛載,但其中的子掛載不公開給父本掛載;而父本掛載也不公開給原始掛載。

docker run -itd --name devtest --mount type=bind,source="$(pwd)"/htdocs,target=/usr/shate/nginx/html --mount type=bind,source="$(pwd)"/htdocs,target/usr/share/nginx/html2,readonly,bind-propagation=rslave nginx
docker exec -it devtest bash
cd /usr/share/nginx
ls 
	'''
	html html2
	'''
ls html/
	'''
	index.html
	'''
ls html2/
	'''
	index.html
	'''
echo 123 > html/index.html  # 正常
echo 456 > html2/index.html # 無法寫入 ,如下圖1

創建volume

docker volume create volume-test1 # 下圖1
docker volume ls  # 下圖1

那被創建的volume-test1卷被放在哪了呢?依然在 /var/lib/docker/volumes 目錄中。
cd /var/lib/docker/volumes
ls 
	'''
	_data
	'''
cd _data/
ls  # 下圖1
	'''
	是一個空目錄
	'''
如何使用這個創建的卷?
docker run -itd --name bbox1 --volume volume-test1:/volume busybox # 下圖2
docker exec -it bbox1 sh
cd /volume
echo "I am in container." > testfile
exit
cat /var/lib/docker/volumes/testfile
	'''
	I am in container.
	'''
docer inspect -f {{.Mounts}} bbox1

圖1:

圖2:

volume container

volume container:卷容器,專門為其它容器提供卷的容器,它提供的卷可以是 bind mount,也可以是docker managed volume。一旦創建出容器卷,它就永遠維持在Created的狀態,在實際場景中,發現有created狀態的容器,一定要小心是容器卷,別誤刪了,導致其它依賴此容器卷的容器無法正常運行。。
    bind mount:存放webserver的靜態文件
    docker managed:存放的是一些使用工具

docker create --name vc_data --volume ~/htdocs:/usr/local/apache2/htdocs --volume /usr/local/apache2/logs busybox

docker inspect vc_data # 下圖1

docker run --name web10 -d -p 80 --volumes-from vc_data httpd		
docker run --name web20 -d -p 80 --volumes-from vc_data httpd
docker run --name web30 -d -p 80 --volumes-from vc_data httpd
docker ps
curl 192.168.31.168:49157
    '''
    THE NEW PAGE
    '''
curl 192.168.31.168:49158
    '''
    THE NEW PAGE
    '''
curl 192.168.31.168:49159
    '''
    THE NEW PAGE
    '''

# 查看容器web10容器中的/usr/local/apache2/logs 日志是否持久化到容器中 如下圖3
docker inspect web10
docker volume ls   
   

使用容器卷有啥好處呢?貌似比單獨一個一個目錄掛載要方便一點。。。
docker run --name web10 -d -p 80 --volume ~/htdocs:/usr/local/apache2/htdocs --volume /usr/local/apache2/logs httpd
docker run --name web20 -d -p 80 --volume ~/htdocs:/usr/local/apache2/htdocs --volume /usr/local/apache2/logs httpd
docker run --name web30 -d -p 80 --volume ~/htdocs:/usr/local/apache2/htdocs --volume /usr/local/apache2/logs httpd


# 實現多個容器卷掛載  下圖4
mkdir -p /data/test1
mkdir -p /data/test1
echo "web1" > /data/test1/test.txt  
echo "web2" > /data/test2/test.txt
docker create --name bbox1 --volume /data/test1:/data/test1 busybox
docker create --name bbox2 --volume /data/test2:/data/test1 busybox
docker run -itd --name bbox --volumes-from bbox1 --volumes-from bbox2 busybox
docker exec -it bbox sh
cd /data/
ls
'''
test1 test2
'''

圖1:

圖2:

圖3:

圖4:

volume備份

mkdir backup
cd backup/
docker ps -a 
docker create --name bbox1 --volume /data/test1:/data/test1  busybox
docker run --rm --volumes-from bbox1 -v $(pwd):/backup busybox tar -cvf /backup/backup.tar /data/test1

外部存儲(nfs)使用volume

使用nfs跨主機將目錄掛載到卷,卷再掛載到容器,實現volume數據映射;
適合場景:動態webserver

# 192.168.1.4主機
yum install nfs-utils rpcbind -y
mkdir /data/nfs/docker -p
vim /etc/exports
	/data/nfs *(rw,no_root_squash,sync)

exportfs -r
systemctl start rpcbind
systemctl start nfs-server
showmount -e 192.168.1.4
iptables -F
iptables-save

# 192.168.1.102主機
yum install nfs-utils rpcbind -y
showmount -e 192.168.1.4
	'''
	Export list for 192.168.1.4:
	/data/nfs *
	'''
docker volume create --driver local --opt type=nfs --opt o=addr=192.168.1.4,rw --opt device=:/data/nfs volume-nfs  # 如下圖1
docker volume ls
    '''
    DRIVER              VOLUME NAME
    local               7472e9111edcc80fa8b59df69255e93a30f9ed9ca752c21b21cc5cea4dce0d43
    local               c06700a785d3387655ea79bf1790f01109b19eec758d5f030fd331875f7b4a0a
    local               f1dbfae59d757137b078be56f5583d51e496fa45f81a15108f82260b650ec773
    local               volume-nfs
    local               volume-test1
    '''
docker volume inspect volume-nfs
'''
    [
        {
            "Driver": "local",
            "Labels": {},
            "Mountpoint": "/var/lib/docker/volumes/volume-nfs/_data", # 把192.168.1.4主機/data/nfs目錄掛載到當前主機(192.168.1.102)此目錄中了
            "Name": "volume-nfs",
            "Options": {
                "device": ":/data/nfs",
                "o": "addr=192.168.1.4,rw",
                "type": "nfs"
            },
            "Scope": "local"
        }
    ]
'''
cd /var/lib/docker/volumes/volume-nfs/_data
docker run -itd --name bbox1 --volume volume-nfs:/nfs busybox
docker inspect -f {{.Mounts}} bbox1
    '''
    [{volume volume-nfs /var/lib/docker/volumes/volume-nfs/_data /nfs local z true }]
    '''
docker exec -it bbox1 sh
ls
    '''
    bin   dev   etc   home  nfs   proc  root  run   sys   tmp   usr   var
    '''
cd nfs
ls
    '''
    docker
    '''
echo "go go go! " > testfile
exit

# 查看當前主機(192.168.1.102)當前目錄(/var/lib/docker/volumes/volume-nfs/_data)沒有再容器中拆功能鍵的文件testfile,這其實不會保存到當前主機卷中的,而是保存到遠程主機nfs文件系統目錄/data/nfs目錄中的。。。。
ls # 為空

去192.168.1.4主機的/data/nfs目錄中查看 # 如下圖2

圖1:

圖2:

data-packed volume container

data-packed volume container:將數據打包到鏡像中,再用這個鏡像做成卷容器,其它容器在啟動時再引用這個卷容器;
    優點:不依賴主機數據,具有非常強的移植性
    缺點:只適合靜態場景,比如:webserber的靜態文件
    
# 以apache靜態文件默認目錄為例,將我們宿主機的掛載目錄拷貝到容器中,打包成鏡像
FROM busybox:latest
ADD htdocs /usr/local/apache2/htdocs
VOLUME /usr/local/apache2/htdocs  # 將此目錄(在容器中)映射到宿主機,如果不映射出來,想修改的時候就很麻煩

docker build -t ./Dockerfile datapacked . # 下圖1
docker create --name vc_data datapacked
docker run -d --name web-ser -p 8111:80 --volumes-from vc_data httpd
curl 192.168.1.102:8111
docker inspect web-ser # 下圖2
docker exec -it web-ser sh  # 下圖3   

圖1:

圖2:

圖3:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM