Docker:开始。 注意事项 部署

您必须多久配置一次服务器环境来部署应用程序(例如,网站)? 当然比我想要的更多。

最好的情况是,您有一个脚本会自动执行所有这些操作。 在最坏的情况下,它可能看起来像这样:

  • 安装数据库D版本xxx
  • 安装Web服务器N版本xx,等等。

随着时间的推移,以这种方式配置的环境管理变得非常耗费资源。 任何微小的配置变化至少意味着:

  • 每个开发人员都应该意识到这些变化
  • 所有这些更改应安全地添加到生产环境中

没有专用工具,很难跟踪和管理此类更改。 无论如何,环境依赖项的配置存在问题。 发展的步伐越快,发现和解决这些问题就越困难。

上面,我描述了所谓的供应商锁定。 对于应用程序的开发,特别是服务器类型的应用程序,此现象成为一个大问题。 在本文中,我们将考虑一种可能的解决方案-Docker 。 您将学习如何基于该应用程序创建,部署和运行应用程序。



/免责声明:/这不是对Docker的评论。 本文结尾是一系列有用的文献,描述了如何更好地使用Docker。 这是计划使用Docker容器部署node.js应用程序的开发人员的第一个切入点。

在开发我的一个项目时 ,我面对的是缺少详细的文章,这导致了相当数量的自行车。 这篇文章试图解决有关该主题的信息不足有点晚。

这是什么,它和什么一起吃?


简而言之,Docker是LXC容器的抽象。 这意味着使用Docker启动的进程将仅看到自己及其后代。 这种过程称为Docker容器。

为了能够基于此类容器创建某种抽象,Docker中存在一个映像(/ docker image /)。 基于Docker映像,您可以配置和创建容器。

有成千上万个带有预装数据库,Web服务器和其他重要元素的现成Docker映像。 Docker的另一个优点是它是一种非常经济的内存消耗工具,因为它仅使用所需的资源。

靠近一点


我们将不再详细介绍安装 。 过去几个发行版中的过程已简化为几次单击/小组。

在本文中,我们将使用服务器端Node.js应用程序的示例来分析Docker应用程序的部署。 这是它的原始源代码:

// index const http = require('http'); const server = http.createServer(function(req, res) { res.write('hello world from Docker'); res.end(); }); server.listen(3000, function() { console.log('server in docker container is started on port : 3000'); }); 

我们至少有两种将应用程序打包到Docker容器中的方法:

  • 使用命令行界面工具从现有映像创建并运行容器;
  • 根据完成的样本创建自己的图像。

第二种方法使用更频繁。

首先,下载官方的node.js映像:

 docker pull node 

docker pull命令下载Docker映像。 之后,您可以运行docker run命令。 这将基于下载的映像创建并运行容器。

 docker run -it -d --rm -v "$PWD":/app -w=/app -p 80:3000 node node index.js 

此命令将启动index.js文件,将3000个端口映射到80,并显示创建的容器的ID。 已经更好了! 但是在一个CLI上您不会走得太远。 让我们为服务器创建一个Dockerfile。

 FROM node WORKDIR /app RUN cp . /app CMD ["node", "index.js"] 

该Dockerfile描述了从其继承当前版本的映像,以及容器命令和复制文件命令将从其中启动映像程序集的目录开始的目录。 最后一行指示哪个命令将在创建的容器中运行。

接下来,我们需要从将要部署的该Dockerfile中构建一个映像:docker build -t username / helloworld-with-docker:0.1.0 。 此命令创建一个新图像,并用用户名/ helloworld-with-docker标记它,并创建一个0.1.0标签。

我们的容器已经准备好了。 我们可以使用docker run命令运行它。 因此,我们解决了供应商锁定问题。 应用程序的启动不再取决于环境。 代码与Docker映像一起交付。 这两个条件使我们可以将应用程序部署到可以运行Docker的任何位置。

部署


前99%并不比其余99%糟糕。

完成上述所有说明后,部署过程本身将成为技术和开发环境的问题。 我们将考虑两种部署Docker的选项:

  • 手动部署Docker映像;
  • Travis-CI进行部署。

在每种情况下,我们都将考虑将映像交付到独立的环境,例如产品的登台服务器。

手动部署


如果您没有任何持续集成环境,则此选项很好。 首先,您需要将Docker映像上传到登台服务器可访问的位置。 在我们的例子中,它将是一个DockerHub。 对于每个用户,他免费提供一个私有映像存储库和无限数量的公共存储库。

登录以访问我们的DockerHub:

 docker login -e username@gmail.com -u username -p userpass 

我们在此处加载映像: docker push用户名/ helloworld-with-docker:0.1.0。

接下来,转到登台服务器(我提醒您,必须已经在其上预先安装了Docker)。

要在服务器上部署我们的应用程序,我们只需要执行一个命令:

 docker run -d --rm -p 80:3000 username/helloworld-with-docker:0.1.0. 

仅此而已! 检查图像的本地注册。 如果找不到所需的结果,请输入用户名/ helloworld-with- docker检查DockerHub注册表。 可以在寄存器中找到具有该名称的图像,因为我们已经将其上传到该寄存器中。 Docker下载它,在其基础上创建一个容器,然后在其中启动您的应用程序。

现在,每次需要更新应用程序的版本时,都可以使用新标签进行推送,并且每次都只需重新启动服务器上的容器即可。

PS如果可以使用Travis-CI,则不建议使用此方法。

使用Travis-CI进行部署


首先,将DockerHub数据添加到Travis-CI。 它们将存储在环境变量中。

 travis encrypt DOCKER_EMAIL=email@gmail.com travis encrypt DOCKER_USER=username travis encrypt DOCKER_PASS=password 

然后,我们将接收到的密钥添加到.travis.yml文件中。 我们还将在每个键上添加注释,以便将来区分它们。

 env: global: - secure: "UkF2CHX0lUZ...VI/LE=" # DOCKER_EMAIL - secure: "Z3fdBNPt5hR...VI/LE=" # DOCKER_USER - secure: "F4XbD6WybHC...VI/LE=" # DOCKER_PASS 

接下来,我们需要登录并下载图像:

 after_success: - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS - docker build -f Dockerfile -t username/hello-world-with-travis. - docker tag username/hello-world-with-travis 0.1.0 - docker push username/hello-world-with-travis 

此外,可以通过多种方式从Travis-CI启动图像传递:

  • 手动
  • 通过ssh连接;
  • 在线部署服务(Deploy Bot,deployhq);
  • AWS CLI;
  • Kubernates;
  • Docker部署工具。

总结


在本文中,我们以简单的node.js服务器为例,以两种方式检查了Docker的准备和部署:自动和使用Travis-CI进行自动化。 希望本文对您有所帮助。

Source: https://habr.com/ru/post/zh-CN466493/


All Articles