在使用Docker的过程中,需要查看容器内应用产生的数据,或者需要将容器内数据进行备份,甚至需要多个容器之间进行数据共享时,势必会设计到容器的数据管理:
Data Volume(数据卷)
Data Volume Dontainers —数据卷容器
Docker容器有两种方式 卷 和 绑定挂载 可将容器中的文件存储在宿主机的文件系统上,这样即使在容器停止之后这些文件也会被保留。如果你在Linux上运行Docker,你也可以使用tmpfs挂载。
volume , bind和tmpfs三者的相同点和区别:
无论您选择使用哪种类型去使用,数据在容器内看起来都是相同的。它被视为容器文件系统中的目录或单个文件。
卷(volume)存储在Docker管理的主机文件系统的一部分中(在Linux上是:/var/lib/docker/volumes/)。非Docker进程不应该修改这部分文件系统。卷是在Docker中保留数据的最佳方式。
就是把主机的本地目录挂载到容器中某个挂载点。可以存储在主机系统的任何位置。他们甚至可能是重要的系统文件或目录。Docker主机或Docker容器上的非Docker进程可以随时修改它们。
仅存储在主机系统的内存中,而不会写入主机系统的文件系统。
1、Data Volume的特点:
Data Volume是目录或文件,而非没有格式化的磁盘(块设备)。
容器可以读写volume中的数据。
volume数据可以被永久的保存,即使使用它的容器已经销毁。
2、Data Volume的使用
1)通过参数 -v 运行一个容器,将本地的 /html 目录挂载到容器的 /usr/share/nginx/html 目录上
[root@docker1 ~]# docker run --name c1 -d -v /html:/usr/share/nginx/html -p 80:80 nginx:1.14-alpine //将容器c1的 /usr/share/nginx/html 和宿主机的 /html 和做一个挂载关联
8e6ca89aac03198e79e9b91fd9be10d3f8a9f52ce384c3fd318b628949896aa9
[root@docker1 ~]# docker ps //确保容器处于运行状态
2)在宿主机上对网页内容进行修改
[root@docker1 ~]# echo “ceshi” > /html/index.html
[root@docker1 ~]# curl 192.168.159.145
ceshi
3)在容器上对网内内容进行修改
[root@docker1 ~]# docker exec -it c1 /bin/sh
/ # echo “techi again” > /usr/share/nginx/html/index.html
/ # exit
[root@docker1 ~]# curl 192.168.159.145
techi again
[root@docker1 ~]# cat /html/index.html
techi again
综上所述:已经将宿主机的 /html 与 容器的 /usr/share/nginx/html 进行了关联,也能做到持久化的存储。
1、当使用 -P 标记是,Docker 会随机映射一个49000~49900 的端口到内部容器开放的网络端口。
2、-p(小写)则可以指定要映射的IP和端口,但是在一个指定端口上可以绑定一个容器。支持的格式有 hostPort : containerPort、 ip : hostPort : containerPort、ip : : containerPort。
将容器的5000端口映射到指定地址127.0.0.1的5000端口上:
docker run -it -d -p 127.0.0.1:5000:5000 busybox /bin/sh
将容器的4000端口映射到127.0.0.1的任意端口上:
docker run -it -d -p 127.0.0.1::4000 busybox /bin/sh
将容器的80端口映射到宿主机的8000端口上:
docker run -itd -p 8000:80 busybox /bin/sh
查看映射端口配置:
docker port 容器名/容器ID
使用link方式使容器可以相互通信
docker run --link 可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以相互通信,并且接收容器可以获取源容器的一些数据,如源容器的环境变量。
例:
docker run --name MySQL -e MYSQL_ROOT_PASSWORD=123456 -d --restart=always mysql:5.6
//注:-e 是配置环境变量,–restart=always 是一个重启策略,是指容器重启之后一直保持启动状态
然后就可以向容器MySQL 数据库执行SQL语句了:
[root@docker1 ~]# docekr run -it --link MySQL --rm mysql:5.6 sh -c ‘exec mysql -uroot -p"ROOT_PASSWORD" -h"IP"’
示例:搭建论坛
[root@docker1 ~]# docker run --name db -e MYSQL_ROOT_PASSWORD=123456 -d --restart=always mysql:5.7
[root@docker1 ~]# docker ps
[root@docker1 ~]# docker run --rm --name web --link db:db y109/discuz env
[root@docker1 ~]# docker run --name web -d -p 80:80 --link db:db y109/discuz
0d067f23fe1bdb8960125b846d79ca38ad65da2742b26965717545a398d5c1d3
[root@docker1 ~]# docker ps
通过windows浏览器访问