Docker 容器内添加数据卷的2种方式

1、容器数据卷是什么?

  • 容器的持久化
  • 容器间继承 + 共享数据

卷 就是 目录或文件,存在于一个或多个容器中,由docker挂载到容器中,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。

卷的设计的目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

特点:
1:数据卷可以在容器之间共享或重用数据
2:卷中的更改可以直接生效
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命令周期默认会一直存在,即使容器被删除。

2、容器内 添加数据卷的2种方式

  • 直接命令添加
  • DockerFile 添加

3、直接命令添加

定义3个终端:

  1. 终端host
  2. 终端container
  3. 终端test

3.1、命令

格式:
docker run -it -v /宿主机绝对目录:/容器内目录 镜像名

示例:

docker run -it -v /myDataVolume:/dataVolumerContainer centos

终端host:

查看根据目录

[root@localhost java]# ls -l
total 12
-rw-r--r--.   1 root root 12030 Oct  6 19:15 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Oct  6 19:14 bin -> usr/bin
drwxr-xr-x.   5 root root   360 Nov 25 06:56 dev
drwxr-xr-x.   1 root root    66 Nov 25 06:56 etc
drwxr-xr-x.   2 root root     6 Apr 11  2018 home
lrwxrwxrwx.   1 root root     7 Oct  6 19:14 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 Oct  6 19:14 lib64 -> usr/lib64
drwxr-xr-x.   2 root root     6 Apr 11  2018 media
drwxr-xr-x.   2 root root     6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root     6 Apr 11  2018 opt
dr-xr-xr-x. 274 root root     0 Nov 25 06:56 proc
dr-xr-x---.   2 root root   114 Oct  6 19:15 root
drwxr-xr-x.  10 root root   130 Oct  6 19:15 run
lrwxrwxrwx.   1 root root     8 Oct  6 19:14 sbin -> usr/sbin
drwxr-xr-x.   2 root root     6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root     0 Nov 25 06:17 sys
drwxrwxrwt.   7 root root   132 Oct  6 19:15 tmp
drwxr-xr-x.  13 root root   155 Oct  6 19:14 usr
drwxr-xr-x.  18 root root   238 Oct  6 19:14 var

终端test:
验证是否有容器运行

[root@localhost java]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

终端container

查看根据目录

[root@localhost java]# ls -l
total 12
-rw-r--r--.   1 root root 12030 Oct  6 19:15 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Oct  6 19:14 bin -> usr/bin
drwxr-xr-x.   5 root root   360 Nov 25 06:56 dev
drwxr-xr-x.   1 root root    66 Nov 25 06:56 etc
drwxr-xr-x.   2 root root     6 Apr 11  2018 home
lrwxrwxrwx.   1 root root     7 Oct  6 19:14 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 Oct  6 19:14 lib64 -> usr/lib64
drwxr-xr-x.   2 root root     6 Apr 11  2018 media
drwxr-xr-x.   2 root root     6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root     6 Apr 11  2018 opt
dr-xr-xr-x. 274 root root     0 Nov 25 06:56 proc
dr-xr-x---.   2 root root   114 Oct  6 19:15 root
drwxr-xr-x.  10 root root   130 Oct  6 19:15 run
lrwxrwxrwx.   1 root root     8 Oct  6 19:14 sbin -> usr/sbin
drwxr-xr-x.   2 root root     6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root     0 Nov 25 06:17 sys
drwxrwxrwt.   7 root root   132 Oct  6 19:15 tmp
drwxr-xr-x.  13 root root   155 Oct  6 19:14 usr
drwxr-xr-x.  18 root root   238 Oct  6 19:14 var

通过上述3个终端,验证了:根目录下没有 dataVolumerContainer目录,并且也没有容器在运行。

下面的步骤是创建并运行一个带数据卷的容器,并再次查看目录
终端container :

root@localhost java]# docker run -it -v /myDataVolume:/dataVolumerContainer centos
[root@68c12f6d555c /]# ls -l
total 12
-rw-r--r--.   1 root root 12030 Oct  6 19:15 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Oct  6 19:14 bin -> usr/bin
drwxr-xr-x.   2 root root     6 Nov 25 07:01 dataVolumerContainer
drwxr-xr-x.   5 root root   360 Nov 25 07:01 dev
drwxr-xr-x.   1 root root    66 Nov 25 07:01 etc
drwxr-xr-x.   2 root root     6 Apr 11  2018 home
lrwxrwxrwx.   1 root root     7 Oct  6 19:14 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 Oct  6 19:14 lib64 -> usr/lib64
drwxr-xr-x.   2 root root     6 Apr 11  2018 media
drwxr-xr-x.   2 root root     6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root     6 Apr 11  2018 opt
dr-xr-xr-x. 277 root root     0 Nov 25 07:01 proc
dr-xr-x---.   2 root root   114 Oct  6 19:15 root
drwxr-xr-x.  10 root root   130 Oct  6 19:15 run
lrwxrwxrwx.   1 root root     8 Oct  6 19:14 sbin -> usr/sbin
drwxr-xr-x.   2 root root     6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root     0 Nov 25 06:17 sys
drwxrwxrwt.   7 root root   132 Oct  6 19:15 tmp
drwxr-xr-x.  13 root root   155 Oct  6 19:14 usr
drwxr-xr-x.  18 root root   238 Oct  6 19:14 var
[root@68c12f6d555c dataVolumerContainer]# ls
[root@68c12f6d555c dataVolumerContainer]# ll
total 0
[root@68c12f6d555c dataVolumerContainer]# pwd
/dataVolumerContainer

创建并运行一个端数据卷的容器,并且根目录中增加了 dataVolumerContainer目录。

终端host:

[root@localhost /]# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  myDataVolume  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@localhost /]# cd myDataVolume/
[root@localhost myDataVolume]# ls

终端test:
验证是否有容器运行

[root@localhost java]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost java]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
68c12f6d555c        centos              "/bin/bash"         6 seconds ago       Up 5 seconds    

3.2、查看数据卷是否挂载成功

终端test:

[root@localhost java]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
68c12f6d555c        centos              "/bin/bash"         6 seconds ago       Up 5 seconds                            vibrant_mclean
[root@localhost java]# docker inspect 68c12f6d555c
......内容省略......
[root@localhost java]# 

3.3、容器和宿主机之间数据共享

终端host:创建文件 host.txt

[root@localhost myDataVolume]# touch host.txt
[root@localhost myDataVolume]# ll
总用量 0
-rw-r--r--. 1 root root 0 11月 25 15:19 host.txt

终端container,查看并编辑 host.txt

[root@68c12f6d555c dataVolumerContainer]# ll
total 0
-rw-r--r--. 1 root root 0 Nov 25 07:19 host.txt
[root@68c12f6d555c dataVolumerContainer]# vi host.txt 

host.txt

coontainer add

终端host:

[root@localhost myDataVolume]# cat host.txt 
coontainer add

3.3、容器停止退出后,主机修改后数据是否同步

终端container,退出

[root@68c12f6d555c dataVolumerContainer]# exit
exit
[root@localhost java]# 

终端test,验证正在运行的容器

[root@localhost java]# 
[root@localhost java]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost java]# 

终端host:
编辑添加内容host add

[root@localhost myDataVolume]# ll
总用量 1
-rw-r--r--. 1 root root 15 11月 25 15:20 host.txt
[root@localhost myDataVolume]# vi host.txt 

终端container:
重启容器

[root@localhost java]# docker ps  -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
68c12f6d555c        centos              "/bin/bash"         About an hour ago   Exited (0) 6 minutes ago                       vibrant_mclean
[root@localhost java]# docker start 68c12f6d555c
68c12f6d555c
[root@localhost java]# 

终端test,验证正在运行的容器

[root@localhost java]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
68c12f6d555c        centos              "/bin/bash"         About an hour ago   Up 4 seconds                            vibrant_mclean
[root@localhost java]# 

终端container:
重新进入容器中

[root@localhost java]# 
[root@localhost java]# docker attach 68c12f6d555c
[root@68c12f6d555c /]# ll
total 12
-rw-r--r--.   1 root root 12030 Oct  6 19:15 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Oct  6 19:14 bin -> usr/bin
drwxr-xr-x.   2 root root    43 Nov 25 07:55 dataVolumerContainer
drwxr-xr-x.   5 root root   360 Nov 25 07:59 dev
drwxr-xr-x.   1 root root    66 Nov 25 07:01 etc
drwxr-xr-x.   2 root root     6 Apr 11  2018 home
lrwxrwxrwx.   1 root root     7 Oct  6 19:14 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 Oct  6 19:14 lib64 -> usr/lib64
drwxr-xr-x.   2 root root     6 Apr 11  2018 media
drwxr-xr-x.   2 root root     6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root     6 Apr 11  2018 opt
dr-xr-xr-x. 281 root root     0 Nov 25 07:59 proc
dr-xr-x---.   1 root root    27 Nov 25 07:51 root
drwxr-xr-x.  10 root root   130 Oct  6 19:15 run
lrwxrwxrwx.   1 root root     8 Oct  6 19:14 sbin -> usr/sbin
drwxr-xr-x.   2 root root     6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root     0 Nov 25 06:17 sys
drwxrwxrwt.   7 root root   132 Oct  6 19:15 tmp
drwxr-xr-x.  13 root root   155 Oct  6 19:14 usr
drwxr-xr-x.  18 root root   238 Oct  6 19:14 var
[root@68c12f6d555c /]# 

