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

結論:

​ 容器之間配置資訊的傳遞,數據卷容器的生命周期一直持續到沒有容器使用為止!

​ 但是一旦你持久化到了本地,這個時候,本地的數據是不會刪除的!

Tags: