当前位置: 首页 > 科技观察

让Docker无处不在

时间:2023-03-20 15:45:38 科技观察

我已经承诺会继续写有关docker的文章。由于我是最后一个使用C?本地linux内核的幸运者,因此我打算写一些关于如何在我的本地桌面上管理所有项目的文章。为什么是docker,而不是纯粹的LXC?几年前我在Adcloud时开始使用LXC来构建我所有的微服务。鉴于我在我的桌面上使用Archlinux并且它工作正常,但我们的生产环境是Ubuntu并且可能会有chef脚本来创建我仍然作为机器维护的容器。它们有自己的DNS域名、IP地址、SSH服务和所有磁盘文件绑定。因此,每当我开始一个新项目时,我首先必须通过SSH进入容器并开始工作。实际上我一点也不喜欢Chef,所以在离开Adcloud之后我放弃了Chef,开始使用Babushka。后者可以让我以最简单的方式部署单机环境,但是创建新容器非常慢,当所有容器启动时会占用SSD上的大量磁盘空间,并且我需要手动配置多个服务。所以当我第一次启动Docker容器时,它的速度之快令人惊讶,而且更好的是分层文件系统减少了磁盘使用。容器不等于机器既然有了Docker容器,就不用考虑机器的概念了。它们只是不同内核名称空间中的进程,您希望它们精简和干净。它们还需要能够在不同的环境中运行,所以我放弃了在容器中使用SSH。那么我该如何创建我的项目呢?首先,我创建了一系列容器,在这些容器上安装了我需要在我的项目中安装但不应该在本地安装的工具。在盒子里使用Go让我们看看github上的Dockerfile。使用下面的别名在容器中启动go,然后移除容器:aliasgo="dockerrun--rm-t-iteemow/go"你甚至可以使用不同的标签来运行不同版本的go(go:1.1,go:1.2等)。但要让它真正发挥作用,还需要做更多的工作。您可以将当前目录绑定挂载到容器中,以执行诸如goget之类的操作。aliasgo="dockerrun--rm-t-i-v\$(pwd):\$(pwd)-w\$(pwd)teemow/go"如果你有一个私有的git存储库加载到容器中,你甚至可以挂起你当前的ssh代理:aliasgo="AGENT=\$(ls-1--sortt/tmp/ssh-*/agent.*|head-1)&&dockerrun--rm-t-i-v\$AGENT:\$AGENT-eSSH_AUTH_SOCK=\$AGENT-v\$(pwd):\$(pwd)-w\$(pwd)teemow/go》也可以将GOPATH之类的环境变量传入容器。您可以完全使用自己的工具来完成这些事情,并且您的托管将是干净的。不要忘记标记你的不同版本的图像,否则很难跳回之前的项目。也许您可以标记一个项目,例如rbenv(dockerenv)。我创建了一系列镜像,其中包括npm、grunt、coffee-script、aws-cli和tugboat等工具。专业提示:不要过度使用别名,建议尽可能使用小脚本,例如/usr/local/bin/。DockerLego如果你想在多个容器上运行或测试你的项目,那么使用上面提到的别名来构建你的项目。您不能在同一个容器中运行Web服务、postgres和redis。每个服务都应该有自己的容器,现在你需要做的就是组合所有的“砖块”。Docker有一个叫做“链接”的特性,可以帮助你做你正在做的事情。链接容器通过环境变量导入自身。这样其他容器就可以发现链接容器的IP地址和接口。Heroku使用类似的方法来添加插件信息。但是您可以使用无花果来使这更容易。只需将fig.yml文件添加到您的项目并运行figup即可启动整个环境。本地目录绑定到一个容器,如果文件被修改,文件观察者可以自动重启你的服务。Mac/Vagrant用户对此很熟悉。我已经将fig.yml文件添加到piratesinnangellist列表中。事实上,即使是fig本身也运行在本地机器上的容器中。但是需要将dockersocket服务绑定到fig容器上,这样它才能启动其他容器。待续。翻译来源:http://www.dockboard.org/dockerize-all-the-things/【编者推荐】Docker如何将错综复杂的Linux代码变成开发者的魔法,你会用吗?Linux5大数据可视化工具Linux深度专访郭潘:图标的故事送给Linux爱好者精彩有趣的高清Linux壁纸强烈推荐:一款Dockermaven插件【责任编辑:林世寿电话:【010】68476606】