1. 程式人生 > 其它 >http的請求方式

http的請求方式

Docker資料管理

容器中的管理資料主要有兩種方式:

  1. 資料卷(Data Volumes):容器內資料直接對映到本地主機環境
  2. 資料卷容器(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