了解容器化及其由Docker实现的情况

147 阅读8分钟

容器化是一种著名的做法,正在大多数应用程序中实施。工业界正在转向以容器的形式部署应用程序,而不是用传统的内部部署方法。在这篇博客中,我们将了解容器化给开发者和DevOps带来的好处。让我们从这个旅程开始

什么是容器化?

这是过去几年在IT领域最流行的概念之一。在引入Docker这个容器化平台后,容器已经发展成一个更大的生态系统。让我们来了解其流行背后的原因。

一般来说,容器是由一个命名空间统一的软件集合,它可以访问操作系统内核,该内核在多个容器之间共享。容器在一个隔离的环境中运行,它们之间没有/很少有访问。Docker对这一定义进行了补充,称容器是Docker镜像的一个运行实例。一个正在运行的docker容器包括3个东西:

  • 一个Docker镜像
  • 一个执行环境
  • 一套标准的指令

如果你来自面向对象的世界,你可以用类和对象的比喻来理解这个话题。Docker镜像就像类,而容器是这些镜像的运行实例,就像对象一样。

Docker生态系统

Docker Ecosystem主要由3个部分组成

  1. Docker引擎:
    Docker引擎为容器提供运行环境。它还充当打包工具,帮助构建docker镜像。
    它必须安装在实际要执行镜像的主机操作系统上。
  2. Docker Hub:
    它是一个由docker提供的在线云服务,作为存储Docker镜像的仓库,可以在多个用户之间共享。
  3. Docker CLI:
    这个组件负责对Docker引擎进行API调用。这些调用被用来管理Docker引擎的容器生命周期。

容器化的好处

对开发者

  1. 开发人员得到的主要好处是开发和打包应用程序的标准。
    例如:对于java开发人员来说,一个jar(java应用程序的工件)需要相同版本的java才能运行,而它是用这个版本构建的。
  2. 测试一个应用程序并验证其与其他应用程序模块的依赖性,就像运行一个简单的 **docker run <dependent-container-image>**
  3. 开发人员可以轻松地支持新的微服务架构。
  4. 另一个主要的好处是,它缓解了平台的兼容性问题。

对DevOps

  1. 使用容器可以简化发布管理。
  2. 部署更加可靠和快速,这最终有助于频繁发布。
  3. 应用程序的生命周期被简化了,因为现在应用程序被配置了多次并运行(扩大了容器的副本)。
  4. 环境的一致性(开发、QA和Prod)可以轻松实现。

容器:开发和运营之间的共同语言

[

在一个容器化的环境中,如果任何环境(尤其是生产环境)出现任何问题,都可以在容器层面轻松调试,然后传达给开发团队进行(快速)修复。

开发团队也很容易复制问题,因为容器每次都会在一个隔离的环境中运行,这就消除了运行时问题或主机兼容性问题。

Docker中的容器生命周期

[

谈到容器的生命周期,我们将看到一个容器是如何诞生,然后进入删除状态的。创建一个容器的首要条件是一个Docker Image。

Docker Image是一个模板,它被实例化以获得一个运行的容器。Docker Image可以通过两种方式提供给我们。我们可以从Docker Hub这个镜像库中获得,也可以使用Dockerfile构建我们自己的镜像。

Dockerfile是一个文件,我们在其中提到了运行我们的应用程序所需的所有软件包和依赖项。这个概念实际上使容器变得独立,因为所有东西都在容器中可用,它不需要与主机操作系统共享任何东西。我将创建一个单独的博文,包括编写Docker文件的步骤和最佳做法。

现在,在我们有了Docker镜像之后,我们可以简单地运行该镜像,从中获得一个Docker容器。这个容器实际上是我们应用程序的运行实例。

一个快速的实践

先决条件

  1. Docker安装:如 果你的系统中没有安装Docker,请按照这个文档进行安装。
    注意:在完成安装后,请遵循安装后的步骤,这些步骤只有在重启后才会应用。这将有助于你在没有sudo权限的情况下运行docker-cli
  2. 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/&quot; 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