默认容器的数据是保留在容器的可读写层,当容器被删除时其上的数据也会失落,所以为了实现数据的持久性则须要抉择一种数据长久技术来保留数据。官网提供了三种存储形式:Volumes、Bind mounts 和 tmpfs。后面还介绍了:Docker 服务终端 UI 管理工具
数据存储形式
从当初开始,咱们学习 Docker 容器的数据存储形式,你也能够先理解一下 Docker 数据长久化的三种计划。
Bind mount 会笼罩容器中的文件,而 volume mount 则不会。即如果容器中已有文件,则会将文件同步到主机的目录上。此形式与 Linux 零碎的 mount 形式很类似,即是会笼罩容器内已存在的目录或文件,但并不会扭转容器内原有的文件,当 umount 后容器内原有的文件就会还原。
数据卷(Volumes)
- 由 docker 创立和治理,且与主机的外围性能隔离
- 无论是命名还是匿名数据卷,都存储在 /var/lib/docker/volumes/ 上面
- 定义的数据卷能够在多个容器中同时应用,且不会主动删除
- 容许容器将内容保留到远端、云服务提供商、加密内容等等
挂在主机目录(Bind mounts)
- 与数据卷相比,挂在主机目录具备无限的性能
- 利用的文件或者目录当时不须要存在,用时会主动创立
- 该形式容许拜访容器的敏感文件,可能会产生安全隐患
内存映射(tmpfs)
- 仅存储在容器的内存中,永远不会写入文件系统
- swarm 服务应用 tmpfs 挂载将敏感信息挂载到容器中
数据卷 – volumes
数据卷是存储在 Docker 容器的特定目录上面
劣势阐明
Docker Volumes 机制通常用来给 Docker 容器保留长久化数据,应用 Volumes 有很多劣势:
- 更容易进行备份和数据迁徙
- 应用 Docker CLI 命令或者 Docker API 来治理
- 能够在 Linux 和 Windows 操作系统上应用
- 能够更平安得在多个容器中共享
- Volume drivers 容许容器将内容保留到远端、云服务提供商、加密 volume 内容
- 新 Volume 的内容能够被容器事后填充
Volumes 通常也优于容器的可写层,应用 Volumes 不会减少容器的体积,并且 Volumes 的内容存储在内部独立于容器的生命周期。如果容器不产生长久化数据,能够思考应用 tmpfs 内存映射 (只保留在容器的内存中) 的形式来防止数据存储在其余可能的中央,防止减少容器的体积。
应用阐明
最开始的时候 -v 或者 –volume 选项是给独自容器应用,而 –mount 选项是给集群服务应用。然而从 Docker 17.06 开始,也能够在独自容器上应用 –mount。通常来讲 –mount 选项也更加具体和具体。-v 选项将所有选项集中到一个值,而 –mount 选项将可选项离开。如果须要指定 volume driver 选项,那么必须应用 –mount 选项。
# 创立一个数据卷
$ docker volume create my-vol
# 查看所有的数据卷
$ docker volume ls
# 查看指定数据卷的信息
$ docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
# 移除指定数据卷的
$ docker volume rm my-vol
# 革除无主的数据卷
$ docker volume prune
# 启动一个挂载数据卷的容器
$ docker run -d -P --name web
-v my-vol:/wepapp
training/webapp python app.py
$ docker run -d -P --name web
--mount source=my-vol,target=/webapp
training/webapp python app.py
# 启动一个挂载数据卷的服务
$ docker service create -d --name devtest-service
--mount source=myvol2,target=/app
nginx:latest
# 挂载为只读模式
$ docker run -d --name=nginxtest
-v nginx-vol:/usr/share/nginx/html:ro
nginx:latest
# type 能够分为 bind、volume、tmpfs, 默认为 volume
# source 用于设置数据卷的名称,匿名数据卷能够省略
# target 示意须要挂载到容器外面的中央
# readonly 示意挂载的内容为只读模式,可选
# volume-opt 示意能够应用屡次,可选
$ docker run -d --name=nginxtest
--mount source=nginx-vol,destination=/usr/share/nginx/html,readonly
nginx:latest
[3] 挂载近程数据卷
# 插件 sshfs 容许您轻松地在容器中挂载近程文件夹
# 下载该插件
$ docker plugin install --grant-all-permissions vieux/sshfs
# 应用该驱动创立 ssh 数据卷
$ docker volume create --driver vieux/sshfs
-o sshcmd=test@node2:/home/test
-o password=testpassword
-o port=3336
sshvolume
# 启动该驱动程序创立卷创立容器
# 如果两个容器配置了可信关系,就不须要设置 volume-opt 明码了
$ docker run -d
--name sshfs-container
--volume-driver vieux/sshfs
--mount src=sshvolume,target=/app,
volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword
nginx:latest
挂载主机目录 – bind mounts
挂载主机目录是将主机中的特定目录间接挂在到容器外部应用
应用阐明
# 应用 bind 模式启动容器
$ docker run -d -it --name devtest
-v "$(pwd)"/target:/app
nginx:latest
$ docker run -d -it --name devtest
--mount type=bind,source="$(pwd)"/target,target=/app
nginx:latest
# 看下对应的信息
$ docker inspect devtest
"Mounts": [
{
"Type": "bind",
"Source": "/tmp/source/target",
"Destination": "/app",
"Mode": "","RW": true,"Propagation":"rprivate"
}
],
# 挂载为只读模式
$ docker run -d -it --name devtest
-v "$(pwd)"/target:/app:ro
nginx:latest
$ docker run -d -it --name devtest
--mount type=bind,source="$(pwd)"/target,target=/app,readonly
nginx:latest
非凡属性
$ docker run -d -it --name devtest
-v "$(pwd)"/target:/app
-v "$(pwd)"/target:/app2:ro,rslave
nginx:latest
$ docker run -d -it --name devtest
--mount type=bind,source="$(pwd)"/target,target=/app
--mount type=bind,source="$(pwd)"/target,target=/app2,readonly,bind-propagation=rslave
nginx:latest
内存映射 – tmpfs
内存映射是将内存映射到容器内供容器外部应用
劣势阐明
最开始 –tmpfs 是给独自容器应用,而 –mount 选项是给 swarm 集群服务应用的。然而,从 Docker 17.06 开始,也能够在独自容器上应用 –mount 了。通常说来,–mount 更明确,更简短。最大的区别是 –tmpfs 标记不反对任何可配置选项。其中 –tmpfs 只能在容器中应用,而 swarm 集群则必须应用 –mount 来应用 tmpfs 内存映射。
应用阐明
# 容器上应用
$ docker run -d -it --name tmptest
--tmpfs /app
nginx:latest
$ docker run -d -it --name tmptest
--mount type=tmpfs,destination=/app
nginx:latest
日志驱动 – logs
在容器内部查看容器外部的日志输入状况,便于排除和监控问题
能够利用 docker logs 命令,查看 Docker 容器外部利用程序运行时所产生的日志。能够罢黜首先进入 Docker 容器,再关上应用程序的日志文件的过程。docker logs 会监控容器中操作系统的规范输出设备(STDOUT),一旦 STDOUT 有数据产生,就会将这些数据传输到另一个设施中,则被称为日志驱动(Logging Driver)。
# 动静查看日志内容
$ docker logs -f netdata
Docker 是怎么做到的呢?咱们应用 docker info 命令,能够看到 Docker 容器的相干信息,其中有一项 Logging Driver 的字段。
# 以后所设置的日志驱动类型
$ docker info | grep 'Logging Driver'
Logging Driver: json-file
咱们能够在 docker run 命令中通过 –log-driver 参数来设置具体的 Docker 日志驱动,也能够通过 –log-opt 参数来指定对应日志驱动的相干选项。
docker run -d -p 80:80 --name nginx
--log-driver json-file # 设置日志驱动
--log-opt max-size=10m # 示意 JSON 文件最大为 10MB,超过则生成新的文件
--log-opt max-file=3 # 示意 JSON 文件最多保留 3 个,超过则删除多余文件
nginx
# 当然,能够在配置文件中增加,全局失效
$ cat /etc/docker/daemon.json
{"log-driver": "syslog"}
# 批改配置之后重启服务
$ sudo systemctl restart docker
额定,须要留神的是,默认状况下,Docker 将日志存储到一个日志文件。
# 查看日志文件门路
$ docker inspect --format='{{.LogPath}}' netdata
/var/lib/docker/containers/556553bcb5xxx13cbc588a4-json.log
# 查看实时日志信息
$ tail -f `docker inspect --format='{{.LogPath}}' netdata`
作者: Escape 链接: https://escapelife.github.io/…