容器化是一种著名的做法,正在大多数应用程序中实施。工业界正在转向以容器的形式部署应用程序,而不是用传统的内部部署方法。在这篇博客中,我们将了解容器化给开发者和DevOps带来的好处。让我们从这个旅程开始
什么是容器化?
这是过去几年在IT领域最流行的概念之一。在引入Docker这个容器化平台后,容器已经发展成一个更大的生态系统。让我们来了解其流行背后的原因。
一般来说,容器是由一个命名空间统一的软件集合,它可以访问操作系统内核,该内核在多个容器之间共享。容器在一个隔离的环境中运行,它们之间没有/很少有访问。Docker对这一定义进行了补充,称容器是Docker镜像的一个运行实例。一个正在运行的docker容器包括3个东西:
- 一个Docker镜像
- 一个执行环境
- 一套标准的指令
如果你来自面向对象的世界,你可以用类和对象的比喻来理解这个话题。Docker镜像就像类,而容器是这些镜像的运行实例,就像对象一样。
Docker生态系统
Docker Ecosystem主要由3个部分组成
- Docker引擎:
Docker引擎为容器提供运行环境。它还充当打包工具,帮助构建docker镜像。
它必须安装在实际要执行镜像的主机操作系统上。 - Docker Hub:
它是一个由docker提供的在线云服务,作为存储Docker镜像的仓库,可以在多个用户之间共享。 - Docker CLI:
这个组件负责对Docker引擎进行API调用。这些调用被用来管理Docker引擎的容器生命周期。
容器化的好处
对开发者
- 开发人员得到的主要好处是开发和打包应用程序的标准。
例如:对于java开发人员来说,一个jar(java应用程序的工件)需要相同版本的java才能运行,而它是用这个版本构建的。 - 测试一个应用程序并验证其与其他应用程序模块的依赖性,就像运行一个简单的
**docker run <dependent-container-image>** - 开发人员可以轻松地支持新的微服务架构。
- 另一个主要的好处是,它缓解了平台的兼容性问题。
对DevOps
- 使用容器可以简化发布管理。
- 部署更加可靠和快速,这最终有助于频繁发布。
- 应用程序的生命周期被简化了,因为现在应用程序被配置了多次并运行(扩大了容器的副本)。
- 环境的一致性(开发、QA和Prod)可以轻松实现。
容器:开发和运营之间的共同语言
[
在一个容器化的环境中,如果任何环境(尤其是生产环境)出现任何问题,都可以在容器层面轻松调试,然后传达给开发团队进行(快速)修复。
开发团队也很容易复制问题,因为容器每次都会在一个隔离的环境中运行,这就消除了运行时问题或主机兼容性问题。
Docker中的容器生命周期
[
谈到容器的生命周期,我们将看到一个容器是如何诞生,然后进入删除状态的。创建一个容器的首要条件是一个Docker Image。
Docker Image是一个模板,它被实例化以获得一个运行的容器。Docker Image可以通过两种方式提供给我们。我们可以从Docker Hub这个镜像库中获得,也可以使用Dockerfile构建我们自己的镜像。
Dockerfile是一个文件,我们在其中提到了运行我们的应用程序所需的所有软件包和依赖项。这个概念实际上使容器变得独立,因为所有东西都在容器中可用,它不需要与主机操作系统共享任何东西。我将创建一个单独的博文,包括编写Docker文件的步骤和最佳做法。
现在,在我们有了Docker镜像之后,我们可以简单地运行该镜像,从中获得一个Docker容器。这个容器实际上是我们应用程序的运行实例。
一个快速的实践
先决条件
- Docker安装:如 果你的系统中没有安装Docker,请按照这个文档进行安装。
注意:在完成安装后,请遵循安装后的步骤,这些步骤只有在重启后才会应用。这将有助于你在没有sudo权限的情况下运行docker-cli。 - DockerHub账户:确保你在DockerHub上有一个账户,如果没有,请在这里注册。
快速入门Gist
| ## 检查docker服务器和客户端的版本 |
| docker版本 |
| ## 检查正在运行的容器 | 目前,它应该是空的 |
| docker ps |
| ## 检查图像 | 目前,它应该是空的 |
| docker images |
| ## 现在从DockerHub拉取一个镜像(Nginx)。 |
| ## 语法:docker pull <image-name> |
| docker pull nginx |
| ## 再次检查图像 |
| docker images |
| ## 运行该镜像以获得容器 |
| ## 参考,nginx是一个网络服务器,用于托管网页。 |
| ## SYNTAX: docker run [OPTIONS...] <image-name>. |
| docker run -name my-nginx -d nginx |
| ##-name: 给容器取一个名字 |
| ##-d: 在后台运行容器(数据传输模式) |
| ## 验证容器是否正在运行 |
| docker ps |
| ## 获取容器的日志 |
| ## SYNTAX: docker logs <container-name/id> |
| docker logs my-nginx |
| ## 在容器中执行一个命令 | 检查默认的nginx配置 |
| ## SYNTAX: docker exec <container-name/id> <cmd-to-be-executed> <cmd-to-be-executed> >。 |
| dockerexecmy-nginx cat /etc/nginx/conf.d/default.conf |
| ## 获取各种容器信息 |
| ## 语法:docker inspect <容器名称/id> |
| docker inspect my-nginx |
| ## 获取nginx容器的默认网页 |
| ## 找到容器的IP并通过浏览器打开它 |
| docker inspect my-nginx -f'{{ range.NetworkSettings.Networks }}{{ .IPAddress }}{{ end }' |
| ##-f:用来定义我们想要的格式(针对特定的键获取值) |
| ## 让我们试着停止运行中的容器 |
| ## SYNTAX: docker stop <container-name/id> |
| docker stop my-nginx |
| ## 检查容器是否已经停止 |
| docker ps -a |
| ##-a:显示所有容器(运行和停止) |
| ## 再次启动该容器 |
| ## SYNTAX: docker start <container-name/id> |
| docker start my-nginx |
| ## 验证容器是否已经启动 |
| docker ps |
| ## 只显示正在运行的容器 |
| ## 通过修改容器,将Nginx的默认网页编辑成我们自己的一些HTML页面 |
| ## 使用Heredoc语法创建你自己的网页 |
| cat>index.html << EOF |
| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>欢迎来到nginx!</title>。 |
| <style> |
| body { |
| width: 35em; |
| margin: 0 auto; |
| font-family:Tahoma, Verdana, Arial, sans-serif; |
| } |
| </style> |
| <body style="background-color:powderblue;"> |
| <center> <h1 |
| <h1>这就是Docker快速入门</h1>。 |
| <h3>本教程由<h2>Yatharth | Knoldus的DevOps工程师</h2></h3>提供。 |
| <p> <b>喜欢并分享</b>该博客,如果你觉得它有帮助</p> <p |
| <p> 对于该作者的更多博客,<a href="https://blog.knoldus.com/author/yatharth45/" target="_blank" >点击这里</a></p> |
| </center> |
| </body> |
| </html> |
| EOF |
| ## 将html文件从本地复制到容器上 |
| ## SYNTAX: docker cp </path/to/file> <container-name/id>:</dest/path/to/file> |
| docker cp index.html my-nginx:/usr/share/nginx/html/index.html |
| ## 验证nginx是否开始渲染更新的html页面 | 再次获取容器IP并在浏览器中复制 |
| docker inspect my-nginx -f'{{ range.NetworkSettings.Networks }}{{ .IPAddress }}{{ end }'。} |
| ## 现在用一个新的图像保存更新的容器 |
| ## 为什么?| 因为容器是短暂的,一旦容器被停止,我们所做的改变就会丢失。 |
| ## SYNTAx: docker commit <container-name/id> <new-image-tag> </new-image-tag>. |
| docker commit my-nginx my-nginx-image |
| ## 检查新的镜像 |
| docker images |
| ## 运行新的容器镜像 |
| docker run -name my-new-nginx -d my-nginx-image |
| ## 验证该容器正在运行 |
| docker ps |
| ## 检查由新的nginx容器托管的网页 | 获取容器的IP地址并将其复制到浏览器上。 |
| docker inspect my-new-nginx -f'{{ range.NetworkSettings.Networks }}{{ .IPAddress }}{{ end }' |
| ## 重命名现有的docker镜像为"<dockerhub-id>/<image-name>" |
| ## 为什么?因为,为了将镜像推送到dockerhub,我们需要遵循上述格式 |
| ## SYNTAX: docker tag <image-name> <dockerhub-id>/<new-image-name>. |
| docker tag my-nginx-image yatharth0045/my-nginx-image |
| ## 通过docker CLI用你的dockerhub信条登录到dockerhub |
| docker登录 |
| ## 它将提示你的ID和密码 |
| ##推送图像到dockerhub |
| ## SYNTAX: docker push <dockerhub-id>/<image-name>. |
| docker push yatharth0045/my-nginx-image |
| ## 移除运行中的容器 |
| ## 方式1 | 停止容器,然后删除它 |
| docker stop my-nginx&& dockerrm my-nginx |
| ## 方式2 | 强制删除容器 |
| docker rm -f my-new-nginx |
| ## 从本地删除镜像 |
| ## 移除多个镜像 |
| ## SYNTAX: docker rmi <image/s> |
| docker rmi nginx my-nginx-image yatharth0045/my-nginx-image |
总结
读完这篇博客后,你会知道什么是容器化,以及团队在构建和部署应用程序时得到的好处是什么。另外,通过我提供的快速入门,你会对大多数docker命令有一个亲身体验,在稍加练习后,这些命令对你来说会非常方便。
,如果你有任何疑问/建议,可以直接联系我,yatharth.sharma@knoldus.com。