资料教程

元宵节早上关于docker的一些讨论

前言:
今天早上,勤奋的“天天向上”兄在QQ上问了一个有关docker容器的问题,从引而发一场小小的讨论,我觉得挺好,就贴出来供自己和有需要的同学们参考。对docker我也是半桶水,我只是基于我自己的理解而发,理解上有很多可能是有偏差或错误的,所以同学们还是以看官方文档为主,讨论最后我贴出了官方文档的地址。
我保留了对话的原始状态,对于有兴趣学习Docker的同学可以做为改错题来使用。 :)
以下为讨论内容:
===================================

天天向上 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
这是中文文档

发表评论

邮箱地址不会被公开。 必填项已用*标注