目錄html
Docker已經上市不少年,不是什麼新鮮事物了,不少企業或者開發同窗之前也很少很多有所接觸,可是有實操經驗的人很少,本系列教程主要偏重實戰,儘可能講乾貨,會根據本人理解去作闡述,具體官方概念能夠查閱官方教程,由於本系列教程對前一章節有必定依賴,建議先學習前面章節內容。mysql
本系列教程導航:
Docker深刻淺出系列 | 容器初體驗
Docker深刻淺出系列 | Image實戰演練
Docker深刻淺出系列 | 單節點多容器網絡通訊sql
教程目的:docker
Docker容器對於宿主機器來講只是一個運行在Linux上的應用,所以它的數據存儲仍是會依賴宿主機器,Docker是經過掛載宿主機文件系統或內存的方式來實現數據存儲的,掛載方式有三種:volume、bind mount和tmpfs。數據庫
/var/lib/docker/volumes
)來存儲數據,其餘非docker進程是不能修改該路徑下的文件,徹底由docker來管理Volumes 是Docker推薦的掛載方式,與把數據存儲在容器的可寫層相比,使用Volume能夠避免增長容器的容量大小,還可使存儲的數據與容器的生命週期獨立。tomcat
-v
方式默認狀況下,docker會幫咱們建立一個隨機命名的volume安全
1.利用咱們前面章節下載的image,建立一個容器,命名爲mysql01
bash
[root@localhost /]# docker run -d --name mysql01 -e MYSQL_ROOT_PASSWORD=evan123 mysql 4dc868313a330840a833d78a1a88462bcfa4562f61f7da5dcecc9a57290bcb82
2.咱們能夠看看容器到底有沒有自動幫咱們建立一個volumes網絡
[root@localhost /]# docker volume ls DRIVER VOLUME NAME local cc439258feb4817e1ecfa1f6969613f3e84be9a4499819ec7386f7e443eb6c54
經過上面的輸出結果能夠看到,docker 默認幫我建立了一個volume,而且隨機起了一個看不懂的名字性能
3.經過docker inspect
查看volume詳細信息
[root@localhost /]# docker inspect cc439258feb4817e1ecfa1f6969613f3e84be9a4499819ec7386f7e443eb6c54 [ { "CreatedAt": "2020-02-26T07:39:49Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/cc439258feb4817e1ecfa1f6969613f3e84be9a4499819ec7386f7e443eb6c54/_data", "Name": "cc439258feb4817e1ecfa1f6969613f3e84be9a4499819ec7386f7e443eb6c54", "Options": null, "Scope": "local" } ]
從上面volume詳情能夠了解到,如今容器的數據是掛在在宿主機器上 /var/lib/docker/
目錄下, scope
是本地
4.經過-v
指定容器volume的名字,使用咱們自定義的一個可讀的名字
[root@localhost /]# docker run -d --name mysql02 -v evan_volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=evan124 mysql 4d51b14837ab8564b878043420ea923565bafe90880eaa7bf362dbc35c7f756c
5.再次查看下volume是否建立成功
[root@localhost /]# docker volume ls DRIVER VOLUME NAME local cc439258feb4817e1ecfa1f6969613f3e84be9a4499819ec7386f7e443eb6c54 local evan_volume
剛纔建立的volume已經成功了
6.再查看下volume的詳細信息
[root@localhost /]# docker inspect evan_volume [ { "CreatedAt": "2020-02-26T11:00:02Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/evan_volume/_data", "Name": "evan_volume", "Options": null, "Scope": "local" } ]
從上面信息能夠看到,容器已經成功掛載宿主機器上的evan_volume
--mount
方式-v
能作的--mount
指令均可以作,與-v
指令對比,--mount
指令更靈活,支持更多複雜操做,而且不須要嚴格按照參數順序,經過key value鍵值對方式進行配置,可讀性更高。
--mount
有如下幾個參數:
src
dst
或者 target
1.建立一個容器,命名爲mysql-mount,指定volume名爲mysql-mount
[root@localhost /]# docker run --name mysql-mount -e MYSQL_ROOT_PASSOWRD=evan123 --mount type=volume,source=mysql-mount,target=/var/lib/mysql mysql 2020-02-26 12:09:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.19-1debian9 started. 2020-02-26 12:09:37+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' 2020-02-26 12:09:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.19-1debian9 started. 2020-02-26 12:09:37+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
2.查看volume是否建立成功
[root@localhost /]# docker volume ls DRIVER VOLUME NAME local cc439258feb4817e1ecfa1f6969613f3e84be9a4499819ec7386f7e443eb6c54 local evan_volume local mysql-mount local myvol2 local myvol3
從上面查詢結果能夠看出來,mysql-mount已經建立成功
3.查看宿主機器是否存在對應的目錄
"Mounts": [ { "Type": "volume", "Name": "mysql-mount", "Source": "/var/lib/docker/volumes/mysql-mount/_data", "Destination": "/var/lib/mysql", "Driver": "local", "Mode": "z", "RW": true, "Propagation": "" } ]
從輸出結果能夠看到,經過--mount
能夠實現跟-v
一樣的操做結果,數據也綁定宿主機器上docker路徑對應目錄
與volumes相比,bind mount的功能有限。 使用綁定安裝時,會將主機上的文件或目錄安裝到容器中。 文件或目錄由主機上的完整或相對路徑引用。 相比之下,當您使用volume時,將在主機上Docker的存儲目錄中建立一個新目錄,而且Docker管理該目錄的內容。
該文件或目錄不須要在Docker主機上已經存在。 若是尚不存在,則按需建立。 bind mounts性能很是好,可是它們依賴於具備特定目錄結構的主機文件系統。 若是要開發新的Docker應用程序,請考慮使用命名volume。 您不能使用Docker CLI命令直接管理bind mounts
1.建立一個tomcat容器,命名爲tomcat-bind
,掛載宿主機器路徑爲/tmp
[root@localhost /]# docker run -d --name tomcat-bind --mount type=bind,source=/tmp,target=/user/local tomcat 3dab7d9f469b231ff68072ff8b910e25270c1ab28a944efc0a2b0c9c321e57df
2.經過docker inspect tomcat-mount
查看容器信息
"Mounts": [ { "Type": "bind", "Source": "/tmp", "Destination": "/user/local", "Mode": "", "RW": true, "Propagation": "rprivate" } ],
能夠看到容器已經成功掛載到宿主機器上的/tmp
目錄,而不是前面咱們演示的docker管理路徑下
使用tmpfs不會持久化數據,數據只會存放在宿主機器內存中
1.建立一個tomcat容器,命名爲tomcat-tmps
,指定掛載方式爲temps
[root@localhost /]# docker run -d --name tomcat-tmpfs --mount type=tmpfs,target=/tmp tomcat fdf6c8a7ae067db01ed97dc3c3a6903f615a8b687e9b06cd70218a0e8a2d6bf4
2.咱們經過docker container inspect tomcat-tmpfs
查看下是否會建立任務目錄在宿主機器
"Mounts": [ { "Type": "tmpfs", "Source": "", "Destination": "/tmp", "Mode": "", "RW": true, "Propagation": "" } ],
從上面輸出結果能夠看到,宿主機器上並無任何目錄,只是在目標路徑也就是容器裏指定了/tmp
做爲數據存儲路徑
思路:咱們嘗試在mysql容器建立一個數據庫,而後退出後把容器刪除掉,再建立一個新的容器,數據存儲路徑指向同一個volume,觀察是否在新的容器能夠看到上一個容器建立好的數據庫
1.進入咱們上面建立的mysql
[root@localhost /]# docker exec -it mysql01 bash
2.建立數據庫eshare
mysql> create database eshare -> ; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | eshare | | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)
從輸出結果能夠看到,數據庫已經建立成功
3.退出容器,刪除mysyql01容器
mysql> exit Bye root@4dc868313a33:/# exit exit [root@localhost /]# docker container rm -f mysql01 mysql01
容器mysql01已經順利刪除
4.查看mysql01掛載的volume是否還在
[root@localhost /]# docker volume ls DRIVER VOLUME NAME local cc439258feb4817e1ecfa1f6969613f3e84be9a4499819ec7386f7e443eb6c54 local evan_volume local mysql-mount local myvol2 local myvol3
能夠看到,對應的volume還在
DRIVER VOLUME NAME local cc439258feb4817e1ecfa1f6969613f3e84be9a4499819ec7386f7e443eb6c54
5.建立一個新mysql容器,命名爲mysql-volume,而且綁定mysql01的volume
[root@localhost /]# docker run -d --name mysql-volume -v cc439258feb4817e1ecfa1f6969613f3e84be9a4499819ec7386f7e443eb6c54:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=evan123 mysql 360127340b462c3539f158c776aef03fd8f58c5a2aafdd622e0f1c161a1bd189
6.驗證新的容器mysql-volume 中,是否存在已經建立好的數據庫eshare
[root@localhost /]# docker exec -it mysql-volume bash root@360127340b46:/# mysql -uroot -pevan123 mysql> show databases; +--------------------+ | Database | +--------------------+ | eshare | | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)
從上面輸出結果能夠看到,新的容器已經存在以前建立好的數據庫,這就證實了docker不只能夠持久化數據,而且不一樣容器還能夠共享同一個volume。