1. Docker持久化数据的方案
基于本地文件系统的Volume。可以在执行Docker create或Docker run时,通过-v参数将主机的目录作为容器的数据卷。这部分功能便是基于本地文件系系统的volume管理。基于plugin的Volume,支持第三方的存储方案,比如NAS,aws。
2. Volume的类型
- 受管理的data Volume,由docker后台自动创建。
- 绑定挂载的Volune,具体挂载位置可以由用户指定。
3. Data Volume
创建mysql容器
[vagrant@docker-host ~]$ sudo docker run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
查看docker volume
[vagrant@docker-host ~]$ docker volume lsDRIVER VOLUME NAMElocal f1c4118d0960cb957470a149af3c4f46fcb1f501ed7e675c0babb6dd364b5eee[vagrant@docker-host ~]$ docker volume inspect f1c4118d0960cb957470a149af3c4f46fcb1f501ed7e675c0babb6dd364b5eee[{"CreatedAt": "2019-11-16T02:41:04Z","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/f1c4118d0960cb957470a149af3c4f46fcb1f501ed7e675c0babb6dd364b5eee/_data","Name": "f1c4118d0960cb957470a149af3c4f46fcb1f501ed7e675c0babb6dd364b5eee","Options": null,"Scope": "local"}]
会发现多出一个VOLUME,这个就是mysql容器的外部数据卷。 mysql容器外部数据卷目录: /var/lib/docker/volumes/f1c4118d0960cb957470a149af3c4f46fcb1f501ed7e675c0babb6dd364b5eee/_data
删除mysql容器
[vagrant@docker-host ~]$ docker stop mysqlmysql[vagrant@docker-host ~]$ docker rm mysqlmysql
再次查看volume
[vagrant@docker-host ~]$ docker volume lsDRIVER VOLUME NAMElocal f1c4118d0960cb957470a149af3c4f46fcb1f501ed7e675c0babb6dd364b5eee
可以发现容器删除后,volume还是存在的。这样确保了数据丢失的问题。
删除volume
[vagrant@docker-host ~]$ docker volume rm f1c4118d0960cb957470a149af3c4f46fcb1f501ed7e675c0babb6dd364b5eeef1c4118d0960cb957470a149af3c4f46fcb1f501ed7e675c0babb6dd364b5eee
创建容器并且指定volume名称与容器内部存放数据的路径
[vagrant@docker-host ~]$ sudo docker run -d -v mysql:/var/lib/mysql --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysqlf57c6983d307a66db5597a2720236321b95d3744455b07770784499cc11f6c8c[vagrant@docker-host ~]$ docker volume lsDRIVER VOLUME NAMElocal mysql[vagrant@docker-host ~]$ docker volume inspect mysql[{"CreatedAt": "2019-11-16T02:53:14Z","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/mysql/_data","Name": "mysql","Options": null,"Scope": "local"}]
volume的复用
[vagrant@docker-host ~]$ docker stop mysqlmysql[vagrant@docker-host ~]$ docker rm mysqlmysql[vagrant@docker-host ~]$ sudo docker run -d -v mysql:/var/lib/mysql --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql9334e575f98766a56b37d84a800c2673137289d3cc49e7e74c200d9b9173b167[vagrant@docker-host ~]$ docker volume lsDRIVER VOLUME NAMElocal mysql
删除mysql容器 创建mysql2容器指定使用mysql容器的volume 实践步骤:
- 进入mysql容器的mysql数据库中添加一个
数据库- 退出mysql容器并删除mysql容器
- 创建mysql2容器并指定volume为mysql的volume
- 进入mysql2容器的mysql数据库中查看 1 操作的数据库是否存在
4. Bind Mouting
将本地文件目录与容器文件目录进行绑定/映射,本地文件目录下文件修改 容器文件目录下文件也会修改,容器文件目录下文件修改 本地文件目录下文件也会修改。
Dockerfile创建镜像
dockerfile文件
# this same shows how we can extend/change an existing official image from Docker HubFROM nginx:latest# highly recommend you always pin versions for anything beyond dev/learnWORKDIR /usr/share/nginx/html# change working directory to root of nginx webhost# using WORKDIR is prefered to using 'RUN cd /some/path'COPY index.html index.html# I don't have to specify EXPOSE or CMD because they're in my FROM
index.html文件
<!doctype html><html lang="en"><head><meta charset="utf-8"><title>hello</title></head><body><h1>Hello Docker! </h1></body></html>
创建镜像
[vagrant@docker-host docker-nginx]$ docker build -t wenxudong/nginx .Sending build context to Docker daemon 3.072kBStep 1/3 : FROM nginx:latestlatest: Pulling from library/nginx8d691f585fa8: Pull complete5b07f4e08ad0: Pull completeabc291867bca: Pull completeDigest: sha256:922c815aa4df050d4df476e92daed4231f466acc8ee90e0e774951b0fd7195a4Status: Downloaded newer image for nginx:latest---> 540a289bab6cStep 2/3 : WORKDIR /usr/share/nginx/html---> Running in 602a1a4c4decRemoving intermediate container 602a1a4c4dec---> 745743e7e234Step 3/3 : COPY index.html index.html---> c8191f8fedbaSuccessfully built c8191f8fedbaSuccessfully tagged wenxudong/nginx:latest[vagrant@docker-host docker-nginx]$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEwenxudong/nginx latest c8191f8fedba About a minute ago 126MBnginx latest 540a289bab6c 3 weeks ago 126MB
创建容器并且映射文件
# 查看当前目录下的文件[vagrant@docker-host docker-nginx]$ lsDockerfile index.html# 创建目录[vagrant@docker-host docker-nginx]$ docker run -d -p 80:80 -v $(pwd):/usr/share/nginx/html --name web wenxudong/nginx35eb4452adcea5e6932838a69d840efe7ed0fe065535f4d18e98ed47074821e5
-v $(pwd):/usr/share/nginx/html将当前目录映射到web容器的/usr/share/nginx/html目录
验证Bind Mouting
# 进入容器[vagrant@docker-host docker-nginx]$ docker exec -it web /bin/bashroot@35eb4452adce:/usr/share/nginx/html# cd /usr/share/nginx/htmlroot@35eb4452adce:/usr/share/nginx/html# lsDockerfile index.htmlroot@35eb4452adce:/usr/share/nginx/html# touch test.txtroot@35eb4452adce:/usr/share/nginx/html# lsDockerfile index.html test.txt# 退出容器root@35eb4452adce:/usr/share/nginx/html# exitexit# 再次查看当前目录下的文件[vagrant@docker-host docker-nginx]$ lsDockerfile index.html test.txt[vagrant@docker-host docker-nginx]$ touch test2.txt# 进入容器[vagrant@docker-host docker-nginx]$ docker exec -it web /bin/bashroot@35eb4452adce:/usr/share/nginx/html# lsDockerfile index.html test.txt test2.txt