进入容器卷,查看是否有容器启动前添加的内容。

[root@68c12f6d555c /]# cd dataVolumerContainer/
[root@68c12f6d555c dataVolumerContainer]# ls
host.txt
[root@68c12f6d555c dataVolumerContainer]# cat host.txt 
coontainer add

host add
[root@68c12f6d555c dataVolumerContainer]# 

host add是容器启动前添加的内容。

3.4、命令(带权限)

格式:
docker run -it -v /宿主机绝对目录:/容器内目录:ro 镜像名 容器内的文件只读,目录无权创建
ro 表示ready only ,只读。

示例:

docker run -it -v /myDataVolume:/dataVolumerContainer:ro centos

4、DockerFile 添加

4.1、根目录下新建 mydocker 目录并进入

终端container:

[root@localhost /]# mkdir /mydocker
[root@localhost /]# cd mydocker/
[root@localhost mydocker]# pwd
/mydocker
[root@localhost mydocker]#

4.2、在 Dockerfile 中使用 Volume 指令来给镜像添加一个或多个数据卷

语法格式:

VOLUME["/dataVolumeContainer1","/dataVolumeContainer2"]

说明:
出于可移值和分享的考虑,用 -v 主机目录:容器目录 这种方法不能够直接在Dockerfile中实现。
由于宿主机目录是依赖于特定宿主机的,并不能保证在所有宿主机上都存在这样的特定目录。

4.3、File构建

终端container:

[root@localhost mydocker]# vi Dockerfile

Dockerfile :

# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,------success1"
CMD /bin/bash

说明:
上面的 Dockerfile 的内容 等价于

docker run -it -v /host1:/dataVolumeContainer1 -v /host2:/dataVolumeContainer2 centos /bin/bash

4.4、build后生成镜像

格式:

docker build -f /mydocker/Dockerfile -t zzyy/centos .

注意,最后一位是个点(.)

操作内容:

终端container:

[root@localhost mydocker]# vi Dockerfile
[root@localhost mydocker]# ls
Dockerfile
[root@localhost mydocker]# cat Dockerfile 
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,------success1"
CMD /bin/bash
[root@localhost mydocker]# docker build -f /mydocker/Dockerfile -t zzyy/centos .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 75835a67d134
Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
 ---> Running in 041cc7e7d58f
Removing intermediate container 041cc7e7d58f
 ---> b49f99cf2001
Step 3/4 : CMD echo "finished,------success1"
 ---> Running in 2e8ed8aedbff
Removing intermediate container 2e8ed8aedbff
 ---> 8ec90a7d9d43
Step 4/4 : CMD /bin/bash
 ---> Running in fb87df9d2666
Removing intermediate container fb87df9d2666
 ---> 1846c594f7f9
Successfully built 1846c594f7f9
Successfully tagged zzyy/centos:latest
[root@localhost mydocker]# 

查看镜像:

终端container:

