新手问几个关于容器的问题?

1、新建的容器是不是一个完整的linux系统,使用docker exec进入后,感觉很多命令都没有(如top等),VIM编辑一个文件,还要去下了安装才有。
2、假如我现在需要使用一个LNMP,昨天刚学docker就跑了三个容器(PHP,NIGNX,MYSQL)。能否把这三个玩意整合成一个镜像,直接创建一个容器就能跑LNMP?
3、能否把docker容器做成一个私有服务器,把本地的项目代码放进去。随时编辑修改,并把做好的功能提交到镜像中。然后回家,再pull这个镜像然后在家里电脑上接着创建新容器,搞完后接着提交到镜像中第2天回公司接着更新公司电脑上容器内容(好像有点类似GIT);不知道我这样使用对不对?

回复
阅读 1.2k
3 个回答

Q:新建的容器是不是一个完整的linux系统,使用docker exec进入后,感觉很多命令都没有(如top等),VIM编辑一个文件,还要去下了安装才有。

A:docker 不是虚拟机,docker 就和安卓手机『手机分身』一样,只有一个系统,只是看起来像两个,仅此而已。

为什么很多命令没有,因为一个命令占用几十MB,自带一堆命令,image 就太大了,毫无意义,要什么就自己安装什么就好了

Q:假如我现在需要使用一个LNMP,昨天刚学docker就跑了三个容器(PHP,NIGNX,MYSQL)。能否把这三个玩意整合成一个镜像,直接创建一个容器就能跑LNMP?

A:一个进程一个 container,一个 container 多跑个进程的想法是彻底错误的

Q:能否把docker容器做成一个私有服务器,把本地的项目代码放进去。随时编辑修改,并把做好的功能提交到镜像中。然后回家,再pull这个镜像然后在家里电脑上接着创建新容器,搞完后接着提交到镜像中第2天回公司接着更新公司电脑上容器内容(好像有点类似GIT);不知道我这样使用对不对?

A:container 是不可变的,不要想着修改容器。如何修改容器:删除原来的容器,重新 build,重新 run

1、不是,因为大部分场景下,容器的目标是作为生产部署,这些命令并不是必须的,如果你的业务需要,那可以通过 Dockerfile 来定制自己的容器镜像,但是这会使得镜像的体积变得很大。

2、如果你愿意,当然可以,但是并不建议这样做。如前面所说的,容器的目标是作为生产部署,大多数情况下,当我们需要扩容的时候,仅需要扩容其中的一部分,比如 PHP,如果你糅合成一个镜像,就意味着,扩容时又要扩容出一堆用不到的服务,而且你大多时候只需要更新的是 PHP 容器里面的代码,而不会更新 Nginx 和 MySQL,而每次的镜像都会包含这俩,镜像会变得很大。

还有一些场景,比如像 Laravel 这些提供了定时任务、队列,这些都需要使用命令来运行,其是完全不需要依赖 Nginx 的。

还有一些特殊的服务,比如 Redis

如果你希望方便的管理一些服务、组合一些服务,应该考虑使用容器编排,如: Docker Compose

3、原则上容器应该是无状态的,容器里面的 代码 COPY 打包到镜像内,而不是使用 v 的方式挂载(仅代码,其他内容,如日志、用户上传文件这些应该挂载到外部;开发环境例外),容器在销毁后曾经编辑过的都会被自动还原,即丢失。

提交是指 docker commit?一般这个命令不怎么用到,我能想到的场景,就是当镜像里面出现问题的时候,使用这个命令来创建的备份,以供后期定位问题;至于用于分发,这并不是好的方式,而且大多数情况下,你开发过程中,变化最多的仅是代码,有 Git 已经足够了。


简而言之,容器只是用来运行代码的一个场景;如果只是开发环境下使用个人也不是很推荐。

开发和生产不一样. 如果是生产环境, 那你的问题都不允许.
如果是开发生产, 你的想法是对的.

可以把容器理解成一个虚拟的linux, 也可以在容器中装其它的程序, 比如在 php:apache 容器中装上redis, mysql方便开发.
在家和公司之间, 可以使用 docker commit 做一个镜像来传递开发环境.
不过更好的方式是, 只第一次的时候使用docker commit来复制一下开发环境, 后面只通过git, svn传递源代码.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