docker 入门 ——docker 容器内添加数据卷的2种方式
文章目录1、容器数据卷是什么?2、`容器内` 添加数据卷的2种方式3、直接命令添加3.1、命令3.2、查看数据卷是否挂载成功3.3、容器和宿主机之间数据共享3.3、容器停止退出后,主机修改后数据是否同步3.4、命令(带权限)4、DockerFile 添加4.1、根目录下新建 mydocker 目录并进入4.2、在 Dockerfile 中使用 Volume 指令来给镜像添加一个或多个数据卷4.3、
文章目录
1、容器数据卷是什么?
- 容器的持久化
- 容器间继承 + 共享数据
卷 就是 目录或文件,存在于一个或多个容器中,由docker挂载到容器中,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。
卷的设计的目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
1:数据卷可以在容器之间共享或重用数据
2:卷中的更改可以直接生效
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命令周期默认会一直存在,即使容器被删除。
2、容器内
添加数据卷的2种方式
- 直接命令添加
- DockerFile 添加
3、直接命令添加
定义3个终端:
- 终端host
- 终端container
- 终端test
格式:
docker run -it -v /宿主机绝对目录:/容器内目录 镜像名
示例:
docker run -it -v /myDataVolume:/dataVolumerContainer centos
3.1、查看目录
终端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
终端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
目录,并且也没有容器在运行。
3.2、创建并运行一个带数据卷的容器
终端container :
root@localhost java]# docker run -it -v /myDataVolume:/dataVolumerContainer centos
3.3、验证 数据卷 是否创建成功
终端container :
[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 ]# cd dataVolumerContainer
[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
3.4、docker inspect 查看容器的目录结构
终端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.5、容器和宿主机之间数据共享
终端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.6、容器停止,编辑内容
终端container,退出
[root@68c12f6d555c dataVolumerContainer]# exit
exit
[root@localhost java]#
终端host,编辑host.txt
[root@localhost myDataVolume]# ll
总用量 1
-rw-r--r--. 1 root root 15 11月 25 15:20 host.txt
[root@localhost myDataVolume]# vi host.txt
host.txt 中添加内容:
host add
3.7、验证 数据是否同步
终端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@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.8、命令(带权限)
格式:
docker run -it -v /宿主机绝对目录:/容器内目录:ro 镜像名
容器内的文件只读,目录无权创建
ro
表示ready only ,只读。
示例:
docker run -it -v /myDataVolume:/dataVolumerContainer:ro centos
4、DockerFile 创建
在 Dockerfile 中使用 Volume 指令来给镜像添加一个或多个数据卷。
语法格式:
VOLUME["/dataVolumeContainer1","/dataVolumeContainer2"]
说明:
出于可移值和分享的考虑,用 -v 主机目录:容器目录
这种方法 不能够直接在Dockerfile中实现。
由于宿主机目录是依赖于特定宿主机的,并不能保证在所有宿主机上都存在这样的特定目录。
4.1、根目录下新建 mydocker 目录并进入
终端container:
[root@localhost /]# mkdir /mydocker
[root@localhost /]# cd mydocker/
[root@localhost mydocker]# pwd
/mydocker
[root@localhost mydocker]#
[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.2、docker 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.3、测试新构建的容器
终端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.4、docker inspect 查看容器数据卷
查找对应的主机目录地址。
方法: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.5、主机对应默认地址
终端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 /hostDataVolume:/containerDataVolume --privileged=true centos
2、Firefox 取消了该请求
FirFox浏览器时,弹出以下提示:
“此地址使用了一个通常用于网络浏览以外的端口。出于安全原因,Firefox 取消了该请求。”。
解决方法:
在Firefox地址栏输入about:config
,
然后在右键新建一个字符串键 network.security.ports.banned.override
,
将需访问网站的端口号添加到,值就是那个端口号即可,如7080
如有多个,就半角逗号隔开,例:7080,6666,8888
。
在能保证安全的前提下,还简化成这样写0-65535
,这样可以浏览任意端口的网站了。
更多推荐
所有评论(0)