目录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。