天天向上 2017/2/11 8:39:05:
你好,请教几个问题,1.怎么将已经run起来的container的端口暴露给宿主主机;2.container怎么更新,将宿主机器上的文件覆盖到container上,并更新images;3.images怎么导出给其他同事用;碎石头 2017/2/11 8:44:15:
在,刚醒,昨晚太晚了
天天向上 2017/2/11 8:44:53:
早上好,哦,有空的时候帮忙看看就行
天天向上 2017/2/11 8:45:31:
docker有没有参考书给推荐一下
碎石头 2017/2/11 8:45:49:
暴露端口用p 参数, -p 主机端口:contaner端口
天天向上 2017/2/11 8:46:07:
哦,好
碎石头 2017/2/11 8:48:10:
container一般不去更新,一般是在宿主机上映射若干个目录给它,会变化需更新的东西放宿主机目录里
天天向上 2017/2/11 8:48:32:
好的
碎石头 2017/2/11 8:48:54:
如果有大变化,更新image, 然后重新生成container
天天向上 2017/2/11 8:49:29:
明白了
碎石头 2017/2/11 8:50:45:
比如一些大系统程序重新部署,就写好Dockerfile,然后一键编译并run起来天天向上 2017/2/11 8:51:33:
哦,知道了,谢谢
碎石头 2017/2/11 8:51:39:
所以学深入了就要去学docker的镜像创建了
碎石头 2017/2/11 8:51:50:
不用客气
天天向上 2017/2/11 8:55:43:
宿主机器本身就是linux为什么有些网上教程还要下载多个unbuntu镜像?
碎石头 2017/2/11 8:57:51:
镜像是一个精减的系统,不能直接把宿主机系统拿过来用
碎石头 2017/2/11 8:58:10:
宿主机太胖了
天天向上 2017/2/11 8:59:09:
我run了ubuntu系统,怎么再run odoo呢<
碎石头 2017/2/11 9:00:08:
而且镜像是经过特殊设计,可以实现内核与读写层分离的
天天向上 2017/2/11 9:00:09:
都是从宿主机器上run的,怎么知道我run odoo用的是run起来的ubuntu系统环境而不是宿主机环境
碎石头 2017/2/11 9:00:38:
odoo需要部署在linux上才能运行,对吧
天天向上 2017/2/11 9:00:48:
似的
天天向上 2017/2/11 9:00:52:
是的
碎石头 2017/2/11 9:01:10:
所以,odoo应用是部署在一个linux镜像上生成一个新镜像
碎石头 2017/2/11 9:01:43:
一个应用本身不依附于一个操作系统镜像的话,是没法运行的
天天向上 2017/2/11 9:01:58:
我要进入镜像的ubuntu系统,然后再这个系统上装odoo吗
天天向上 2017/2/11 9:02:23:
odoo本身也有镜像啊,搞不明白
碎石头 2017/2/11 9:02:34:
当把应用部署在操作系统镜像上之后,需要的是运行操作系统,然后自动启动应用
碎石头 2017/2/11 9:03:12:
odoo的镜像就是把odoo装在了ubuntu(或其他linux上)而形成的新镜像
碎石头 2017/2/11 9:03:46:
这个问题等会儿再说,跟你说一个多个镜像怎么协同工作的问题
天天向上 2017/2/11 9:04:11:
哦,明白了,从官方下载的odoo镜像本身就是带linux系统的
碎石头 2017/2/11 9:04:17:
是的
碎石头 2017/2/11 9:04:40:
我现在开始简单说下多个镜像协同工作的方法:
天天向上 2017/2/11 9:05:04:
好的
碎石头 2017/2/11 9:05:34:
对于一些大型的应用,需要很多不同系统的协同工作,而如果把这些系统都部署在一个镜像里,那这个镜像会很肥而且很难维护
天天向上 2017/2/11 9:05:47:
是的
碎石头 2017/2/11 9:05:56:
所以会把这些系统分别部署到不同镜像,然后让他们协同工作
碎石头 2017/2/11 9:06:13:
比如官方的 odoo镜像,它里面没有 postgresql
天天向上 2017/2/11 9:06:28:
Start a PostgreSQL server $ docker run -d -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo --name db postgres:9.4 Start an Odoo instance $ docker run -p 8069:8069 --name odoo --link db:db -t odooThe alias of the container running Postgres must be db for Odoo to be able to connect to the Postgres server. Stop and restart an Odoo instance $ docker stop odoo $ $ docker start -a odoo
碎石头 2017/2/11 9:06:37:
而是单独pull 一个postgresql
碎石头 2017/2/11 9:06:45:
docker run -p 8069:8069 –name odoo –link db:db -t odoo
天天向上 2017/2/11 9:06:51:
知道了,这个就是2个镜像协同工作的
碎石头 2017/2/11 9:06:56:
对,就是这行,里面的 –link db:db
碎石头 2017/2/11 9:07:16:
就把odoo镜像跟db关联起来
碎石头 2017/2/11 9:07:46:
应该说是两个container的关联,而不是镜像
天天向上 2017/2/11 9:07:55:
对
碎石头 2017/2/11 9:09:24:
再回过头来看看刚才说的应用和OS的关系,我先给你看一下Odoo的Dockerfile:
碎石头 2017/2/11 9:10:37:
这是官方的Dockerfile
天天向上 2017/2/11 9:11:26:
视从debian系统创建的镜像
碎石头 2017/2/11 9:11:38:
上面一个框里声明了这个镜像将基于哪个镜像创建,这里指定了一个名为 debian:jessie 的镜像
碎石头 2017/2/11 9:12:14:
下面一个框表示在 debian:jessie 镜像里要安装一些新的软件
天天向上 2017/2/11 9:12:59:
知道了
碎石头 2017/2/11 9:14:37:
嗯,接下来的第一个框是装Odoo,第二框把一些自定义的文件复制进镜像,其中 entrypoint.sh 是容器启动之后要自动执行的命令或脚本
碎石头 2017/2/11 9:17:17

天天向上 2017/2/11 9:19:09:
明白了,暴露端口后就可以用宿主机的外网ip+暴露端口访问container的服务了,是吗?
碎石头 2017/2/11 9:20:16:
第一框是设置默认用户,第二框是指定自动启动脚本
天天向上 2017/2/11 9:20:51:
明白了,
天天向上 2017/2/11 9:22:02:
这篇文章地址是什么
碎石头 2017/2/11 9:22:04:
以上是根据我理解的来说的,有些概念上会有偏差
碎石头 2017/2/11 9:22:23:
对于容器,更严格的说法是:
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。
碎石头 2017/2/11 9:22:54:
容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。
碎石头 2017/2/11 9:23:30:
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。
碎石头 2017/2/11 9:24:12:
所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
天天向上 2017/2/11 9:24:29:
将会变化的都从宿主映射过去?
碎石头 2017/2/11 9:25:59:
第一种是建立Volume,用 -v参数 ,例如
docker run -d -P –name web -v /webapp training/webapp python app.py
碎石头 2017/2/11 9:26:22:
第二种就是绑定宿主目录,就是我前面说的映射
碎石头 2017/2/11 9:27:54:
https://docs.docker.com/engine/tutorials/
天天向上 2017/2/11 9:28:02:
明白了,3Q
碎石头 2017/2/11 9:28:04:
这是官方文档
碎石头 2017/2/11 9:28:29:
https://yeasy.gitbooks.io/docker_practice/content/basic_concept/container.html
这是中文文档