Docker 管理應用程序數據

一、將Docker主機數據掛載到容器html

Docker提供三種不一樣的方式將數據從宿主機掛載到容器中:volumes , bind mounts 和tmpfsnode

volumes:  Docker管理宿主機文件系統的一步分(/var/lib/docker/volumes)mysql

bind mounts:  能夠存儲在宿主機系統的任意位置nginx

tmpfs:  掛載存儲在宿主機系統的內存中,而不會寫入宿主機的文件系統sql

 

好比咱們容器中啓動了mysql數據庫,這裏咱們能夠把數據放在宿主機的某一個目錄下,這樣即便咱們刪除了mysql這臺容器,也不會讓咱們的數據丟失,docker提供了上面三種數據卷的方式來管理數據docker

 

 volume:數據庫

一、建立數據卷瀏覽器

建立的的數據卷的目錄必定是在/var/lib/docker/volumes下的bash

二、查看數據卷信息app

[root@node02 volumes]# docker volume ls  (羅列有哪些數據卷)
DRIVER              VOLUME NAME
local               1a22651fb87dd211bbd2156ce645225d6127edd00150bd879d20f5d9f3490762
local               1b54af29a1eb19e7a359b44793b19c7b049801c4ffe475dac4f9cebfcc47cde4
local               20e91019905da93898d6491de200f471f3251d9e2900263859fad9ef30989737
local               2e1ac775ad2d475af68d9e78b94ecf0d0ef07b1031a77fc90704020de4a9f54f
local               76052c2502fae1f858c28a6be02c4f3982d320ec3bb3c77534f57bb2fe8da1c7
local               7f397b7401f21a985c40376908dd8d8ebcf9a8d7c79093f23b2e718485f0032b
local               a326fce6d638fc2d8971f8b00880eea8c376c9e7bdd45ef323a8ea764939afee
local               adb8cc97e3ac4d782d3098fdf828f6ca2d108153c4c8d437f02e939e101dbb99
local               d93c61ffe74cfea942f6edaa42747506ffbec29feda846f9a93a22a1db79652e
local               e14da5a9196841c146833cb8e71c8e0138257dd6d0601f267e91e91abdd3a8aa
local               nginx-vol
[root@node02 volumes]# docker volume inspect nginx-vol (查看nginx-vol數據卷的詳細信息,掛載在本地的/var/lib/docker/volumes/nginx-vol/_data位置)
[
    {
        "CreatedAt": "2018-09-10T16:18:22+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data", 數據存儲目錄
        "Name": "nginx-vol",
        "Options": {},
        "Scope": "local"
    }
]

  

[root@node02 volumes]# docker container run -d -it -p 8800:80--name=nginx-vol-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx (使用nginx:latest鏡像建立一個容器,容器名爲nginx-vol-test,數據卷名稱爲nginx-vol,掛載容器的路徑地址爲/usr/share/nignx/html)
2b3a8ab12600d4059b3623369a6e34dc8aa222b2a6dc0cbf5f821fa73f81aded
[root@node02 volumes]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
2b3a8ab12600        nginx               "nginx -g 'daemon of…"   21 seconds ago      Up 20 seconds       80/tcp                          nginx-vol-test
603494fada81        nginx:v1.7.9        "nginx -g 'daemon of…"   5 hours ago         Up 5 hours          443/tcp, 0.0.0.0:8082->80/tcp   nginx8
a63d1c647fc4        nginx:v1.7.9        "nginx -g 'daemon of…"   5 hours ago         Up 5 hours          443/tcp, 0.0.0.0:8081->80/tcp   nginx7
b2bd8d583859        nginx               "nginx -g 'daemon of…"   5 hours ago         Up 5 hours          0.0.0.0:8080->80/tcp            nginx5
1ab0200029d7        busybox             "sh"                     6 hours ago         Up 6 hours                                          bs
[root@node02 volumes]# 

[root@node02 volumes]# docker exec -it nginx-vol-test sh
# cd /usr/share/nginx/html
# ls
50x.html index.html
# touch nginx-vol.html

這樣咱們到宿主機的數據卷目錄下看一下有沒有nginx-vol.html文件

[root@node02 _data]# pwd
/var/lib/docker/volumes/nginx-vol/_data
[root@node02 _data]# ll
total 8
-rw-r--r-- 1 root root 537 Apr 10 00:01 50x.html
-rw-r--r-- 1 root root 612 Apr 10 00:01 index.html
-rw-r--r-- 1 root root 0 Sep 10 16:30 nginx-vol.html

咱們發現是有的

這樣咱們編寫一下文件內容

咱們訪問一下,發現是有的。這樣咱們如今作一個測試,咱們把容器刪除,看一下咱們的數據捲上的文件還在不在

 

[root@node02 _data]# docker ps -a -q(這個命令是爲了展現全部的container id)
50653a8fd0db
2b3a8ab12600
603494fada81
a63d1c647fc4
ea028db62306
b2bd8d583859
c754e6a5b7e8
b3eb98a0d6b7
18c2c16a209e
82bb6b307f6e
1ab0200029d7
598ff14945ba
f4b333719d2d
1cb429220472
c6e1684bf2c8
11c00cc9a713
0914dd1fa666
16dfd95dc305
815693a995c8
4d3267b2340d
7706db50eda8
e415f74dc6bd
ace56bc942aa
879a515a576a
909a5b87fee0

這樣咱們根據id來刪除全部的容器:
[root@node02 _data]# docker rm -f $(docker ps -q -a)
50653a8fd0db
2b3a8ab12600
603494fada81
a63d1c647fc4
ea028db62306
b2bd8d583859
c754e6a5b7e8
b3eb98a0d6b7
18c2c16a209e
82bb6b307f6e
1ab0200029d7
598ff14945ba
f4b333719d2d
1cb429220472
c6e1684bf2c8
11c00cc9a713
0914dd1fa666
16dfd95dc305
815693a995c8
4d3267b2340d
7706db50eda8
e415f74dc6bd
ace56bc942aa
879a515a576a
909a5b87fee0
[root@node02 _data]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@node02 _data]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@node02 _data]# 
全部的容器都已經刪除了:
[root@node02 _data]# pwd
/var/lib/docker/volumes/nginx-vol/_data
[root@node02 _data]# ls
50x.html  index.html  nginx-vol.html
[root@node02 _data]# docker volume ls
DRIVER              VOLUME NAME
local               e14da5a9196841c146833cb8e71c8e0138257dd6d0601f267e91e91abdd3a8aa
local               nginx-vol

可是咱們nginx-vol 這個數據卷還在,這樣的話,咱們再建立一個容器,指定數據卷路徑爲nginx-vol 的話,仍是能夠訪問的

[root@node02 volumes]# !1017
docker container run -d -it -p 8800:80 --name=nginx-vol-test2 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
6fef45218a46e6bf1304113c6899a9baea9ebdbbc629059488e76ea111d252f1
咱們在瀏覽器上輸入:http://10.10.200.97:8800/nginx-vol.html仍是能夠出現咱們的html頁面,
同時我麼你能夠多個鏡像共用這一個數據卷的數據的,
上面咱們src 要是沒有指定數據卷名稱的話,這裏他會自動建立一個匿名卷(一串字符串),也就是說這裏分有名卷和匿名卷
官方文檔:https://docs.docker.com/engine/admin/volumes/volumes/#start-a-container-with-a-volume


咱們可使用如下命令來刪除清理數據卷
[root@node02 volumes]# docker volume ls
DRIVER              VOLUME NAME
local               1a22651fb87dd211bbd2156ce645225d6127edd00150bd879d20f5d9f3490762
local               1b54af29a1eb19e7a359b44793b19c7b049801c4ffe475dac4f9cebfcc47cde4
local               20e91019905da93898d6491de200f471f3251d9e2900263859fad9ef30989737
local               2e1ac775ad2d475af68d9e78b94ecf0d0ef07b1031a77fc90704020de4a9f54f
local               76052c2502fae1f858c28a6be02c4f3982d320ec3bb3c77534f57bb2fe8da1c7
local               7f397b7401f21a985c40376908dd8d8ebcf9a8d7c79093f23b2e718485f0032b
local               a326fce6d638fc2d8971f8b00880eea8c376c9e7bdd45ef323a8ea764939afee
local               adb8cc97e3ac4d782d3098fdf828f6ca2d108153c4c8d437f02e939e101dbb99
local               d93c61ffe74cfea942f6edaa42747506ffbec29feda846f9a93a22a1db79652e
local               e14da5a9196841c146833cb8e71c8e0138257dd6d0601f267e91e91abdd3a8aa
local               nginx-vol
[root@node02 volumes]# docker volume rm nginx-vol
Error response from daemon: unable to remove volume: remove nginx-vol: volume is in use - [6fef45218a46e6bf1304113c6899a9baea9ebdbbc629059488e76ea111d252f1]
[root@node02 volumes]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
6fef45218a46        nginx               "nginx -g 'daemon of…"   6 minutes ago       Up 6 minutes        0.0.0.0:8800->80/tcp   nginx-vol-test2
[root@node02 volumes]# docker container stop nginx-vol-test2
nginx-vol-test2
[root@node02 volumes]# docker volume rm nginx-vol
Error response from daemon: unable to remove volume: remove nginx-vol: volume is in use - [6fef45218a46e6bf1304113c6899a9baea9ebdbbc629059488e76ea111d252f1]
[root@node02 volumes]# docker container rm nginx-test
Error: No such container: nginx-test
[root@node02 volumes]# docker container rm nginx-vol-test2
nginx-vol-test2
[root@node02 volumes]# docker volume rm nginx-vol
nginx-vol

刪除數據倦怠額時候,這裏咱們必定要保證沒有容器使用,因此這裏我麼得先停了使用這個數據卷的容器,而後刪除這個容器(這一步沒有想明白),最後才能夠刪除數據卷

Bind Mounts:

這個就是綁定宿主機中自己就存在的一個目錄,而後掛載到容器中(不須要想以前volume同樣去建立數據卷什麼的,bind mounts方式是宿主機自己就存在的目錄)

用卷建立一個容器:
# docker run -d -it --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
# docker run -d -it --name=nginx-test -v /app/wwwroot:/usr/share/nginx/html nginx
驗證綁定:
# docker inspect nginx-test
清理:
# docker container stop nginx-test
# docker container rm nginx-test
注意:
1. 若是源文件/目錄沒有存在,不會自動建立,會拋出一個錯誤。
2. 若是掛載目標在容器中非空目錄,則該目錄現有內容將被隱藏。
官方文檔: https://docs.docker.com/engine/admin/volumes/bind-mounts/#start-a-container-with-a-bind-mount
總結:

Volume 特色:
  多個容器以前共享數據

  當容器中止或者移除的時候,該卷仍是存在的、

  多個容器能夠同時掛載相同的數據卷

  當明確刪除數據卷的時候,卷纔會被刪除(保證無容器使用狀況下才可操做)

  將容器的數據存儲到遠程主機或者其餘的存儲上

  將數據從一臺Docker主機遷移到另一臺的時候,先中止容器,而後備份卷的目錄(/var/lib/docker/volumes/)

Bind Mountst特色:

  從主機共享配置文件到容器,默認狀況下,掛載主機的/etc/resolv.conf到每個容器,提供DNS解析

  在Docker主機上的開發環境和容器之間共享源代碼,例如,能夠將Maven target 目錄掛載到容器中,每次Docker主機上構建Maven項目的時候,容器均可以訪問構建的額項目包

  當Docker主機的文件或者目錄結構保證和容器所須要的綁定掛載一致的時候

 博客總結來源於:http://edu.51cto.com/course/10659.html

相關文章
相關標籤/搜索