http的請求方式
Docker資料管理
容器中的管理資料主要有兩種方式:
- 資料卷(Data Volumes):容器內資料直接對映到本地主機環境
- 資料卷容器(Data Volume Containers):使用特定容器維護資料卷
資料卷
資料卷是一個可供容器使用的特殊目錄,它將主機作業系統目錄直接對映進容器,類似於Linux中的mount行為。
資料卷可提供很多有用的特性:
- 資料卷可以在容器之間共享和重用,容器間傳遞資料將變得高效和方便;
- 對資料卷內的資料修改會立馬生效,無論是容器內操作還是本地操作
- 對資料卷的更新不會影響映象,解耦開應用和資料
- 卷會一直存在,直到沒有容器使用,可以安全地解除安裝它
使用資料卷
docker run -it -v 主機目錄:容器內目錄
測試:
#主機目錄下面沒有ceshi目錄 [root@aliyun home]# ll 總用量 12 drwxr-xr-x 2 root root 4096 4月 15 15:07 docker drwxr-xr-x 3 root root 4096 4月 6 17:03 python drwxr-xr-x 2 root root 4096 3月 25 15:46 shell #將主機上的/home/ceshi目錄掛載到容器內部的/home [root@aliyun home]# docker run -it -v /home/ceshi:/home centos /bin/bash #進入容器 [root@e4042f5dff6d /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var #切換到容器內的/home目錄 [root@e4042f5dff6d /]# cd /home/ #檢視容器內/home目錄下內容,空目錄 [root@e4042f5dff6d home]# ls #新建一個hello.txt檔案 [root@e4042f5dff6d home]# vi hello.txt #檢視hello.txt檔案內容 [root@e4042f5dff6d home]# cat hello.txt Hello World #檢視主機上/home/ceshi路徑下的內容 [root@aliyun ~]# ls interview tools [root@aliyun ~]# cd /home/ceshi/ [root@aliyun ceshi]# ll 總用量 4 -rw-r--r-- 1 root root 12 4月 19 09:11 hello.txt [root@aliyun ceshi]# cat hello.txt Hello World ###發現容器內/home目錄下的內容會自動同步到宿主機中/home/ceshi目錄下 #同理,測試宿主機中/home/ceshi目錄下新建的檔案或修改檔案內容是否會自動同步到容器內/home目錄 #修改hello.txt檔案內容 [root@aliyun ceshi]# vim hello.txt #檢視hello.txt檔案內容,新增一行Hello Torres!!! [root@aliyun ceshi]# cat hello.txt Hello World Hello Torres!!! #新建一個test.txt檔案 [root@aliyun ceshi]# touch test.txt [root@aliyun ceshi]# ll 總用量 4 -rw-r--r-- 1 root root 28 4月 19 09:18 hello.txt -rw-r--r-- 1 root root 0 4月 19 09:18 test.txt #檢視容器內/home目錄下內容 [root@e4042f5dff6d home]# ls -al total 12 drwxr-xr-x 2 root root 4096 Apr 19 01:18 . drwxr-xr-x 1 root root 4096 Apr 19 01:10 .. -rw-r--r-- 1 root root 28 Apr 19 01:18 hello.txt -rw-r--r-- 1 root root 0 Apr 19 01:18 test.txt [root@e4042f5dff6d home]# cat hello.txt Hello World Hello Torres!!!
實戰:安裝MySql
#拉取映象 [root@aliyun ~]# docker pull mysql:5.7 5.7: Pulling from library/mysql 72a69066d2fe: Pull complete 93619dbc5b36: Pull complete 99da31dd6142: Pull complete 626033c43d70: Pull complete 37d5d7efb64e: Pull complete ac563158d721: Pull complete d2ba16033dad: Pull complete 0ceb82207cd7: Pull complete 37f2405cae96: Pull complete e2482e017e53: Pull complete 70deed891d42: Pull complete Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94 Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7 #執行容器,需要做資料掛載(注意:啟動mysql,需要設定密碼) #官方啟動命令 $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag #自己啟動 -d:後臺啟動 -p:埠對映 -v:資料卷掛載 -e:設定環境變數 --name:定義容器名 [root@aliyun ~]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name=mysql01 mysql:5.7 6e755c41e69700decc8d6bb5966dbb82f6cb1dd6666975185445d8674d2b0704 #docker ps檢視啟動狀態 [root@aliyun ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6e755c41e697 mysql:5.7 "docker-entrypoint.s…" 38 seconds ago Up 37 seconds 33060/tcp, 0.0.0.0:3310->3306/tcp mysql01 #檢視宿主機/home目錄 [root@aliyun home]# ll 總用量 20 drwxr-xr-x 2 root root 4096 4月 19 09:18 ceshi drwxr-xr-x 2 root root 4096 4月 15 15:07 docker drwxr-xr-x 4 root root 4096 4月 19 10:31 mysql drwxr-xr-x 3 root root 4096 4月 6 17:03 python drwxr-xr-x 2 root root 4096 3月 25 15:46 shell #檢視mysql目錄,發現掛載成功 [root@aliyun home]# cd mysql/ [root@aliyun mysql]# ll 總用量 8 drwxr-xr-x 2 root root 4096 4月 19 10:31 conf drwxr-xr-x 5 polkitd root 4096 4月 19 10:31 data
這樣子就可以不用進入容器去修改資料等,同時也將資料儲存到了本地。
思考:如果容器刪除,本地資料是否也會跟著刪除?
#刪除mydql01容器
[root@aliyun ~]# docker rm -f mysql01
mysql01
[root@aliyun ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#mysql01刪除成功
[root@aliyun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e4042f5dff6d centos "/bin/bash" 2 hours ago Exited (0) 53 minutes ago inspiring_volhard
7b913eab7ec9 fb5657adc892 "/bin/bash" 2 hours ago Exited (0) 2 hours ago tomcat01
#檢視宿主機/home/mysql目錄
[root@aliyun mysql]# pwd
/home/mysql
[root@aliyun mysql]# ll
總用量 8
drwxr-xr-x 2 root root 4096 4月 19 10:31 conf
drwxr-xr-x 5 polkitd root 4096 4月 19 10:31 data
結論:當容器刪除,宿主機對應掛載目錄下內容依舊存在。
具名掛載和匿名掛載
#匿名掛載(即不指定本地掛載目錄,使用docker的預設掛載目錄)
[root@aliyun ~]# docker run -d -P -v /etc/nginx --name=nginx01 nginx
9afbc16cec6c7f48f856faa1d4d8e15abb661ac8563e133832b80ee6efcb70b9
#檢視所有volume的情況
[root@aliyun ~]# docker volume ls
DRIVER VOLUME NAME
local 0c6e50ec3765f8b35ec4538836b8a987eb7ee893eecf4e1d9c61de61c0e2b2f5
#檢視容器的具體資訊
[root@aliyun ~]# docker inspect nginx01
···
"Mounts": [
{
"Type": "volume",
"Name": "0d46c494e6c57f919827871a6810171c46f2999c00e63b2197e6623206556ff6",
"Source": "/var/lib/docker/volumes/0d46c494e6c57f919827871a6810171c46f2999c00e63b2197e6623206556ff6/_data",
"Destination": "/etc/nginx",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
···
#具名掛載(指定宿主機掛載路徑)
[root@aliyun ~]# docker run -d -P -v juming_nginx:/etc/nginx --name=nginx02 nginx
c43e0f78971a88cebacf138e9b1b8516222c001cf72af3e4df8c83749c5f560e
#檢視卷資訊
[root@aliyun ~]# docker volume ls
DRIVER VOLUME NAME
local 0c6e50ec3765f8b35ec4538836b8a987eb7ee893eecf4e1d9c61de61c0e2b2f5
local 0d46c494e6c57f919827871a6810171c46f2999c00e63b2197e6623206556ff6
local 00442e8628703dd84374e7512833e1889a0a6cea32172be79ff792e29b138fd7
local b2af5d99231a0aa2c446b10ac1e8ba774a04253e8e27de155779fe061ea2467a
local juming_nginx
#檢視容器資訊
[root@aliyun ~]# docker inspect nginx02
···
"Mounts": [
{
"Type": "bind",
"Source": "juming_nginx",
"Destination": "/etc/nginx",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
···
所有docker容器內的卷,在沒有指定路徑的情況下,預設掛載目錄為:/var/lib/docker/volumes/XXX/_data
如何區分掛載方式?
- -v 容器內路徑(匿名)
- -v 卷名:容器內路徑(具名)
- -v 宿主機路徑(絕對路徑):容器內路徑(指定路徑掛載)
擴充套件
- 通過-v容器內路徑:ro/rw改變讀寫許可權
ro:readonly(容器只讀)
rw:readwrite(容器讀寫)
- 一旦設定了這個容器許可權,容器對我們掛載出來的內容就有限定了
docker run -d -P --name nginx01 v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx01 v juming-nginx:/etc/nginx:rw nginx
只要看到ro,說明這個路徑只能通過宿主機來改變,容器對所掛載資料卷內的資料就無法修改了。
資料卷容器
如果使用者需要在多個容器之間共享一些持續更新的資料,最簡單的方式是使用資料卷容器。資料卷容器也是一個容器,其目的是專門提供資料卷給其他容器使用
#建立一個數據卷容器dbdata,並在其中建立一個數據卷掛載到/dbdata
[root@aliyun ~]# docker run -it -v /dbdata --name dbdata centos
#檢視/dbdata目錄
[root@b806186465ba /]# ls
bin dbdata dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@b806186465ba /]# cd dbdata
[root@b806186465ba dbdata]# ls
#其他容器使用--volume-from來掛載dbdata容器中的資料卷,建立db1和db2容器
[root@aliyun ~]# docker run -it --volumes-from dbdata --name db1 centos
#db1
[root@70f46c3b15dc /]# ls
bin dbdata dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@aliyun ~]# docker run -it --volumes-from dbdata --name db2 centos
#db2
[root@d94f48a32c2d /]# ls
bin dbdata dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
容器db1和db2都掛載到同一個資料捲到相同的/dbdata目錄,三個容器任何一方在該目錄下的寫入,其他容器都可以看到。
#在dbdata容器中建立一個test檔案
[root@b806186465ba dbdata]# pwd
/dbdata
[root@b806186465ba dbdata]# touch test.sh
#在db1容器中檢視
[root@70f46c3b15dc /]# cd dbdata/
[root@70f46c3b15dc dbdata]# ls
test.sh
#在db2容器中檢視
[root@d94f48a32c2d /]# cd /dbdata/
[root@d94f48a32c2d dbdata]# ls
test.sh
可以多次使用--volumes-from引數來從多個容器掛載多個數據卷,還可以從其他已掛載了容器卷的容器來掛載資料卷
[root@aliyun ~]# docker run -d --name db3 --volumes-from db1 centos
注意:使用--volumes-from引數所掛載資料卷的容器自身並不需要保持在執行狀態
如果刪除了掛載的容器(dbdata、db1和db2),資料卷並不會被自動刪除。如果要刪除一個數據卷,必須在刪除最後一個 還掛載它的容器時顯示使用 docker rm -v
命令來指定同時刪除關聯的容器。
利用資料卷容器來遷移資料
可利用資料卷容器對其中的資料捲進行備份、恢復,以實現資料的遷移。
備份
$ docker run --volumes-from dbdata -v $(pwd):/backup --name worker centos tar -cvzf /backup/backup.tar.gz /dbdata
解析:
首先利用centos映象建立了一個容器worker,使用--volumes-from dbdata
引數讓worker容器掛載dbdata容器的資料卷(即dbdata資料卷);使用-v $(pwd):/backup
引數來掛載本地的當前目錄到worker容器的/backup目錄
worker容器啟動後,使用tar -cvzf /backup/backup.tar.gz /dbdata
將/dbdata下內容打包備份為容器內的/backup/backup.tar.gz
,即宿主機當前目錄下的backup.tar.gz
恢復
如果要恢復資料到一個容器,操作如下:
#建立一個帶有資料卷的容器dbdata2
$ docker run -v /dbdata --name dbdata2 centos /bin/bash
#再建立一個新的容器,掛載dbdata2的容器,並使用tar解壓備份檔案到所掛載的容器中
$ docker run --volumes-from dbdata2 -v $(pwd):/backup centos tar -xvzf /backup/backup.tar.gz