Docker数据管理
管理 Docker 容器中数据主要有两种方式:
- 数据卷(Data Volumes)
- 数据卷容器(DataVolumes Containers)。
容器都是有生命周期的,如果要保证容器内的数据内容能够持久化,那么就需要做数据卷
1.数据卷
数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于 Linux 下对目录进行的 mount 操作。
docker pull centos:7
命令格式
#创建数据卷
docker run -v 数据卷名称
#创建数据卷并挂在到宿主机目录
docker run -v 宿主机目录:数据卷目录
实例
(1)创建数据卷
#当前宿主机没有/var/www目录
[root@localhost ~]# ls /var/www
ls: 无法访问/var/www: 没有那个文件或目录
#宿主机目录/var/www 挂载到容器中/data1.
#注意:宿主机本地目录的路径必须是使用绝对路径。如果路径不存在,Docker 会自动创建相应的路径.
#-v 选项可以在容器内创建数据卷
[root@localhost ~]# docker run -v /var/www:/data1 --name c1 -itd centos:7 bash
b3b40d48802b9cefe23868b52f081c25ab56eeee0290fd4a647f99edfcef059d
#目录已经创建成功
[root@localhost ~]# ls /var/www -d
/var/www
#进入容器c1,查看容器内容,已经新增了一个data1目录,说明数据卷创建成功
[root@localhost ~]# docker exec -it c1 bash
[root@505cdd335c02 /]# ls
anaconda-post.log bin data1 dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
(2)验证数据卷与宿主机的同步性
#宿主机复制文件到同步文件夹/var/www
[root@localhost ~]# cp /etc/passwd /etc/shadow /opt
[root@localhost opt]# mv passwd shadow /var/www/
#进入容器c1查看文件是否同步成功
[root@localhost ~]# docker exec -it c1 bash
[root@505cdd335c02 /]# ll data1/
total 8
-rw-r--r--. 1 root root 2101 Feb 6 11:00 passwd
----------. 1 root root 1195 Feb 6 11:00 shadow
数据卷容器
子容器继承父容器
如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用
命令格式
docker run -v --volumes-from 数据卷容器
复制代码
实例
#在一个容器c2上创建两个数据卷
docker run --name c2 -v /data1 -v /data2 -itd centos:7 bash
a6f0f32fd2fda973507dbd1b3b8e0ef6d67dbd963f520db607c06b0798b047bb
#进入c2容器
docker exec -it c2 bash
#在data1和data2上各创建一个txt文件
echo "this is data1" > /data1/abc.txt
echo "this is data2" > /data2/123.txt
exit
#使用 --volumes-from 挂载 c2 容器中的数据卷到新容器c3中
docker run -itd --name c3 --volumes-from c2 centos:7 bash
75c5c611ee664afb2b6a32ab1efb2098f9b3cfbba7917a75c6dd08e7af814adf
#进入c3容器
docker exec -it c3 bash
#查看data1和data2文件
cat data1/abc.txt
this is data1
cat data2/123.txt
this is data2
端口映射
在启动容器的时候,如果不指定对应的端口,在容器外是无法通过网络来访问容器内的服务。
端口映射机制将容器内的服务提供给外部网络访问,实质上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。
docker run -d --name test1 -P nginx #随机映射端口(从32768开始)
docker run -d --name test2 -p 43000:80 nginx #指定映射端口
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce415c49c711 nginx "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 0.0.0.0:43000->80/tcp, :::43000->80/tcp test2
e54e6273813b nginx "/docker-entrypoint.…" 22 seconds ago Up 21 seconds 0.0.0.0:32768->80/tcp, :::32768->80/tcp test1
浏览器访问:http://192.168.1.11:43000 、http://192.168.1.11:32768
容器互联(使用centos镜像)
容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道。
简单点说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息。
#创建并运行源容器取名web1
docker run -itd -P --name web1 centos:7 /bin/bash
#创建并运行接收容器取名web2,使用--link选项指定连接容器以实现容器互联
docker run -itd -P --name web2 --link web1:web1 centos:7 /bin/bash
#--link 容器名:连接的别名
#进web2 容器, ping web1
docker exec -it web2 bash
ping web1