Docker数据管理
docker容器中产生的数据在容器关闭后会被清除,下次容器启动时会恢复到镜像初始状态。如何保存容器中创建的数据? docker 提供了两种方法可以把在容器运行中产生的数据保存到宿主机的文件系统中。
第一种:数据卷。
当启动一个容器时可以mount 数据卷(一个宿主机的目录或者文件)到容器中,容器中产生的数据可以保存在数据卷中。
挂载一个宿主机目录作为数据卷:
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.
-v 参数用来加载数据卷,上面的命令中把宿主机的目录/src/webapp挂载到创建的容器的/opt/webapp目录下。
:ro 表示挂载的数据卷是read only的,默认的权限是wr读写。
挂载一个宿主机文件作为数据卷:
docker run -rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
文件.bash_history 如果被某些工具修改了inode,docker会报告错误。
volume 对象
docker volume create myvolume #创建一个名为myvolume的数据卷对象。
docker volumen ls # 列出数据卷对象
docker volume rm myvolume #删除指定的数据卷
dokcer volume inspect myvolume #查看数据卷的详细信息
docker run --name testcontainer -d -v myvolume:/usr/share #创建一个容器把数据卷myvolume挂载到容器的/usr/share目录。
第二种:数据卷容器
创建并挂在数据卷到一个命名的容器(如上文),这个命名容器被称为数据卷容器。 其他的容器可以通过指定这个数据卷容器来实现挂载数据卷。挂载同一数据卷容器的容器共享数据卷。
docker run -d --v /dbdata --name dbdata training/postgres echo Data-only container.
其他的容器使用--volume-from 参数引用这个容器,实现对数据卷的访问。
docker run -d --volumes-from dbdata --name db1 training/postgres
docker run -d --volumes-from dbdata --name db2 training/postgres
容器互联
每个容器相当与一个简装linux OS,容器之间是隔离的,容器互联可以容器对另一个容器的访问。
下面先创建一个新的数据库容器。
docker run -d --name db training/postgres
然后创建一个新的 web 容器,并将它连接到 db 容器
docker run -d -P --name web --link db:db training/webapp python app.py
--link 参数的格式为 --link name:alias ,其中 name 是要链接的容器的名称, alias 是这个连接的别名。
建立容器互联以后,在发起连接的容器中会建立一系列的环境变量:以链接的别名(--link参数中指定)为前缀。
DB_NAME=/web2/db
DB_PORT=tcp://172.17.0.5:5432
DB_PORT_5000_TCP=tcp://172.17.0.5:5432
DB_PORT_5000_TCP_PROTO=tcp
DB_PORT_5000_TCP_PORT=5432
DB_PORT_5000_TCP_ADDR=172.17.0.5
发起连接的容器的 /etc/hots 文件中会添加指向被链接的容器的条目:
172.17.0.7 aed84ee21bde:localhost
. . .
172.17.0.5 db #被链接的容器ip:别名
可以通过Ping 命令来检查联通性。
ping db