[root@localhost mydocker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
zzyy/centos         latest              1846c594f7f9        42 seconds ago      200MB
atguigu/mytomcat    1.2                 b105c1f52eb5        8 hours ago         463MB
redis               latest              c188f257942c        9 days ago          94.9MB
tomcat              latest              ca9e2fccef98        3 weeks ago         463MB
centos              latest              75835a67d134        6 weeks ago         200MB
[root@localhost mydocker]# 

4.5、run容器

终端container:

[root@localhost mydocker]# docker run -it zzyy/centos
[root@299d9be66cf2 /]# pwd
/
[root@299d9be66cf2 /]# 
[root@299d9be66cf2 /]# ll
total 12
-rw-r--r--.   1 root root 12030 Oct  6 19:15 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Oct  6 19:14 bin -> usr/bin
drwxr-xr-x.   2 root root     6 Nov 25 10:31 dataVolumeContainer1
drwxr-xr-x.   2 root root     6 Nov 25 10:31 dataVolumeContainer2
drwxr-xr-x.   5 root root   360 Nov 25 10:31 dev
drwxr-xr-x.   1 root root    66 Nov 25 10:31 etc
drwxr-xr-x.   2 root root     6 Apr 11  2018 home
lrwxrwxrwx.   1 root root     7 Oct  6 19:14 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 Oct  6 19:14 lib64 -> usr/lib64
drwxr-xr-x.   2 root root     6 Apr 11  2018 media
drwxr-xr-x.   2 root root     6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root     6 Apr 11  2018 opt
dr-xr-xr-x. 280 root root     0 Nov 25 10:31 proc
dr-xr-x---.   2 root root   114 Oct  6 19:15 root
drwxr-xr-x.  10 root root   130 Oct  6 19:15 run
lrwxrwxrwx.   1 root root     8 Oct  6 19:14 sbin -> usr/sbin
drwxr-xr-x.   2 root root     6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root     0 Nov 25 06:17 sys
drwxrwxrwt.   7 root root   132 Oct  6 19:15 tmp
drwxr-xr-x.  13 root root   155 Oct  6 19:14 usr
drwxr-xr-x.  18 root root   238 Oct  6 19:14 var
[root@299d9be66cf2 /]# 

创建并运行容器后,发现自动创建了两个数据卷

4.6、如何找对应的主机目录地址

方法:docker inspect 容器id

终端test
查找宿主机的目录地址

[root@localhost /]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
299d9be66cf2        zzyy/centos         "/bin/sh -c /bin/bash"   3 minutes ago       Up 3 minutes                            gifted_fermat
[root@localhost /]# docker inspect 299d9be66cf2
....省略....
        "Mounts": [
            {
                "Type": "volume",
                "Name": "ebecb97f356f449783bd9898ebd2c6b31559fb58fff5981350dc7fd4fe1d0941",
                "Source": "/var/lib/docker/volumes/ebecb97f356f449783bd9898ebd2c6b31559fb58fff5981350dc7fd4fe1d0941/_data",
                "Destination": "/dataVolumeContainer1",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "d668bc0dfbc64f722fae55f4986c3417eb88850ab62e2e50aef9b50f31bad37c",
                "Source": "/var/lib/docker/volumes/d668bc0dfbc64f722fae55f4986c3417eb88850ab62e2e50aef9b50f31bad37c/_data",
                "Destination": "/dataVolumeContainer2",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
....省略....
[root@localhost /]# 

在节点Mounts节点中已经给出了宿主机的目录地址
/var/lib/docker/volumes/ebecb97f356f449783bd9898ebd2c6b31559fb58fff5981350dc7fd4fe1d0941/_data 对应的是 /dataVolumeContainer1
/var/lib/docker/volumes/d668bc0dfbc64f722fae55f4986c3417eb88850ab62e2e50aef9b50f31bad37c/_data 对应的是 /dataVolumeContainer2

4.7、主机对应默认地址

终端container:
进入 dataVolumeContainer1 中,编辑 container.txt

[root@299d9be66cf2 /]# ls
anaconda-post.log  dataVolumeContainer1  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                dataVolumeContainer2  etc  lib   media  opt  root  sbin  sys  usr
[root@299d9be66cf2 /]# cd dataVolumeContainer1/
[root@299d9be66cf2 dataVolumeContainer1]# ls
[root@299d9be66cf2 dataVolumeContainer1]# echo "container add"> container.txt
[root@299d9be66cf2 dataVolumeContainer1]# cat container.txt 
container add
[root@299d9be66cf2 dataVolumeContainer1]#

终端host:
进入/var/lib/docker/volumes/ebecb97f356f449783bd9898ebd2c6b31559fb58fff5981350dc7fd4fe1d0941/_data 目录中:

[root@localhost /]# cd /var/lib/docker/volumes/ebecb97f356f449783bd9898ebd2c6b31559fb58fff5981350dc7fd4fe1d0941/_data
[root@localhost _data]# ls
container.txt
[root@localhost _data]# cat container.txt 
container add
[root@localhost _data]#

5、可能遇到的问题

1、如果Docker挂载主机目录时,Docker访问出现catnot open directory.:Permission denied

解决办法:在挂载目录后多加一个--privileged=true参数。如

docker run -it -v /myDataVolume:/dataVolumerContainer --privileged=true centos

2、Firefox 取消了该请求

FirFox浏览器时,弹出以下提示:
“此地址使用了一个通常用于网络浏览以外的端口。出于安全原因,Firefox 取消了该请求。”。

解决方法:

在Firefox地址栏输入about:config ,
然后在右键新建一个字符串键 network.security.ports.banned.override ,
将需访问网站的端口号添加到,值就是那个端口号即可,如7080
如有多个,就半角逗号隔开,例:7080,6666,8888

在能保证安全的前提下,还简化成这样写0-65535 ,这样可以浏览任意端口的网站了。

猜你喜欢

转载自blog.csdn.net/xiaojin21cen/article/details/84501206
今日推荐