1. 程式人生 > 實用技巧 >b_pat_模擬題(多項式相乘 / 洗牌 / 最短距離 / 填充螺旋矩陣)

b_pat_模擬題(多項式相乘 / 洗牌 / 最短距離 / 填充螺旋矩陣)

什麼是容器資料卷

需求:我們在容器中執行mysql服務. 怎麼做到容器銷燬我們的資料不丟失 實現資料的持久化

猜想: 我們要是能夠將我們的資料 儲存到我們的容器的宿主機上這樣我們就不擔心我們的資料丟失了(物理故障除外)

技術實現: 資料卷技術就能實現這個需求

使用資料卷

1.直接使用資料卷

docker run -it -v 主機目錄:容器目錄

[root@localhost ~]# docker run -d -it --name=centos05 -v /root/test:/home/ centos
95c671f317f397e996177282559fea96b86698283c45c5d3806dca7ec5f40194
[root@localhost ~]# docker inspect centos05

測試檔案同步:

1、宿主機操作檔案容器同步操作

2、容器操作宿主機同步

3.關閉容器測試:

我們能驚奇的發現數據的同步哪怕容器處於關閉的狀態也是可以同步的

實戰: mysql資料持久化

1.安裝MySQL資料庫
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 m
ysql:5.7
Unable to find image 'mysql:5.7' locally
5.7: Pulling from library/mysql
d121f8d1c412: Already exists 
f3cebc0b4691: Already exists 
1862755a0b37: Already exists 
489b44f3dbb4: Already exists 
690874f836db: Already exists 
baa8be383ffb: Already exists 
55356608b4ac: Already exists 
277d8f888368: Pull complete 
21f2da6feb67: Pull complete 
2c98f818bcb9: Pull complete 
031b0a770162: Pull complete 
Digest: sha256:14fd47ec8724954b63d1a236d2299b8da25c9bbb8eacc739bb88038d82da4919
Status: Downloaded newer image for mysql:5.7
0b80fee1e472fa46f234cc02c04a7bf62f8466bcecb219c4bc1ef4ee5c8acb33

2.檢視我們宿主機目錄 看看是否有我們的mysql資料
[root@localhost mysql]# pwd
/home/mysql
[root@localhost mysql]# ls
conf  data
[root@localhost mysql]# cd data/
[root@localhost data]# ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem
[root@localhost data]# 

3.刪除docker 容器
[root@localhost data]# docker ps 
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                               NAMES
0b80fee1e472        mysql:5.7                "docker-entrypoint.s…"   6 minutes ago       Up 6 minutes        33060/tcp, 0.0.0.0:3310->3306/tcp   mysql01
[root@localhost data]# docker rm -f mysql01
mysql01
[root@localhost data]# docker ps 
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                              NAMES
4.我們的資料檔案是否還在
[root@localhost data]# ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem   test

5.我們的持久化儲存實現

那麼想這樣的掛載有幾種呢?

匿名掛載和具名掛載

# 匿名掛載
-v 容器內路徑
root@localhost ~]# docker run -d -it --name=Nginx01 -v /etc/nginx nginx
[root@localhost ~]# docker inspect Nginx01
				....
"Mounts": [
            {
                "Type": "volume",
                "Name": "0eef256e6a4c6ef5e0b2e5376294e25d498b5caba98733f7ce5641add15bdfb5",
                "Source": "/var/lib/docker/volumes/0eef256e6a4c6ef5e0b2e5376294e25d498b5caba98733f7ce5641add15bdfb5/_data",
                "Destination": "/etc/nginx",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
         .....
 # 檢視所有卷的情況
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               0eef256e6a4c6ef5e0b2e5376294e25d498b5caba98733f7ce5641add15bdfb5
local               00d9a09b3f3bf62352e563ee6fbd191c13af9939d58974f11c2d98a1cc832f99
local               25702591833c4618d78e2fc32598437a1c388f787210846d14ceb6eb5ab88cb7

#具名掛載

-v 掛載卷名:容器內路徑

[root@localhost ~]# docker run  -d -it --name=Nginx02 -P -v Nginx-conf:/etc/nginx nginx
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                              NAMES
a87e394c3794        nginx                    "/docker-entrypoint.…"   5 seconds ago       Up 4 seconds        0.0.0.0:32768->80/tcp              Nginx02
fbfb104587c9        nginx                    "/docker-entrypoint.…"   9 minutes ago       Up 9 minutes        80/tcp                             Nginx01
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               0eef256e6a4c6ef5e0b2e5376294e25d498b5caba98733f7ce5641add15bdfb5
local               00d9a09b3f3bf62352e563ee6fbd191c13af9939d58974f11c2d98a1cc832f99
local               25702591833c4618d78e2fc32598437a1c388f787210846d14ceb6eb5ab88cb7
local               Nginx-conf

#檢視資料卷詳細資訊

[root@localhost ~]# docker volume inspect Nginx-conf
[
    {
        "CreatedAt": "2020-09-10T12:46:44+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/Nginx-conf/_data",
        "Name": "Nginx-conf",
        "Options": null,
        "Scope": "local"
    }
]

#加上前面說的指定目錄掛載 總共三種方法

掛載卷是否有許可權限制?有哪幾種?

拓展

# 預設是 rw
# ro 只要看到ro就說明這個路徑只能通過宿主機來操作,容器內部是無法操作!

# 通過 -v 容器內路徑:ro 或 rw   改變讀寫許可權
# 一旦建立容器時設定了容器許可權,容器對我們掛載出來的內容就有限定了!
docker run -d -P --name nginx05 -v Nginx-conf:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v Nginx-conf:/etc/nginx:rw nginx

資料卷之dockerFIle

初識DockerFile

什麼是dockerfile?

Dockerfile是一個文字文件,其中包含使用者可以在命令列上呼叫以組合影象的所有命令。使用docker build 使用者可以建立一個自動執行的構建,該構建可以連續執行多個命令列指令。

Dockerfile 就是用來構建 docker映象的構建檔案!命令指令碼! 先體驗一下!

通過這個指令碼可以生成映象,映象是一層一層的,指令碼是一個個的命令,每個命令都是最終映象的一層!

實戰:dockerfile匿名掛載資料卷

#1.建立dockerfile檔案
[root@localhost volume]# cat dockerfile 
FROM centos

VOLUME ["volume01","volume02"]

CMD  echo"-----------build secccessful!---------"

CMD  /bin/bash

#2.build dockerfile
[root@localhost volume]# docker build -f dockerfile -t martin/centos-volume . 
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 0d120b6ccaa8
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in 08bd38fc2b20
Removing intermediate container 08bd38fc2b20
 ---> 5373c024b9bd
Step 3/4 : CMD  echo"-----------build secccessful!---------"
 ---> Running in 47e69c382a92
Removing intermediate container 47e69c382a92
 ---> 5294966f9a51
Step 4/4 : CMD  /bin/bash
 ---> Running in 6b63ec9c5d91
Removing intermediate container 6b63ec9c5d91
 ---> 0080b2fa0c13
Successfully built 0080b2fa0c13
Successfully tagged martin/centos-volume:latest
#3檢視映象
[root@localhost volume]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED                  SIZE
martin/centos-volume     latest              0080b2fa0c13        18 seconds ago           215MB
martin/tomcat02          0.1                 75448ab28707        2 hours ago              652MB
#4以新生成的映象建立容器
[root@localhost volume]# docker run -d -it --name=test-dof-vol martin/centos-volume
38452f2db864f1c0136cb63021af8b66ac1dfae29ab0c451479b85840a6f7637
[root@localhost volume]# docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                              NAMES
38452f2db864        martin/centos-volume     "/bin/sh -c /bin/bash"   8 seconds ago       Up 7 seconds                                           test-dof-vol
5.檢視和測試資料卷
[root@localhost volume]# docker inspect test-dof-vol
 "Mounts": [
            {
                "Type": "volume",
                "Name": "d577c8ff3c360963159e3631d2c307a1a44ce068c2888b167b035e527bb4005b",
                "Source": "/var/lib/docker/volumes/d577c8ff3c360963159e3631d2c307a1a44ce068c2888b167b035e527bb4005b/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "0745d3159fe5295f1262c872a487614c563147aadcb2ec519f449817f3804521",
                "Source": "/var/lib/docker/volumes/0745d3159fe5295f1262c872a487614c563147aadcb2ec519f449817f3804521/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }

測試:

資料卷容器

需求: 多個容器同步資料

#資料卷容器
 在啟動容器是 使用 --volumes-from 容器id|容器名    #會將容器id的資料卷作為資料容器掛載到新的容
 #啟動容docker01 作為容器卷
 [root@localhost _data]# docker run -d -it --name=docker01 martin/centos-volume
 [root@localhost _data]# docker inspect docker01
 "Mounts": [
            {
                "Type": "volume",
                "Name": "d5c127e77ae816374681bab51f1319e4935d593d20f6a94f7267473727786fc9",
                "Source": "/var/lib/docker/volumes/d5c127e77ae816374681bab51f1319e4935d593d20f6a94f7267473727786fc9/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "4e64fa0f86a8080c25a92829f70f1350b6c6a7ac75cd0d877b14ed04ac6d9dbd",
                "Source": "/var/lib/docker/volumes/4e64fa0f86a8080c25a92829f70f1350b6c6a7ac75cd0d877b14ed04ac6d9dbd/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ]
#啟動dcoker02 以docker01 為容器卷啟動
[root@localhost _data]# docker run -d -it --name=docker02 --volumes-from docker01 centos 
a4006a8881b55527db8fb50dec272dbd5670b923a70a9eadc951300a003fce77
[root@localhost _data]# docker inspect docker02
"Mounts": [
            {
                "Type": "volume",
                "Name": "d5c127e77ae816374681bab51f1319e4935d593d20f6a94f7267473727786fc9",
                "Source": "/var/lib/docker/volumes/d5c127e77ae816374681bab51f1319e4935d593d20f6a94f7267473727786fc9/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "4e64fa0f86a8080c25a92829f70f1350b6c6a7ac75cd0d877b14ed04ac6d9dbd",
                "Source": "/var/lib/docker/volumes/4e64fa0f86a8080c25a92829f70f1350b6c6a7ac75cd0d877b14ed04ac6d9dbd/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ]
#我們發現容器docker02 資料卷是用共享了docker01的資料卷

#以docker01為資料容器啟動docker03
[root@localhost _data]# docker run -d -it --name=docker03 --volumes-from docker01 centos 
9bdb00a12f91300d841f2c26d621f2126c509887af4c9554beaefe60c8062123

docker03 也是共享了docker01的資料卷 此處不板書了 接下來我們測試

測試

1.在資料卷中建立和刪除檔案看是否同步

2.分別在容器中建立和刪除檔案檔案看是否同步

3.刪除docker01 看資料卷是否還能生效

結論 容器只是一種複製容器卷的卷的掛載關係 只要資料存在 我們的對映關係就不會失效