Data management for Docker basic learning

  • 2020-05-17 07:17:26
  • OfStack

preface

There are two main ways to manage data in docker container, data volume (Data Volumes) and data volume container (Data Volume Containers).

Data volume

The data volume is a special directory that can be used by the container. It bypasses the file system and provides many useful features:

Data volumes can be Shared and reused between containers;

Changes to the data volume are immediately effective;

Updates to data volumes do not affect mirroring;

Volume 1 will continue to exist until no container is used.

The use of data volumes, similar to that for directories or files under Linux mount Operation.

Mount the local directory into the container


[root@localhost ~]# docker images
REPOSITORY     TAG     IMAGE ID   CREATED    VIRTUAL SIZE
registry      latest    5c929a8b587a  29 hours ago  33.27 MB
genesis_centos    latest    85bc3a58f134  5 days ago   277.6 MB
192.168.1.179:5000/busybox latest    9967c5ad88de  12 days ago   1.093 MB
busybox      latest    9967c5ad88de  12 days ago   1.093 MB
centos-6-x86     latest    8fca9486a39b  13 days ago   341.3 MB
centos_with_net    latest    3e8ea8607f08  4 weeks ago   294.9 MB
centos      latest    9baab0af79c4  6 weeks ago   196.7 MB
[root@localhost ~]# ls /data/
ls:  Don't have access to /data/:  There is no file or directory 
[root@localhost ~]# mkdir /data/
[root@localhost ~]# docker run -itd -v /data/:/data1 centos bash
096460f831bfd72b2efc6ba6b7e7bb060152afa49506ef26e0fa3cb03974f8d5

-v Specifies the mount directory

“:” The previous /data/ is a local directory

“:” The following /data1/ is the directory in the container


[root@localhost ~]# touch /data/1.txt
[root@localhost ~]# echo "test" > /data/1.txt
[root@localhost ~]# docker exec -it 09646 bash
[root@096460f831bf /]# df -h
Filesystem                       Size Used Avail Use% Mounted on
/dev/mapper/docker-253:0-1447735-096460f831bfd72b2efc6ba6b7e7bb060152afa49506ef26e0fa3cb03974f8d5 9.8G 231M 9.0G 3% /
tmpfs                        936M  0 936M 0% /dev
shm                         64M  0 64M 0% /dev/shm
/dev/mapper/VolGroup-lv_root                  35G 6.0G 28G 18% /data1
[root@096460f831bf /]# ls /data1/
1.txt
[root@096460f831bf /]# cat /data1/1.txt
test
[root@096460f831bf /]# touch /data1/2.txt
[root@096460f831bf /]# exit
exit
[root@localhost ~]# ls /data/
1.txt 2.txt

Whether you stop the container or delete it, the data still exists


[root@localhost ~]# docker stop 09646
09646
[root@localhost ~]# ls /data/
1.txt 2.txt
[root@localhost ~]# docker rm 09646
09646
[root@localhost ~]# ls /data/
1.txt 2.txt

Mount the data volume


[root@localhost ~]# docker run -itd -v /data/:/data1 centos bash
e136b27a8e177d878e76c60aafade32df947a60f77b3f95dcaf0680b7ffbc6e8
[root@localhost ~]# docker ps
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES
e136b27a8e17  centos    "bash"    14 seconds ago  Up 13 seconds       tender_euclid

When you mount a directory, you can specify the container name, or you can randomly define it if you don't. For example, if we did not specify it above, we generated a name tender_euclid, which can be used by the command Docker ps Look at the far right column.


[root@localhost ~]# docker run -itd --volumes-from tender_euclid centos bash
3222c7c5c45687e0650b699a9291bc50ecc85030acf8f388c1c6a50b0dc67164

So we created the new container using the centos image and used the data volume of the tender_euclid container.


