Docker 的一些疑问

2018-08-15 21:37:15 +08:00
 wangxiaoaer

有个需要打造成产品化的应用,再 linux 下运行,需要编译 c++的代码给 nodejs 用,觉得如果每次都到客户服务器去安装各种环境比较麻烦,所以在想 docker 是不是合适。

如果合适的话有一些疑问:

1 镜像制作

在创建 dockerfile 的时候,首先把 c++代码拷贝进去,然后安装依赖,编译,删掉源码,清理安装包,是这个流程吗? 但是如何保障清理到位,安装的依赖可能很多,如果清理不干净是不是会导致 image 特别大?

2 镜像发布

创建好的镜像不适合放到 dockerhub 上,直接拷贝到目标机器可以吗?

3 镜像运行

类似 npm install 这种命令是在创建镜像的时候运行还是容器启动的时候运行?另外,第三方如果接触到了服务器,是不是可以通过 docker 的交互命令把编译好的内容拷贝出来?

4 成本(这里的成本跟上面说的那个产品无关,说的是我们自己的一些应用)

按我的理解,一般一个应用一个 docker 容器,如果是自己的物理服务器,配置高点,可以跑很多个容器。但是如果是购买类似阿里云上面的容器服务,感觉稍微高点的配置就很贵,比如一个计算型的 4 核 8g 的实例将近 2.5 元一个小时,一年 1.8w 左右,同样的物理服务器 1 年 1w 多点。

假设我们有 10 个应用,1 个 java 内存耗的多点,买了那个计算型的实例,其他 9 个买的低内存实例,1 年 2.5 万差不多了。

但是购买 ECS 的话,4 核 8g 上面跑 10 个应用问题不大,因为 java 那个应用未必一直占用资源,算下来即使扩充到 4 核 16g,1 年也不会超过 2w。这个算法有什么问题吗?还是使用方式不当?

5 网络环境

docker hub 可以用国内镜像,但是通过 apt 安装 docker 费了老大劲,因为 docker.com 被墙了啊,客户服务器环境难道还需要临时搭建一个科学上网的服务?

docker 新手,上面问题恳请大佬帮帮忙。

1184 次点击
所在节点    问与答
24 条回复
mritd
2018-08-16 09:17:04 +08:00
第三点,npm install 这种应当在镜像制作时完成,因为这算做运行时依赖(runtime),docker 有一部分功能就是保证运行时一致性,如果你在启动后做,那么恕我直言,npm 的尿性包管理配置不好很可能在不同时间点 出现有的成功有的失败这种情况(比如某些包要去 github 下载文件,过几天 guthub 文件被删了),最终你要保证一点,runtime 在 build 期固化,运行时只应当做一些启动动作,或者额外附加一些 文件的权限修复 (chmod)
mritd
2018-08-16 09:20:37 +08:00
第四点,成本问题没法回答你,自己测试自己算喽🙃

第五点,docker 安装包可以离线下载,正常情况你也不应该每个机器都用 包管理器从网络安装,因为在不同时间点你可能安装出多个版本来,版本间兼容性可能影响你的稳定性,同一个集群应当保持版本一致,还有一点也是我被坑过的事,apt 安装后会在本地写入 apt 源,有一天有人没看就来了一下 apt uograde -y
uorz
2018-08-16 09:21:46 +08:00
用 docker 的分段编译,完全不用担心最后的 images 过大。最简单的方式是在你本地编译通过,然后用 ldd 看需要哪些 so 文件,,这样根本不关 gcc 啥事,用 ADD 把这些文件添加到 docker 里面,然后 export 一下你的 docker image。生成的文件像 binary 一样拷过去 import 一下就成了。
uorz
2018-08-16 09:23:49 +08:00
用 export 完全不用担心啥 docker history 被泄露

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/480181

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX