所以我们假设我们只是通过映射端口22:22
来启动一个docker容器并允许用户SSH进入容器。
然后用户安装了一些像git或他们想要的软件。因此容器现在污染。
稍后,假设我想将一些补丁应用到容器中,最好的方法是什么?
请记住,用户已修改容器中的内容,包括某些系统级目录,如/usr/bin
。所以我不能简单地用另一个图像替换正在运行的容器。
所以给你一些真实的用例。以Nitrous.io为例。我看到他们正在使用docker容器作为用户的VM。因此用户可以安装Node.js全局包等软件包。那么他们如何像专业人士一样更新/应用补丁?像Codeanywhere这样的类似平台也可能以同样的方式运作。
我试过google但是我失败了。我不是百分之百确定这是否重复。
答案 0 :(得分:3)
然后用户安装了一些像git或者他们想要的软件......我想在容器上应用一些补丁,最好的方法是什么?
推荐的方法是通过Dockerfile
计划更新。但是,如果您无法实现这一点,则应在退出之前提交任何其他更改或安装到容器的新软件包。
例如:下面是创建的没有安装vim
的简单容器。
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
pingimg 1.5 1e29ac7353d1 4 minutes ago 209.6 MB
启动容器并检查是否安装了vim
。
$ docker run -it pingimg:1.5 /bin/bash
root@f63accdae2ab:/#
root@f63accdae2ab:/# vim
bash: vim: command not found
在容器内安装所需的包:
root@f63accdae2ab:/# sudo apt-get update && install -y vim
回到主机上,在停止或退出容器之前,使用新标签提交容器。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f63accdae2ab pingimg:1.5 "/bin/bash" About a minute ago Up About a minute modest_lovelace
$ docker commit f63accdae2ab pingimg:1.6
378e0359eedfe902640ff71df4395c3fe9590254c8c667ea3efb54e033f24cbe
$ docker stop f63accdae2ab
f63accdae2ab
现在,docker镜像应显示给容器的标签或版本。请注意,更新的容器显示更大的尺寸。
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
pingimg 1.6 378e0359eedf 43 seconds ago 252.8 MB
pingimg 1.5 1e29ac7353d1 4 minutes ago 209.6 MB
重新启动最近提交的容器,您可以看到vim
已安装
$ docker run -it pingimg:1.6 /bin/bash
root@63dbbb8a9355:/# which vim
/usr/bin/vim
验证以前版本容器的内容,并注意到vim
仍然缺失。
$ docker run -it pingimg:1.5 /bin/bash
root@99955058ea0b:/# which vim
root@99955058ea0b:/# vim
bash: vim: command not found
希望这有帮助!
答案 1 :(得分:2)
有一个名为configuration management的整个软件分支,旨在通过Ansible和Puppet等解决方案解决此问题。虽然在设计时考虑了VM,但当然可以将这些解决方案与容器一起使用。
然而,这不是Docker方式。而不是修补Docker容器,扔掉它并用新的容器替换它。如果您需要安装新软件,请将其添加到Dockerfile并根据@ askb的解决方案构建一个新容器。通过这种方式,我们可以避免一系列令人头痛的问题(类似地,更喜欢docker exec
在容器中安装ssh。)