页次: 1
分享点最近在搞着玩的东西。有个东西,叫做docker,长这个样子
他的一个很好用的功能是提供一种一键式的生成系统镜像的方法:写一个Dockerfile,比如说下面这个
FROM zasdfgbnm/archlinux-yaourt:latest
# setup
COPY basic development python networking security /
# install packages
USER user
RUN yaourt -S --noconfirm $(grep '^\w.*' /basic)
RUN yaourt -S --noconfirm $(grep '^\w.*' /development)
RUN yaourt -S --noconfirm $(grep '^\w.*' /python)
RUN yaourt -S --noconfirm $(grep '^\w.*' /networking)
RUN yaourt -S --noconfirm $(grep '^\w.*' /security)
USER root
# cleanups
RUN yes | pacman -Scc
然后只需要docker build . -t name一条命令就可以生成根据Dockerfile生成一个系统镜像。然后,还可以去docker公司提供的DockerHub注册帐号,他们家的帐号提供免费的公开空间,可以把自己生成的镜像存到他们那里去。镜像生成以后,只需要docker push name一条命令就可以把生成的镜像推送到云存储里面去。然后当需要下载自己的镜像了,只需要docker pull name一条命令就行。如果想用镜像的内容当成系统盘来开启一个容器(容器通俗来讲就是轻量级的虚拟机),直接用docker run -it name bash就行。
所以我想干什么呢?我想利用docker创建镜像跟云同步的便利,把我的整个系统给docker化。具体来讲,就是把整个系统的安装配置流程写成一个Dockerfile,然后用docker生成一个镜像。这样的话这个docker镜像的内容就是我的整个系统的内容了。然后,自然要云同步啦。然后,在initramfs里面加一些东西,这些东西干的事情就是,从docker的本地缓存里面把我这个镜像的内容找出来,挂载成根目录,然后启动systemd进行初始化,这样我就能直接把我的docker镜像当主力系统了。
这样的话,会有很多好处:
1. 本地永远只是使用云端的一份缓存而已,“系统备份”这个概念从根上就是不必要的。
2. 如果你有多台电脑,当你想要安装新的软件,或者更改新的设置的时候,不是直接改系统文件,而是改dockerfile重新生成。然后所有用这个镜像的机器都能直接通过docker pull来使用上最新版的镜像,配置一次,同步所有机器。
3. 再也不需要pacman -Syu了,正确的系统更新方法是docker build重新构建一份镜像,然后docker push推送到云端。每次“系统更新”本质上不是系统更新,而是从头有安装配置了一遍系统,再也不会存在有的更新需要认为干预的问题了,也不用担心滚挂了。
4. 如果有洁癖,非常不喜欢不被pacman管理的文件的话,这简直是福音。因为每次启动看到的都是镜像的内容,这就跟装了还原精灵一样,上次运行产生的垃圾文件全都不见。
5. 如果有新电脑需要装机,也不需要从头安装操作系统了,把启动器装上,然后配置好initramfs,然后从云端拉个镜像过来,装机结束。
6. 偶尔需要用一下别人的电脑,或者公共电脑的时候,又感觉配置的不如自己的顺手的时候,只需要装上个docker,docker pull一键拉取镜像,然后再在容器中启动KDE桌面(gnome等其他的也可以),就可以使用到跟自己电脑上一模一样的系统了。
折腾了好几天,终于在三天前折腾成功。然后又花了两天写了个教程。
我写的mkinitcpio的hook见这里:
https://github.com/zasdfgbnm/mkinitcpio-docker-hooks
详细的教程见这里:
https://zasdfgbnm.github.io/2017/12/28/ … %E7%94%A8/
最近编辑记录 zasdfgbnm (2017-12-31 06:04:28)
离线
docker 一般不是轻量级虚拟机,因为它不跑系统服务,只跑需要的应用。
docker 最讨厌的问题是:大。你这样做,每次更新系统,或者更改系统配置之后,都要 docker pull 一下吧?
然后,你的数据是单独存放的,那个的备份你要单独管理啊。
你喜欢不可变的系统的话,可以看看 nix 或者 GNU 变种 guix。特性很多,实现也很有意思。
离线
docker 一般不是轻量级虚拟机,因为它不跑系统服务,只跑需要的应用。
docker 最讨厌的问题是:大。你这样做,每次更新系统,或者更改系统配置之后,都要 docker pull 一下吧?
然后,你的数据是单独存放的,那个的备份你要单独管理啊。你喜欢不可变的系统的话,可以看看 nix 或者 GNU 变种 guix。特性很多,实现也很有意思。
嗯,是的,docker确实只是个应用容器而不是个操作系统容器。不过虚拟机也没必要一定要跑操作系统的,比如说有个东西叫做unikernel就是扔掉系统只留应用。
docker确实很大。有的人会单独优化docker镜像,去掉无关的文件。不过我既然把整个系统都放进docker了,就没指望他小了。
确实每次更新就是从dockerhub来pull自动构建的最新版,跑的网络流量确实多了点,但我感觉这并不是大问题。百兆网应付起来并不吃力。个人体验docker pull至少比pacman -Syu要更省心。arch我是滚挂过几次了。
数据确实单独备份。我的做法是数据dropbox+github,系统dockerhub。
nix这个东西看起来确实挺有意思,我啥时候玩玩试试。不过这种人相对较少的发行版我是有点担心软件不够充分。
离线
dropbox 不支持权限、不支持区分大小写、不支持软链接,用来存数据勉强还成。对了,你的系统数据冗余是怎么做的呢?方便 push 到多个地方(包括至少一块移动硬盘 / NAS)吗?
你现在的镜像有多大、每次 push 需要多久?更新的频率多少呢?
个人使用的话,很多系统服务都是需要的。比如我非常依赖 systemd,还有 cron,还有日志和各种系统服务。我个人在服务器上开的服务也不少。如果按正常方式 docker 化的话,这些服务每一个都要单独打个镜像,然后共享数据要挂载成一个个的 volume,想想就好累。
nix 最可惜的是,它的配置文件格式是自己搞的,看不太懂,也没有文档专门描述。
至于滚挂的问题,这么多年来,我就滚挂过一两次吧。然后自己给修好了。了解系统手头又有救援系统的话修起来并不难。而且万一坏得严重了,我还可以恢复到上一次备份(用 zfs 的就更方便了,直接 zfs rollback 然后重启之)。
离线
dropbox 不支持权限、不支持区分大小写、不支持软链接,用来存数据勉强还成。
我电脑上基本上只有系统跟数据,对于数据来讲,我并没有存储软链接之类的需求。偶尔有的东西有存储软链接的需求,这种一般也都是代码类的东西,存在github或者bitbucket。对于系统而言,都在dockerhub上面。所以对我来说基本上所有的数据都在云端:dropbox + github + dockerhub
对了,你的系统数据冗余是怎么做的呢?方便 push 到多个地方(包括至少一块移动硬盘 / NAS)吗?
我不是太确定我是否理解你的意思,所以按照我的理解回答一下。我的数据并没有做冗余,而是采用的都是中心化的云服务(前面说的dropbox+dockerhub+bitbucket)。那里想用了调用就行了。也从来不需要push到多个地方去。我的数据总量比较小,采用免费的云服务就能存得下,所以不存在又是一堆磁盘冗余/同步之类的,也用不上NAS。移动硬盘也是万年不用,偶尔用一次也只是刻录成安装盘装系统。
你现在的镜像有多大、每次 push 需要多久?更新的频率多少呢?
我的系统镜像7GB, 存储在docker hub里面。有开自动构建,然而自动构建经常就是以“磁盘空间不足”而失败告终,但也不是每次都失败,所以我基本也不太本地构建然后docker push。push多久我没有测量过,不过基本上能有50Mbps的上传带宽吧大概。这样算的话大概push需要20分钟。我docker push的频率比较低,基本上从来都不进行,除非有段时间自动构建总是因为磁盘空间问题而失败。我以后可能会搞个云服务器自己设置个cron的任务去每天更新然后push。docker pull的频率可能大概一周一次的样子。
我的桌面镜像地址在这里:
https://cloud.docker.com/swarm/zasdfgbn … op/general
个人使用的话,很多系统服务都是需要的。比如我非常依赖 systemd,还有 cron,还有日志和各种系统服务。我个人在服务器上开的服务也不少。如果按正常方式 docker 化的话,这些服务每一个都要单独打个镜像,然后共享数据要挂载成一个个的 volume,想想就好累。
nix 最可惜的是,它的配置文件格式是自己搞的,看不太懂,也没有文档专门描述。
我最早的使用方式是,服务都在host里面跑,然后把整个kde环境给docker化了。我的做法不是给每个application新建一个docker image,而是新建一个大的image然后把所有自己用的东西都塞进去,然后所有的应用都在一个容器里面(而不是每个应用一个容器)跑。具体来讲就是,自己新建一个xsession起名docker-kde,然后这个在sddm里面选自自己新建的xsession,这样的话,登陆的时候就会进到一个大的容器里,kde环境是在容器里跑的,用kde环境打开的东西自然也是在容器里。系统服务不在容器里,所以我在需要操作系统服务的时候,需要ssh localhost。
后来我觉得这样还是不够方便,因为容器里面毕竟有些东西有所隔离。我用docker完全是只需要他的一键构建,那些隔离我一丁点都不想要。于是我就探索让自己的系统镜像在裸机上跑(这就是这个帖子我想说的内容)。
至于滚挂的问题,这么多年来,我就滚挂过一两次吧。然后自己给修好了。了解系统手头又有救援系统的话修起来并不难。而且万一坏得严重了,我还可以恢复到上一次备份(用 zfs 的就更方便了,直接 zfs rollback 然后重启之)。
我滚挂的频率也不是太高(但比你的频率高一点),挂过三四次的样子。修起来不麻烦,但是挂的几次都是我最忙的时候,修起来很烦。我曾经有一次就是滚挂了,然后进不了桌面了,导致我一个多月没有用我的pc,因为没时间修。。。。
最近编辑记录 zasdfgbnm (2018-01-02 00:49:55)
离线
所以不要在忙的时候滚系统啦。
所以你就是把 docker 用成了 lxc 或者 ova……其实你直接把系统打个包扔过去也行的。你的系统真小啊。
离线
话说楼主这不就是DIY了一个CoreOS吗?
离线
话说楼主这不就是DIY了一个CoreOS吗?
是吗? 我去看了一下CoreOS,感觉并不一样吧
离线
所以不要在忙的时候滚系统啦。
所以你就是把 docker 用成了 lxc 或者 ova……其实你直接把系统打个包扔过去也行的。你的系统真小啊。
差不多是这样,我用docker为的只是他的docker build一键式构建,外加云端的免费存储。至于其他的又是isolation又是快速部署又是自动伸缩啥的,我并不在乎
离线
其实我一直在考虑用systemd-nspawn做应用沙盒。用户家目录放在外部的exfat上,应用全装里面,随插随用。
反社会,精神极其不稳定,随时可能炸碎身边所有人
离线
docker 跟 systemd 抢活不是一两天了
就个人感觉 docker 稳定性还是不行啊
并且 pacman 和公共库之类的都要存一份,对于一个成熟的发行版来说实在是没有必要。aur 上奇奇怪怪的东西这样装倒是个不错的选择。
离线
页次: 1