[root@localhost ~]# docker ps
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES
3222c7c5c456  centos    "bash"    26 seconds ago  Up 25 seconds       sick_albattani
e136b27a8e17  centos    "bash"    6 minutes ago  Up 6 minutes       tender_euclid
[root@localhost ~]# docker exec -it 3222 bash
[root@3222c7c5c456 /]# df -h
Filesystem                       Size Used Avail Use% Mounted on
/dev/mapper/docker-253:0-1447735-3222c7c5c45687e0650b699a9291bc50ecc85030acf8f388c1c6a50b0dc67164 9.8G 231M 9.0G 3% /
tmpfs                        936M  0 936M 0% /dev
shm                         64M  0 64M 0% /dev/shm
/dev/mapper/VolGroup-lv_root                  35G 6.0G 28G 18% /data1
[root@3222c7c5c456 /]# ls /data1/
1.txt 2.txt
[root@3222c7c5c456 /]# touch /data1/3.txt
[root@3222c7c5c456 /]# ls -l /data1/
total 4
-rw-r--r--. 1 root root 5 Oct 20 05:53 1.txt
-rw-r--r--. 1 root root 0 Oct 20 05:59 2.txt
-rw-r--r--. 1 root root 0 Oct 20 06:31 3.txt
[root@3222c7c5c456 /]# exit
exit
[root@localhost ~]# ls /data/
1.txt 2.txt 3.txt

Data volume container

Define the data volume container

Sometimes we need multiple containers to share data with each other, like NFS in linux. So you can set up a dedicated data volume container, and then the other containers mount the data volume directly.

First, create the data volume container


[root@localhost ~]# docker run -itd -v /data/ --name cent_testv centos bash
fb45150dbc218e71ff07eca44be3603e004e01b94effcca14c2bd8b3a998f096

Note: the /data/ here is the container's /data directory, not the local /data/ directory


[root@localhost ~]# docker ps
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES
fb45150dbc21  centos    "bash"    8 minutes ago  Up 8 minutes       cent_testv
3222c7c5c456  centos    "bash"    52 minutes ago  Up 52 minutes       sick_albattani
e136b27a8e17  centos    "bash"    58 minutes ago  Up 58 minutes       tender_euclid

[root@localhost ~]# docker exec -it cent_testv bash
[root@fb45150dbc21 /]# df -h
Filesystem                       Size Used Avail Use% Mounted on
/dev/mapper/docker-253:0-1447735-fb45150dbc218e71ff07eca44be3603e004e01b94effcca14c2bd8b3a998f096 9.8G 231M 9.0G 3% /
tmpfs                        936M  0 936M 0% /dev
shm                         64M  0 64M 0% /dev/shm
/dev/mapper/VolGroup-lv_root                  35G 6.0G 28G 18% /data
[root@fb45150dbc21 /]# ls /data/
[root@fb45150dbc21 /]# exit
exit
[root@localhost ~]# ls /data/
1.txt 2.txt 3.txt

Other containers mount the data volume


[root@localhost ~]# docker run -itd --volumes-from cent_testv centos bash
0a80861145c9a2627618a78db2b7225eba64137d4664d3706e02c1c623cde5e3

Note: the container of the data volume mounted using the wok with the hang volumes-from parameter does not need to be running itself


[root@localhost ~]# touch /data/1.txt
[root@localhost ~]# echo "test" > /data/1.txt
[root@localhost ~]# docker exec -it 09646 bash
[root@096460f831bf /]# df -h
Filesystem                       Size Used Avail Use% Mounted on
/dev/mapper/docker-253:0-1447735-096460f831bfd72b2efc6ba6b7e7bb060152afa49506ef26e0fa3cb03974f8d5 9.8G 231M 9.0G 3% /
tmpfs                        936M  0 936M 0% /dev
shm                         64M  0 64M 0% /dev/shm
/dev/mapper/VolGroup-lv_root                  35G 6.0G 28G 18% /data1
[root@096460f831bf /]# ls /data1/
1.txt
[root@096460f831bf /]# cat /data1/1.txt
test
[root@096460f831bf /]# touch /data1/2.txt
[root@096460f831bf /]# exit
exit
[root@localhost ~]# ls /data/
1.txt 2.txt
0

