Spring(前部分)
阿新 • • 發佈:2020-09-16
什麼是容器資料卷
需求:我們在容器中執行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 看資料卷是否還能生效
結論 容器只是一種複製容器卷的卷的掛載關係 只要資料存在 我們的對映關係就不會失效