Docker 心得
Docker 的 image 存放位置通过修改服务的 -g 选项进行修改。
在 ubuntu 上修改 /etc/default/docker.io,内容为:
1 | DOCKER_OPTS="-g /path/to/docker/you/want/put" |
Docker 会记录 image 所有 build 的历史,所以 build 的过程尽量精简。
Docker 允许一个 image 的操作历史不可以大于 127 次。
Docker 在完成一个项目的 image 基础版本 build 后,为了去除 build 过程中的历史以及当前 image 依赖的基础 image 的历史,需要从可运行的 container 上 docker export 一份 image 的包,然后通过 docker import 进行导入,这样生成的新的 image 没有任何历史,可以作为项目的基础镜像。
导出过程:
1 | $ docker export [container-id] |gzip > /path/to/file.tar.gz |
导入过程:
1 | $ cat /path/to/file.tar.gz | docker import - [image-name:image-tag] |
用以上方式导出会丢弃历史记录以及 曾经 build 过程中的 ENV, 所以基于此镜像进行更新操作时需要重新定义 ENV。
项目镜像后续的更新最好始终基于此项目基础镜像,更新 build 的过程中打一个不同的 tag 以与 基础版本区分,这样能保证后续更新镜像的精简。
可以使用 SSH 等方法登入项目基础镜像进行修正。
修正后需要:
1 | $ docker commit [container-id] [image-name:image-tag] |
注意修改版本应当随时同步到远程。
运行失败的 container 及时进行删除
可以使用 busybox 来设置一个最基础的文件环境
建立方法:
1 | $ docker run --name [volume-container-name] -v /path/you/want/create busybox:latest true |
然后在别的 container 中可以使用这个最基本的文件系统, 多个使用此文件环境的 container 之间的修改是同步的。
使用过程:
1 | $ docker run --volumes-from [volume-container-name] -i -t [image-name:image-tag] /bin/bash |
此时指定挂载的 container 的目录就会出现在当前 container 相对应的位置, 你可以在这里进行任何操作。
但是我们所做的操作并不会更新到我们用 busybox 建立的 container 中,而且这份文件环境中的数据的生命周期 不是 在 这个 busybox container 被 docker rm 掉后就结束的,他是在所有对他有引用的 container 都被 docker rm 后才会消失的。
我们要通过以下办法进行数据的备份和还原。 备份的时候使用精简无 entry 的 image 来进行压缩。
这里使用 busybox:
1 | $ docker run --volumes-from [volume-container-name] -v /host/path/to/put/backup/file:/backup busybox:latest tar cvf /backup/backup_file.tar /path/need/to/backup |
这样就会把这份文件环境中的数据打一个 tar 的包备份到你指定的位置。
恢复时要先建立一个基础文件环境:
1 | $ docker run --name [volume-container-name] -v /path/you/want/create busybox:latest true |
然后同样使用没有 entry 的 images 建立 container 解压,这里同样使用 busybox:
1 | $ docker run --volumes-from [volume-container-name] -v /host/path/to/backup/file:/backup busybox:latest tar xvf /backup/backup_file.tar |
这样文件环境的内容就回来了,你可以在其他 container 中进行 volumes-from 来使用了。