[root@localhost ~]# touch /data/1.txt
[root@localhost ~]# echo "test" > /data/1.txt
[root@localhost ~]# docker exec -it 09646 bash
[root@096460f831bf /]# df -h
Filesystem                       Size Used Avail Use% Mounted on
/dev/mapper/docker-253:0-1447735-096460f831bfd72b2efc6ba6b7e7bb060152afa49506ef26e0fa3cb03974f8d5 9.8G 231M 9.0G 3% /
tmpfs                        936M  0 936M 0% /dev
shm                         64M  0 64M 0% /dev/shm
/dev/mapper/VolGroup-lv_root                  35G 6.0G 28G 18% /data1
[root@096460f831bf /]# ls /data1/
1.txt
[root@096460f831bf /]# cat /data1/1.txt
test
[root@096460f831bf /]# touch /data1/2.txt
[root@096460f831bf /]# exit
exit
[root@localhost ~]# ls /data/
1.txt 2.txt
1

Migrate data using data volume containers

A backup of the data volume


[root@localhost ~]# touch /data/1.txt
[root@localhost ~]# echo "test" > /data/1.txt
[root@localhost ~]# docker exec -it 09646 bash
[root@096460f831bf /]# df -h
Filesystem                       Size Used Avail Use% Mounted on
/dev/mapper/docker-253:0-1447735-096460f831bfd72b2efc6ba6b7e7bb060152afa49506ef26e0fa3cb03974f8d5 9.8G 231M 9.0G 3% /
tmpfs                        936M  0 936M 0% /dev
shm                         64M  0 64M 0% /dev/shm
/dev/mapper/VolGroup-lv_root                  35G 6.0G 28G 18% /data1
[root@096460f831bf /]# ls /data1/
1.txt
[root@096460f831bf /]# cat /data1/1.txt
test
[root@096460f831bf /]# touch /data1/2.txt
[root@096460f831bf /]# exit
exit
[root@localhost ~]# ls /data/
1.txt 2.txt
2

First we need to open a new container using the cent_testv data volume, and we also need to mount the local /vol_data_backup/ directory under the container's /backup, so that we can see the new files in the container /backup/directory directly in /vol_data_backup/ directory. Then package the files under /data/ into the data.tar files under /backup.


[root@localhost ~]# docker exec -it 4f5bf bash
[root@4f5bf6f33f2c /]# df -h
Filesystem                       Size Used Avail Use% Mounted on
/dev/mapper/docker-253:0-1447735-4f5bf6f33f2c78197e54e5145824e98bf89d802376e83019c2913b336fbd9d20 9.8G 231M 9.0G 3% /
tmpfs                        936M  0 936M 0% /dev
shm                         64M  0 64M 0% /dev/shm
/dev/mapper/VolGroup-lv_root                  35G 6.0G 28G 18% /data
[root@4f5bf6f33f2c /]# ls /backup/
[root@4f5bf6f33f2c /]# ls /data/
fight.txt

[root@4f5bf6f33f2c /]# tar cvf /backup/data.tar /data/
tar: Removing leading `/' from member names
/data/
/data/fight.txt
[root@4f5bf6f33f2c /]# exit
exit
[root@localhost ~]# ls /vol_data_backup/
data.tar

restore

Create a new data volume container, build a new container, mount the data volume container, and unpack tar.


[root@localhost ~]# touch /data/1.txt
[root@localhost ~]# echo "test" > /data/1.txt
[root@localhost ~]# docker exec -it 09646 bash
[root@096460f831bf /]# df -h
Filesystem                       Size Used Avail Use% Mounted on
/dev/mapper/docker-253:0-1447735-096460f831bfd72b2efc6ba6b7e7bb060152afa49506ef26e0fa3cb03974f8d5 9.8G 231M 9.0G 3% /
tmpfs                        936M  0 936M 0% /dev
shm                         64M  0 64M 0% /dev/shm
/dev/mapper/VolGroup-lv_root                  35G 6.0G 28G 18% /data1
[root@096460f831bf /]# ls /data1/
1.txt
[root@096460f831bf /]# cat /data1/1.txt
test
[root@096460f831bf /]# touch /data1/2.txt
[root@096460f831bf /]# exit
exit
[root@localhost ~]# ls /data/
1.txt 2.txt
4

conclusion

docker provides full support for data management, and using data volume containers is a good option. The above is the entire content of this article, I hope to help you with your study or work, if you have any questions, you can leave a message to communicate.


Related articles: