数据卷
数据卷容器
数据卷迁移数据
端口映射
容器间通信
数据卷的管理
当需要查看容器内应用产生的数据或者把容器内数据备份及多个容器数据共享。有两种方式,数据卷以及数据卷容器。
数据卷
数据卷是一个可供容器使用的特殊目录,它绕过文件系统,特性如下:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新不会影响镜像
- 卷会一直存在,直到没有容器使用
- 其使用类似与mount操作。
在容器内创建一个数据卷
#docker run -d -P --name web -v /webapp training/webapp python app.py
-v 多次使用可以创建多个数据卷
挂载一个主机目录作为数据卷
这里挂载宿主机/mydata目录到容器的data_web1,可指定权限,默认rw
#docker run -d -P --name web1 -v /mydata:/data_web1:ro training/webapp python app.py
然后使用docker inspect web1验证创建卷并安装正确。寻找Mounts部分:
然后进入到容器,并在/data_web1目录下创建一个a.txt文件
最后退出容器回到宿主机到/mydata目录查看是否有a.txt文件
数据卷容器
如果需要在容器之间共享一些持续更新的数据,可以使用数据卷容器。
创建一个数据卷容器,并且在其中一个数据卷挂载到/dbdata,然后在其他容器中使用 --volumes-from来挂载dbdata容器中的数据卷。
两个容器任何一个在该目录下写入,另一个容器都能看到。--volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态。
使用数据卷容器备份恢复数据
备份
在这之前先创建一个容器卷,并创建两个文件。
# docker run -d -P --name dbdata -v /dbdata training/webapp python app.py
使用 --volumes-from 挂载上面容器的dbdata 容器卷,并从主机挂载当前目录到容器的 /backup 目录。命令如下:
# docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
容器启动后,使用了 tar 命令来将 dbdata 卷备份为容器中 /backup/backup.tar 文件,也就是主机当前目录下的名为 backup.tar 的文件。
恢复
恢复数据到一个容器,首先创建一个带有空数据卷的容器 dbdata2。
# docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然后创建另一个容器,挂载 dbdata2 容器卷中的数据卷,并使用 untar 解压备份文件到挂载的容器卷中。
busybox是一个集成了一百多个最常用的linux命令和工具的软件,包括一些cat和echo,grep、find、mount等等。此镜像非常精巧,只有1~2M。
# docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf
/backup/backup.tar
查看
查看恢复的数据,再启动一个容器挂载同样的容器卷来查看
# docker run --volumes-from dbdata2 busybox /bin/ls /dbdata
网络的配置
端口映射
在启动容器时,不指定对应参数,在容器外是无法通过网络来访问容器内的网络应用和服务。一般就需要使用参数-p和-P。-p指定端口。-P随机映射一个端口。
可以看到上面创建容器卷的时候使用了-P,所有地址的端口32777映射到宿主机的5000端口。
如果要选择地址映射使用如下格式即可:
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
如果要映射指定地址的任意端口:
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
查看端口配置使用docker port
使用docker inspect [CONTAINER ID|NAMES]可以查看容器所有的信息。
容器间的link
同一个宿主机上的多个docker容器之间如果想进行通信,可以通过使用容器的ip地址来通信,也可以通过宿主机的ip加上容器暴露出的端口号来通信,前者会导致ip地址的硬编码,不方便迁移,并且容器重启后ip地址会改变,除非使用固定的ip,后者的通信方式比较单一,只能依靠监听在暴露出的端口的进程来进行有限的通信。通过docker的link机制可以通过一个name来和另一个容器通信,link机制方便了容器去发现其它的容器并且可以安全的传递一些连接信息给其它的容器。
那么首先讲下name,使用--name标记可以为容器自定义名称,此名称是唯一的,当需要再次使用同一个名称时,必须要使用docker rm来先删除。
在执行docker run的时候添加--rm标记容器会在终止后立刻删除。--rm和-d不能同时使用。
创建一个后台运行的容器
#docker run -d -P --name dbdata training/webapp python app.py
然后创建另外一个容器,并link到上一个容器
#docker run -d -P --name web --link dbdata:aliasdb training/webapp python app.py
然后docker ps可以看到,看不出来是否有连接,可以通过上面说的docker inspect web来查看。
进入容器web,进行测试,通过ping容器名或者别名都可以通。
容器的host信息会添加到父容器的/etc/hosts文件(也可以链接多个子容器到父容器),下图可以看到: