mindpin / problems

问题驱动研发!!
5 stars 1 forks source link

docker 简单调研 #64

Open ben7th opened 10 years ago

ben7th commented 10 years ago

https://www.docker.com/ 调研这个工具,尝试回答下面的问题:

  1. docker 和操作系统是什么关系?是一个工具,里面跑着虚拟操作系统,还是在操作系统里面跑着的一个工具?
  2. docker 有什么操作系统或硬件限制吗?目前的常用的服务/工具,如 mongoDB, mySQL, memcache, redis, nodejs 都能跑在里面吗?
  3. docker 能在一个局域网环境内独立运行吗?还是说运行时必须时刻连接公网?还是说安装/部署时从公网获取数据,然后运行时是独立的?
  4. docker 作为虚拟化容器,里面跑的是什么东西?假设我手头有一个 rails 写的应用,我需要大概做哪些工作才能让他在 docker 下面跑起来?
  5. 能否在 docker 下面跑两个不同的虚拟环境,两个环境使用不同的 mongoDB, rails 版本?
  6. 假设其他人(张三)有一个跑着 docker 的环境,我需要如何打包我写的rails 应用,才能比较方便地让张三把它运行起来?张三能否拿到我打的包就运行,而不需要再安装配置各种依赖?
  7. 使用 docker 能否做到下文描述的效果:
    • 假设我过去,现在,将来,手头有若干的 rails / sinatra / nodejs / django / php 写的应用,每种应用都有不同的数据库,运行环境,语言,常驻服务(如全文索引进程)依赖。
    • 为了把这些应用能够快速部署给客户,我们要对每种应用做一个用于部署的虚拟机文件(.ova/.ovf 文件)。根据需要让客户下载和运行这些虚拟机文件,然后我们远程连过去配置。这样做的缺点是,每种应用都需要分别打包虚拟机,管理较麻烦;
    • 因此,我能否打包一个这样的虚拟机文件(.ova/.ovf),里面包含安装好的操作系统以及配置好的 docker。先让所有客户,无论要运行什么应用,都先运行这个 “包含 docker 的虚拟机”?
    • 然后,我能否把所有应用都打成 docker 下面跑的包(这个包是什么现在并不清楚,需要调研)。客户需要运行什么,就把这个包部署到客户的虚拟机里,然后启动应用?
  8. 如果上面描述的过程能够做到,那么是否可以简化软件的分发和部署工作?或者有什么其他的,借助 docker 简化工作的思路?
fushang318 commented 10 years ago

docker 和操作系统是什么关系?是一个工具,里面跑着虚拟操作系统,还是在操作系统里面跑着的一个工具?

docker 是一个工具,可以很好的运行在 ubuntu 64 位系统上(官方支持),和其他一些64位系统(社区支持)上,这个工具可以运行一个应用容器(container)

这个容器(container)是已一个几百兆的镜像(image)为基础创建的,可以从网络下载其他人分享的配置好的镜像(image),也可以把自己配置好的镜像(image)分享到网络上

这个容器指的是配置了安装好了一些软件的类似虚拟机的东西,在这个容器中修改的文件不会影响到容器外的文件,但是可以复制容器内的文件到容器外,或者共享容器外的文件夹给容器使用,也可以创建数据类型的容器挂载到运行环境类型的容器

对容器进行了很多修改后,可以把这个容器当前的整个状态生成一个新的镜像(image)

比如在 ubuntu64位系统上安装 docker 然后配置一个运行 debian 系统的安装了 nginx 的镜像,然后通过 docker 命令启动一个基于这个镜像(image)的容器(container),并在容器中运行 nginx 服务

docker 有什么操作系统或硬件限制吗?目前的常用的服务/工具,如 mongoDB, mySQL, memcache, redis, nodejs 都能跑在里面吗?

docker 可以很好的运行在 ubuntu 64 位系统上(官方支持),和其他一些64位系统(社区支持)上

必须是64位CPU

容器可以运行的系统(查看的社区分享的列表,支持主流的centos debian fedora ubuntu, 其他不熟悉的发行版没有仔细看)

mongoDB, mySQL, memcache, redis, nodejs 这些在容器中运行都没有问题

docker 能在一个局域网环境内独立运行吗?还是说运行时必须时刻连接公网?还是说安装/部署时从公网获取数据,然后运行时是独立的?

安装/部署时需要从公网下载镜像,然后运行时是独立的

docker 作为虚拟化容器,里面跑的是什么东西?假设我手头有一个 rails 写的应用,我需要大概做哪些工作才能让他在 docker 下面跑起来?

  1. 首先准备一个 ubuntu 64 位系统
  2. 安装 docker 软件
  3. 配置一个镜像(安装好跑 rails 应用的所有软件,这个安装过程和在 linux 系统中安装软件是一样的),或者下载一个其他人配置好的跑 rails 的镜像
  4. 稍微修改一下镜像(增加共享文件夹,增加启动rails应用的脚本等等这些东西)
  5. 用 docker 基于这个镜像创建一个容器(同时挂载一个创建好的数据容器用来保存日志,数据文件等内容)
  6. 运行容器中的 rails 应用

或者更解耦的做 创建多个容器,分别运行 nginx mongodb rails 然后串联这几个容器(貌似是官方推荐的做法,优点不确定)

能否在 docker 下面跑两个不同的虚拟环境,两个环境使用不同的 mongoDB, rails 版本?

可以,两个容器完全独立,不受干扰

假设其他人(张三)有一个跑着 docker 的环境,我需要如何打包我写的rails 应用,才能比较方便地让张三把它运行起来?张三能否拿到我打的包就运行,而不需要再安装配置各种依赖?

  1. 自己打包一个跑自己rails 应用的镜像,上传到网络
  2. 其他人有一个跑 docker 的环境,就可以直接下载镜像
  3. 然后基于这个镜像直接创建一个容器,并启动

使用 docker 能否做到下文描述的效果

可以

如果上面描述的过程能够做到,那么是否可以简化软件的分发和部署工作?或者有什么其他的,借助 docker 简化工作的思路?

理论上可以简化分发和部署

脑补的方案是这样的

工程代码和运行环境封装到一个镜像,运行时创建两个容器,一个运行容器,一个数据容器,运行容器中有工程代码和运行环境,数据容器用来保存应用运行中生成的文件,用户数据,日志等等

软件升级时,重新封装工程代码和运行环境封装的镜像,客户更新这个镜像,并基于这个镜像创建一个新的运行容器,并挂在已经有的数据容器,这样就可以方便的完成升级和部署

因为运行容器中没有任何用户数据,所以可以随时创建新的代替旧的,只需要保证 数据容器不变就行

机制了解的差不多了,我觉得我可以开始尝试用 docker 搭建一个运行 kc 的服务端出来了,看看细节上存在什么问题没有

fushang318 commented 10 years ago

CoreOS 专门运行 Docker 的 linux 发行版

http://www.oschina.net/translate/coreos_and_docker_first_steps?cmp

Docker 中管理数据

http://www.open-open.com/lib/view/open1403571027233.html

http://stackoverflow.com/questions/18496940/how-to-deal-with-persistent-storage-e-g-databases-in-docker

基于Fig搭建开发环境

http://www.infoq.com/cn/articles/docker-build-development-environment-based-on-fig