Docker数据管理python
容器中的管理数据主要有两种方式:nginx
方式 | 描述 | 特性 |
---|---|---|
1:数据卷(Data Volumes) | 容器内数据直接映射到本地主机的目录,相似于挂载 | 1:数据卷能够在容器之间共享和重用 2:对数据卷内数据的修改会立马生效,不管是容器内操做仍是本地操做 3:对数据卷的更新不会影响镜像,解耦开应用和数据 4:卷会一直存在,直到没有容器使用,能够安全地卸载它 |
2:数据卷容器(Data Volume Containers) | 使用特定容器维护数据卷 | 1:多个容器之间共享一些会持续更新的数据 |
[root@docker ~]# docker volume --help Usage: docker volume COMMAND Manage volumes Commands: create Create a volume inspect Display detailed information on one or more volumes ls List volumes prune Remove all unused local volumes rm Remove one or more volumes 或者: [root@docker ~]# man docker-volume-create #查看子命令
一:数据卷操做web
1:建立数据卷 [root@docker ~]# docker volume create -d local test test #-d, --driver="local" :Specify volume driver name # /var/lib/docker/volumes会有一个建立的数据卷 [root@docker volumes]# ls -l /var/lib/docker/volumes/ total 24 -rw------- 1 root root 32768 Nov 16 13:37 metadata.db drwxr-xr-x 3 root root 18 Nov 16 13:37 test 2:绑定数据卷:在建立容器的时候将主机的本地任意路径 挂载到 容器内做为数据卷 2.1: [root@docker ~]# docker pull training/webapp Using default tag: latest latest: Pulling from training/webapp Image docker.io/training/webapp:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/ e190868d63f8: Pull complete 909cd34c6fd7: Pull complete 0b9bfabab7c1: Pull complete a3ed95caeb02: Pull complete 10bbbc0fc0ff: Pull complete fca59b508e9f: Pull complete e7ae2541b15b: Pull complete 9dd97ef58ce9: Pull complete a4c1b0cb7af7: Pull complete Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d Status: Downloaded newer image for training/webapp:latest 2.2:建立目录 [root@docker ~]# mkdir /webapp 2.3:绑定本地目录/webapp到容器的/opt/webapp目录 [root@docker /]# docker run -d -P --name web --mount type=bind,source=/webapp,destination=/opt/webapp training/webapp python app.py ff6c0af55c8b73fa4b117d067280d53aca423e1bd658b65e445114e85fe6d3da #-P[大写]:在宿主机上经过随机端口映射容器内启用端口 #-d:run the container in the background and print the new container ID #本地目录必须是绝对路径,容器路径没有就会自动建立 #不建议使用training/webapp测试,建立数据卷以后,死活不能再进入容器 #使用 ubuntu@ubuntu:~$ sudo docker run -d -p 82:80 -v /src/webapp:/opt/webapp nginx 245633eb9cea1a5833ff3e6b74b2905f11890f604d7c45e2fc3ec8f6aef2dfc2 ubuntu@ubuntu:~$ docker ps -al CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 245633eb9cea nginx "nginx -g 'daemon of…" 5 seconds ago Up 4 seconds 0.0.0.0:82->80/tcp trusting_goldberg ubuntu@ubuntu:~$ docker exec -it 2456 /bin/bash #进入容器,并打开一个shell交互伪终端 root@245633eb9cea:/# ls bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr root@245633eb9cea:/# cd opt/ root@245633eb9cea:/opt# ls webapp root@245633eb9cea:/opt# cd webapp/ root@245633eb9cea:/opt/webapp# ls root@245633eb9cea:/opt/webapp# touch test root@245633eb9cea:/opt/webapp# echo "I love you " >>test root@245633eb9cea:/opt/webapp# #从新开一个终端 ubuntu@ubuntu:~$ cd /src/webapp/ ubuntu@ubuntu:/src/webapp$ cat test I love you 下面这条命令效果同样:-v参数 #格式: docker -it -v /宿主机绝对路径:/容器内目录 镜像 [root@docker /]# docker run -d -P --name web -v /webapp:/opt/webapp training/webapp python app.py
二:数据卷容器:docker
1:建立一个数据卷容器dbdata,并将其中一个数据卷挂载到容器内的/dbdata [root@docker /]# docker run -it -v /dbdata --name dbdata ubuntu:18.04 root@075058f48803:/# cd /dbdata/ root@075058f48803:/dbdata# ls #v|--volume[=[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]] #The CONTAINER-DIR must be an absolute path such # /dbdata 是容器内的路径 2:使用--volumes-from 来挂载dbdata容器中的数据卷 [root@docker /]# docker run -it --volumes-from dbdata --name db1 ubuntu:18.04 root@47a22834f404:/# ls bin boot dbdata dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@47a22834f404:/# cd /dbdata/ root@47a22834f404:/dbdata# ls [root@docker /]# docker run -it --volumes-from dbdata --name db2 ubuntu:18.04 # 容器db1和容器db2都挂载到同一个数据卷到相同的/dbdata目录,三个容器共享这个目录。 [root@docker /]# docker start 47a22834f404 #启动一个退出的容器 [root@docker /]# docker exec -it 47a22834f404 /bin/bash #进入一个已经运行的容器。
三:利用容器来迁移数据shell
1:备份:使用下面的命令来备份dbdata数据卷容器-内的-数据卷 [root@docker /]# docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu:18.04 tar -cvf /backup/backup.tar /dbdata tar: Removing leading `/' from member names /dbdata/ /dbdata/zz #建立一个容器,挂载,tar包到新建立的容器内,实现迁移 #1:利用ubuntu镜像建立了一个容器worker。使用--volumes-from dbdata参数来让worker容器挂载dbdata容器的数据卷(即dbdata数据卷) #2:使用-v $(pwd):/backup参数来挂载本地的当前目录 到worker容器的/backup目录 #3:worker容器启动后,使用tar cvf /backup/backup.tar /dbdata命令将/dbdata下内容备份为容器内的/backup/backup.tar 2:恢复:若是要恢复数据到一个容器,能够按照下面的操做 #首先建立一个带有数据卷的容器dbdata2 [root@docker /]# docker run -v /dbdata --name dbdata2 ubuntu:18.04 /bin/bash [root@docker /]# ls -l backup.tar #本地当前目录的文件backup.tar -rw-r--r-- 1 root root 10240 Nov 16 14:35 backup.tar [root@docker /]# docker run -itd --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox Digest: sha256:1303dbf110c57f3edf68d9f5a16c082ec06c4cf7604831669faf2c712260b5a0 Status: Downloaded newer image for busybox:latest dbdata/ dbdata/zz #使用-v $(pwd):/backup参数来挂载本地的当前目录 到busybox容器的/backup目录 # 查看/验证恢复的数据,能够再启动一个容器挂载一样的容器卷来查看 [root@docker /]# docker run --volumes-from dbdata2 busybox /bin/ls /dbdata zz docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar