Docker使用心得
开发
Docker概要
在我编写我的网站到了需要多个服务框架的时候,Docker出现在了我的谷歌搜索结果里。
那么Docker是什么,他的图标,一条满载集装箱的船非常形象的对此做出了解释。
工厂能建好一条船,工厂就能建好无数条船。——不知道谁说的
它是把一个项目用到的多个服务组合起来的工具, 同时他也相当于一份应用程序结构设计图,多么复杂的应用结构,都能通过一条命令就自动安装好并正常启动。 当一个项目用到的不同服务越来越多时,Docker就变得不可或缺了。 不管是什么应用程序或者五花八门的硬件软件配置,我们只需要在一开始解决如何在服务器上正确安装Docker,接下来就舒服了。
一些基本名词
Image
Image
,镜像是一个应用中其中一个服务的设计图,多个镜像组合起来变成一个完整的设计图。
我们会把项目中相对独立的一个部分定义为一个服务,并用Dockerfile
配置好这个服务的Image
。
Dockerfile
这是构建Docker
镜像的脚本,在构建镜像的时候会执行里面的命令,例如安装一些服务需要的依赖库。
或者复制我们的代码文件到镜像里。
Container
在我们构建好镜像后,就可以启动服务了。
这时候使用一条命令即可实例化这个镜像,这会创建一个容器container
,服务此时就运行在这个容器中。
我们可以用docker exec <容器名>
命令直接在容器内执行shell命令。
Docker Compose
但是,我们的应用程序用到了多个服务,我们需要运行很多条命令才能把所有的服务都启动。
有时候我们还需要给启动命令添加一些复杂的参数,例如添加数据卷volume
,绑定端口ports
,
又或者添加环境变量environment
才能让容器正确运行。
这时我们可以用docker-compose工具,可以将所有配置好的镜像,
以及这些启动时需要执行的代码都写在一份.yml
配置文件里面,然后用一条命令就能直接部署整个应用程序。
经验之谈
关于Docker的使用方法,全都能从官方文档里找到,一些基本的经验之谈也能从各大论坛和搜索引擎找到。 我这里只补充记录一下我自己在开发和运维上总结的实用方法,供大家参考。
关于Dockerfile
编写,每一条RUN
命令都会创建一个新的镜像层,更多的镜像层会导致更多的空间占用,
因此应该秉承一个尽量少用的理念, 用&&
将多个RUN
命令合并为一个。
但是,在你后期更新你的应用程序,添加新功能甚至是修复bug的时候,都需要重新构建镜像,
这些RUN
命令又会重新跑一次,不仅浪费带宽,而且浪费时间。
而且,如果一层镜像发生改变,这层以后的镜像的缓存都会失效,导致重新构建。
如果你会比较频繁地在生产环境中更新新功能的话, 更优雅的做法是,不要过度追求减少镜像层,而是将最不容易发生改变的, 而且最花时间的命令尽可能放到最前,例如安装一些一些底层依赖包。 然后将改变最频繁而且不需要占用网络资源的东西放到最后,例如复制代码文件。 这样,那些花时间的部分就会只在必要的时候重新执行,心急着上线看看效果的我们就不需要去装模作样泡杯咖啡了。
最后送大家一句话,
除非你知道你在做什么,否则基础镜像不要用Alpine Linux,变小一时爽,调试火葬场。
标签:
上一篇
下一篇