把代码和环境做成docker镜像_新⼿指南:如何将应⽤打包成
为Docker镜像?
虽然 DockerHub 提供了⼤量的镜像,但是由于企业环境的多样性,并不是每个应⽤都能在 DockerHub 到对应的镜像来使⽤。那就要求企业的运维⼈员掌握制作 Docker 镜像的技能。在开始打包应⽤前,你⾸先要明⽩这两件事:
第⼀件事是选择适合你的⽅式来⽣成镜像: 1. 通过 Dockerfile 来⾃动编译⽣成镜像,实现构建镜像的需求。 2.通过容器内操作,并进⾏Commit 来实现打包⽣成镜像。第⼀种思路多⽤于⽤户交互较少的时刻,⽐如软件部署时⽆需输⼊任何命令的应⽤。第⼆种思路⽤于⽤户交互较多、安装过程中配置较多的应⽤。
第⼆件事是你需要注意,如何拆分现有的应⽤,来实现打包。Docker 容器化的应⽤应当是功能最⼩化的应⽤。这⾥的拆分并不是指将每个软件拆分成为⼀个容器,⽽是强调实现功能最⼩化。拿最常见的 LAMP 架构来讨论。最⼩化的结构应当是 Apache 和 PHP 在⼀个容器内, MySQL 在⼀个容器内。⽽不是将 Apache 、 PHP 、 MySQL 各⾃拆分⼀个容器。 Apache 和 PHP 的有机结合使结构内的应⽤完整的实现了 PHP 解析和 Web 页⾯的功能,⽽ MySQL 独⾃承担了数据存储的功能。⽽各⾃拆分⼀个容器会导致架构极为复杂,在进⾏容器扩容时也容易受到影响。⼀般来说,你可以将应⽤拆分成为 2-3 个容
器, 2 个容器的情况下,是数据存储和应⽤程序各⾃⼀个容器。对于部分应⽤,可能还有缓存系统,同样也要单独放置在⼀个容器内。这样的结构下,在你需要扩容时,就⽐较容易,根据你的需要,可以随时扩容缓存系统或应⽤程序。
明了了上⾯的两件事,接下来进⼊应⽤打包的环节。
Dockerfile 打包
⾸先,我们先看下 Docker 官⽅打包的 Tomcat 镜像的 Dockerfile.
我们可以看到,⾥⾯⼤量执⾏了 Linux 命令,来安装,部署软件,并且对于需要确认的命令都加⼊-f 来强制执⾏。确保没有交互,因为在编译镜像的过程中,⽆法进⾏交互操作,如果碰到交互操作,卡住就会导致镜像编译的失败,故⽽ DockerFile 不⽀持需要输⼊命令的安装脚本等
当然,对于 Dockerfile,我们同样也有⼀些最佳实践:
通过 Dockerfile 构建的镜像应当尽可能精简。
尽量不安装⾮必要的软件包。
⼀个容器只运⾏⼀个单独的实例,将具有耦合度的应⽤分别安装到不同的容器⾥⾯。
慎重引⼊新的数据层
将准备安装的软件包按安装的字母顺序排列,这样可以避免重复安装软件包的情况,同时也有助于进⾏软件更新。通过添加 “\” 分割命令,增加代码的可读性docker打包镜像
尽量选择官⽅提供的镜像版本来作为基础镜像,减⼩镜像的体积。
将多条 RUN 命令使⽤"/"连接起来,这样更易于理解,可以⽅便维护。
为镜像定义⼀个⽐较通⽤的端⼝,⽐如提供 HTTP Web 服务的镜像,最好是暴露 80 端⼝。
Dockerfile 的开头⼏⾏的指令应当固定下来,不要每次都随意更改,这样可以利⽤缓存
通过 – t 标记来构建镜像,有助于⽤户管理每个创建的镜像。
不要在 Dockerfile 中映射公有端⼝。
使⽤ CMD 和 ENTRYPOINT 时,⼀定要⽤数组语法,⽽且 CMD 和 ENTRYPOINT 结合使⽤更好
不要开机初始化
在 Push 之前,现在本地构建运⾏⼀下,确保本地构建的镜像可以在任何地⽅正常运⾏。
不要在构建中升级版本,如果更新时试图修改 Init 或改变容器的内容,更新可能会失败,还可能产⽣不⼀致的镜像。
FROM 命令应该包含基础镜像的完整仓库名和标签
使⽤指令组合,⽐如 apt-get update 应该和 apt-get install 结合。
基础镜像 Commit ⽣成镜像
除了通过 Dockerfile 来打包⽣成镜像外,也可以通过 Docker Commit 来⽣成镜像。通过 Commit 打包的镜像多是由于应⽤本⾝在部署时有⼤量的交互内容,⽆法通过命令来指定。
在通过 Commit 打包镜像时,我们需要如下操作:
1.启动⼀个基础镜像容器,并进⼊ console
docker run -i – t centos:6.7
上⾯的命令创建了⼀个基于 CentOS 6.7 的容器,并进⼊到容器内
2.执⾏配置环境的命令
登陆容器后,可以执⾏各种 Linux 下的命令。
等配置完环境后,打开⼀个新的控制台
执⾏命令docker ps,可以看到正在运⾏的容器
⽐如我的容器的 ID 就是 35f1c2ae1f7e
3.将容器打包成镜像
执⾏命令 docker commit 35f1c2ae1f7e mynewimage
就将容器35f1c2ae1f7e打包为新的镜像mynewimage了
可以执⾏docker images查看镜像
另外,蜂巢的保存为镜像的功能,就是基于此功能制作的,通过云端容器 Console 的操作,并打包成为镜像,⼤⼤降低了上云的难度。⽆需在本地部署 Docker 环境,即可实现应⽤的容器化;同时云端打包镜像⽐本地打包速度也要更快些,⼤⼤提升了上云的速度。
PS.其实官⽅推荐:单个镜像单个进程。这样的情况下,有利有弊利在于,单进程容器更加适合纵向扩
展和复⽤。但是,在较⼤的产品框架下,可能容器之间的关联会⾮常复杂。创建⼀个应⽤可能会需要创建⾮常多的容器。所以,在我看来如何划分,还是应该看使⽤场景和技术路线,量⾝定制.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论