Docker容器數據卷
什麼是容器數據卷
如果數據都在容器中,那麼容器刪除,數據就會丟失!需求:數據可以持久化
Mysql,容器刪除=刪庫跑路!需求:Mysql數據可以存儲在本地!
容器之間可以有一個數據共享的技術!Docker容器中產生的數據,同步到本地!
這就是卷技術!目錄的掛載,將容器內的目錄,掛載到Linux上面!
總結一句話:容器的持久化和同步操作!容器間也是可以數據共享的!
使用數據卷
方式一:直接使用命令來掛載 -v
# 命令
docker run -it -v 主機目錄:容器目錄
# 測試
[root@iz2zeaet7s13lfkc8r3e2kz /]# docker run -it -v /home/ceshi:/home centos /bin/bash
[root@iz2zeaet7s13lfkc8r3e2kz ~]# cd /home
[root@iz2zeaet7s13lfkc8r3e2kz home]# ls
ceshi www ysl
[root@iz2zeaet7s13lfkc8r3e2kz home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7dbb19e4fb8c centos "/bin/bash" About a minute ago Up About a minute objective_cartwright
[root@iz2zeaet7s13lfkc8r3e2kz home]# docker inspect 7dbb19e4fb8c
測試文件的同步
# 在容器掛載的目錄下創建一個test.java文件
[root@7dbb19e4fb8c home]# touch test.java
[root@7dbb19e4fb8c home]# ls
test.java
# 對應的主機目錄下也存在了test.java文件
[root@iz2zeaet7s13lfkc8r3e2kz ceshi]# ls
test.java
# 退出容器,在本機的目錄下修改test.java文件
[root@7dbb19e4fb8c home]# exit
exit
[root@iz2zeaet7s13lfkc8r3e2kz /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iz2zeaet7s13lfkc8r3e2kz /]# cd /home/ceshi
[root@iz2zeaet7s13lfkc8r3e2kz ceshi]# ls
test.java
[root@iz2zeaet7s13lfkc8r3e2kz ceshi]# vim test.java
[root@iz2zeaet7s13lfkc8r3e2kz ceshi]# cat test.java
hello,linux updata
# 進入容器查看,容器內的test.java文件也修改了
[root@iz2zeaet7s13lfkc8r3e2kz ceshi]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
7dbb19e4fb8c centos "/bin/bash" 25 minutes ago Exited (0)
[root@iz2zeaet7s13lfkc8r3e2kz ceshi]# docker start 7dbb19e4fb8c
7dbb19e4fb8c
[root@iz2zeaet7s13lfkc8r3e2kz ceshi]# docker attach 7dbb19e4fb8c
[root@7dbb19e4fb8c /]# cd /home
[root@7dbb19e4fb8c home]# ls
test.java
[root@7dbb19e4fb8c home]# cat test.java
hello,linux updata
好處:以後就可以直接在本機下修改配置文件即可,不需要在進入容器修改
結論:雙向同步,不管在哪一方更新,另一方也會同步
實戰:安裝MySql
思考:MySql的數據持久化的問題!
# 獲取鏡像
[root@iz2zeaet7s13lfkc8r3e2kz home]# docker pull mysql:5.7
# 運行容器,需要做數據掛載!
# 啟動
-d 後台運行
-p 端口映射
-v 卷掛載
-e 環境配置
--name 容器名字
[root@iz2zeaet7s13lfkc8r3e2kz home]# 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=1234 --name mysql01 mysql:5.7
啟動成功之後,在本地用 sqlyog 在測試一下
sqlyog — 鏈接到服務器的3310 —- 3310 和容器內的 3306 映射,這個時候就可以鏈接上了!
注意:安全組端口一定要開
# 在本機中查看data文件以有內容
[root@iz2zeaet7s13lfkc8r3e2kz home]# ls
ceshi mysql www ysl
[root@iz2zeaet7s13lfkc8r3e2kz home]# cd mysql
[root@iz2zeaet7s13lfkc8r3e2kz mysql]# ls
conf data
[root@iz2zeaet7s13lfkc8r3e2kz mysql]# cd data
[root@iz2zeaet7s13lfkc8r3e2kz data]# ls
auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys
ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem
[root@iz2zeaet7s13lfkc8r3e2kz data]#
測試在sqlyog中創建一個數據庫,看本機data下會不會同步!
查看
測試刪除mysql容器
[root@iz2zeaet7s13lfkc8r3e2kz mysql]# docker rm -f mysql01
mysql01
[root@iz2zeaet7s13lfkc8r3e2kz mysql]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iz2zeaet7s13lfkc8r3e2kz mysql]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7dbb19e4fb8c centos "/bin/bash" About an hour ago Exited (0) 29 minutes ago objective_cartwright
ca829305596e tomcat "catalina.sh run" 42 hours ago Exited (143) 42 hours ago elated_wiles
585d63efcef0 tomcat "catalina.sh run" 42 hours ago Exited (130) 42 hours ago mystifying_bohr
[root@iz2zeaet7s13lfkc8r3e2kz mysql]# cd data
[root@iz2zeaet7s13lfkc8r3e2kz data]# ls
auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys
ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem test
掛載到本地的數據卷依舊沒有丟失,這就實現了容器數據持久化技術
具名和匿名掛載
# 匿名掛載
-v 容器內路徑!
-P 大寫P 隨機映射端口號
docker run -d -P --name nginx01 -v /ect/nginx nginx
#查看卷的所有情況
[root@iz2zeaet7s13lfkc8r3e2kz home]# docker volume ls
DRIVER VOLUME NAME
local 772d8510d653781ce4cd6538e7f5365969810882d415c276048cf9ae945220c1
local ca79699085e317d91f240456218413237e93f2ffcae60b6225900eb64a5df3d2
# 這種就是匿名掛載,我在-v 只寫了容器內的路徑,沒有寫容器外的路徑!
# 具名掛載
[root@iz2zeaet7s13lfkc8r3e2kz home]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
5d599ed31df0b2fbc309d9a5633bbee69ef740d1079c90b7fb073c4f844a575d
[root@iz2zeaet7s13lfkc8r3e2kz home]# docker volume ls
DRIVER VOLUME NAME
local 772d8510d653781ce4cd6538e7f5365969810882d415c276048cf9ae945220c1
local ca79699085e317d91f240456218413237e93f2ffcae60b6225900eb64a5df3d2
local juming-nginx
# 通過 -v 卷名:容器內路徑
# 查看一下這個卷
所有的docker容器內的卷,沒有指定目錄的情況下都是在/ver/lib/docker/volumes/xxx.../_data
[root@iz2zeaet7s13lfkc8r3e2kz home]# cd /var/lib/docker
[root@iz2zeaet7s13lfkc8r3e2kz docker]# ls
builder buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes
[root@iz2zeaet7s13lfkc8r3e2kz docker]# cd volumes/
[root@iz2zeaet7s13lfkc8r3e2kz volumes]# ls
772d8510d653781ce4cd6538e7f5365969810882d415c276048cf9ae945220c1 juming-nginx
ca79699085e317d91f240456218413237e93f2ffcae60b6225900eb64a5df3d2 metadata.db
[root@iz2zeaet7s13lfkc8r3e2kz volumes]# cd juming-nginx/
[root@iz2zeaet7s13lfkc8r3e2kz juming-nginx]# ls
_data
[root@iz2zeaet7s13lfkc8r3e2kz juming-nginx]# cd _data/
[root@iz2zeaet7s13lfkc8r3e2kz _data]# ls
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
[root@iz2zeaet7s13lfkc8r3e2kz _data]# cat nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
通過具名掛載可以方便的找到卷,大多數情況在使用具名掛載
# 如何確定是具名掛載還是匿名掛載,還是指定路徑掛載!
-v 容器內路徑 #匿名掛載
-v 卷名:容器內路徑 #具名掛載
-v /宿主機路徑:容器內路徑 #指定路徑掛載!
拓展:
# 通過 -v 容器內路徑:ro 或 rw 改變讀寫權限
ro readonly # 只讀
rw readwrite # 可讀可寫
# 一旦設置了容器權限,容器對我們掛載出來的內容就有限定了!
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
初始DockerFile
DockerFile就是用來構建docker鏡像的構建文件!命令腳本!先體驗一下!
通過這個腳本可以生成一個鏡像,鏡像是一層一層的,腳本一個個的命令,每個命令都是一層!
# 創建一個dockerfile文件,名字隨意,建議DockerFile
root@iz2zeaet7s13lfkc8r3e2kz home]# mkdir docker-test-volume
[root@iz2zeaet7s13lfkc8r3e2kz home]# ls
ceshi docker-test-volume mysql www ysl
[root@iz2zeaet7s13lfkc8r3e2kz home]# cd docker-test-volume/
# 文件中的內容 指令(大寫) 參數
[root@iz2zeaet7s13lfkc8r3e2kz docker-test-volume]# vim dockerfile1
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
#這裡的每個命令,就是鏡像的一層!
# 生成鏡像!
[root@iz2zeaet7s13lfkc8r3e2kz docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t ysl/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 470671670cac
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 4b26f821413a
Removing intermediate container 4b26f821413a
---> db972d1980d1
Step 3/4 : CMD echo "----end----"
---> Running in 118c175c4dd5
Removing intermediate container 118c175c4dd5
---> 272db10e0e63
Step 4/4 : CMD /bin/bash
---> Running in 7a462aaab949
Removing intermediate container 7a462aaab949
---> bf97aef123f3
Successfully built bf97aef123f3
Successfully tagged ysl/centos:1.0
[root@iz2zeaet7s13lfkc8r3e2kz docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ysl/centos 1.0 bf97aef123f3 36 seconds ago 237MB
tomcat02 1.0 b0152d8846e1 44 hours ago 652MB
mysql 5.7 a4fdfd462add 3 days ago 448MB
tomcat latest 1b6b1fe7261e 8 days ago 647MB
nginx latest 9beeba249f3e 9 days ago 127MB
elasticsearch 7.6.2 f29a1ee41030 8 weeks ago 791MB
portainer/portainer latest 2869fc110bf7 2 months ago 78.6MB
centos latest 470671670cac 4 months ago 237MB
啟動自己的容器
這個卷和外部一定有一個同步的目錄!
查看卷掛載路徑
測試文件是否同步
#在容器中添加container.txt
[root@743222b34d51 volume01]# touch container.txt
[root@743222b34d51 volume01]# ls
container.txt
#查看主機掛載目錄下
[root@iz2zeaet7s13lfkc8r3e2kz home]# cd /var/lib/docker/volumes/8d8d71a545b7155ca545c1314e9d9c87e15d66a48bf4360f32ec1a03a0d5404e/_data
[root@iz2zeaet7s13lfkc8r3e2kz _data]# ls
container.txt
這種方式未來使用的十分多,因為我們通常會構建自己的鏡像!
假設構建鏡像時沒有掛載卷,要手動鏡像掛載 -v 卷名:容器內路徑
數據卷容器
兩個mysql同步數據
# 測試
# 啟動容器
[root@iz2zeaet7s13lfkc8r3e2kz docker-test-volume]# docker run -it --name docker01 ysl/centos:1.0
[root@4c87665bf62e /]# ls
bin etc lib lost+found mnt proc run srv tmp var volume02
dev home lib64 media opt root sbin sys usr volume01
[root@4c87665bf62e /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 360 May 25 06:37 dev
drwxr-xr-x 1 root root 4096 May 25 06:37 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64
drwx------ 2 root root 4096 Jan 13 21:48 lost+found
drwxr-xr-x 2 root root 4096 May 11 2019 media
drwxr-xr-x 2 root root 4096 May 11 2019 mnt
drwxr-xr-x 2 root root 4096 May 11 2019 opt
dr-xr-xr-x 105 root root 0 May 25 06:37 proc
dr-xr-x--- 2 root root 4096 Jan 13 21:49 root
drwxr-xr-x 11 root root 4096 Jan 13 21:49 run
lrwxrwxrwx 1 root root 8 May 11 2019 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 May 11 2019 srv
dr-xr-xr-x 13 root root 0 May 9 09:17 sys
drwxrwxrwt 7 root root 4096 Jan 13 21:49 tmp
drwxr-xr-x 12 root root 4096 Jan 13 21:49 usr
drwxr-xr-x 20 root root 4096 Jan 13 21:49 var
drwxr-xr-x 2 root root 4096 May 25 06:37 volume01 #數據卷
drwxr-xr-x 2 root root 4096 May 25 06:37 volume02 #數據卷
# Ctrl+p+q 退出容器容器繼續運行
[root@iz2zeaet7s13lfkc8r3e2kz docker-test-volume]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4c87665bf62e ysl/centos:1.0 "/bin/sh -c /bin/bash" 3 minutes ago Up 3 minutes docker01
# 在啟動一個容器掛載這個容器
[root@iz2zeaet7s13lfkc8r3e2kz docker-test-volume]# docker run -it --name docker02 --volumes-from docker01 ysl/centos:1.0
[root@d92eaa59323a /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 360 May 25 06:45 dev
drwxr-xr-x 1 root root 4096 May 25 06:45 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64
drwx------ 2 root root 4096 Jan 13 21:48 lost+found
drwxr-xr-x 2 root root 4096 May 11 2019 media
drwxr-xr-x 2 root root 4096 May 11 2019 mnt
drwxr-xr-x 2 root root 4096 May 11 2019 opt
dr-xr-xr-x 106 root root 0 May 25 06:45 proc
dr-xr-x--- 2 root root 4096 Jan 13 21:49 root
drwxr-xr-x 11 root root 4096 Jan 13 21:49 run
lrwxrwxrwx 1 root root 8 May 11 2019 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 May 11 2019 srv
dr-xr-xr-x 13 root root 0 May 9 09:17 sys
drwxrwxrwt 7 root root 4096 Jan 13 21:49 tmp
drwxr-xr-x 12 root root 4096 Jan 13 21:49 usr
drwxr-xr-x 20 root root 4096 Jan 13 21:49 var
drwxr-xr-x 2 root root 4096 May 25 06:37 volume01 #數據卷
drwxr-xr-x 2 root root 4096 May 25 06:37 volume02 #數據卷
#測試
# 在docker01中添加文件
[root@iz2zeaet7s13lfkc8r3e2kz home]# docker attach 4c87665bf62e
[root@4c87665bf62e /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 360 May 25 06:37 dev
drwxr-xr-x 1 root root 4096 May 25 06:37 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64
drwx------ 2 root root 4096 Jan 13 21:48 lost+found
drwxr-xr-x 2 root root 4096 May 11 2019 media
drwxr-xr-x 2 root root 4096 May 11 2019 mnt
drwxr-xr-x 2 root root 4096 May 11 2019 opt
dr-xr-xr-x 107 root root 0 May 25 06:37 proc
dr-xr-x--- 2 root root 4096 Jan 13 21:49 root
drwxr-xr-x 11 root root 4096 Jan 13 21:49 run
lrwxrwxrwx 1 root root 8 May 11 2019 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 May 11 2019 srv
dr-xr-xr-x 13 root root 0 May 9 09:17 sys
drwxrwxrwt 7 root root 4096 Jan 13 21:49 tmp
drwxr-xr-x 12 root root 4096 Jan 13 21:49 usr
drwxr-xr-x 20 root root 4096 Jan 13 21:49 var
drwxr-xr-x 2 root root 4096 May 25 06:37 volume01
drwxr-xr-x 2 root root 4096 May 25 06:37 volume02
[root@4c87665bf62e /]# cd volume01
[root@4c87665bf62e volume01]# ls
[root@4c87665bf62e volume01]# touch docker01
[root@4c87665bf62e volume01]# ls
docker01
# 在docker02中查看是否同步
[root@d92eaa59323a /]# cd volume01
[root@d92eaa59323a volume01]# ls
docker01
# docker01 中創建的文件同步到了 docker02 中
# 測試再啟動一個docker03容器,掛載docker01
[root@iz2zeaet7s13lfkc8r3e2kz docker-test-volume]# docker run -it --name docker03 --volumes-from docker01 ysl/centos:1.0
[root@edf6f8821d29 /]# ls
bin etc lib lost+found mnt proc run srv tmp var volume02
dev home lib64 media opt root sbin sys usr volume01
[root@edf6f8821d29 /]# cd volume01
[root@edf6f8821d29 volume01]# ls
docker01
# 在docker03 中創建一個未見
[root@edf6f8821d29 volume01]# touch docker03
[root@edf6f8821d29 volume01]# ls
docker01 docker03
# 去docker01中查看
[root@4c87665bf62e volume01]# ls
docker01 docker03
# 發現已同步
# 刪除docker01 再去docker02和docker03中查看
[root@4c87665bf62e volume01]# exit
exit
[root@iz2zeaet7s13lfkc8r3e2kz home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
edf6f8821d29 ysl/centos:1.0 "/bin/sh -c /bin/bash" 5 minutes ago Up 5 minutes docker03
d92eaa59323a ysl/centos:1.0 "/bin/sh -c /bin/bash" 14 minutes ago Up 14 minutes docker02
[root@iz2zeaet7s13lfkc8r3e2kz home]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
edf6f8821d29 ysl/centos:1.0 "/bin/sh -c /bin/bash" 6 minutes ago Up 6 minutes docker03
d92eaa59323a ysl/centos:1.0 "/bin/sh -c /bin/bash" 15 minutes ago Up 15 minutes docker02
4c87665bf62e ysl/centos:1.0 "/bin/sh -c /bin/bash" 22 minutes ago Exited (127) About a minute ago docker01
[root@iz2zeaet7s13lfkc8r3e2kz home]# docker rm -f 4c87665bf62e
4c87665bf62e
[root@iz2zeaet7s13lfkc8r3e2kz home]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
edf6f8821d29 ysl/centos:1.0 "/bin/sh -c /bin/bash" 7 minutes ago Up 7 minutes docker03
d92eaa59323a ysl/centos:1.0 "/bin/sh -c /bin/bash" 15 minutes ago Up 15 minutes docker02
# 去docker02中查看
[root@iz2zeaet7s13lfkc8r3e2kz home]# docker attach d92eaa59323a
[root@d92eaa59323a volume01]# ls
docker01 docker03
# 發現文件還在
# 去docker03 中查看
[root@edf6f8821d29 volume01]# ls
docker01 docker03
#也存在
多個mysql實現數據共享
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 --name mysql01 mysql:5.7
docker run -p 3310:3306 -e MYSQL_ROOT_PASSWORD=1234 --name mysql02 --volumes-form mysql01 mysql:5.7
結論:
容器之間配置信息的傳遞,數據卷容器的生命周期一直持續到沒有容器使用為止!
但是一旦你持久化到了本地,這個時候,本地的數據是不會刪除的!