使用docker

时间:2017-02-19 02:41:34

标签: docker

我正在尝试学习docker以帮助我进行开发。我可以想象使用已预装的软件(如Kafka,nodeJS,redis,mysql等)的docker图像似乎比手动安装所有内容要容易得多!

我对这个用例几乎没有问题。同样,这些更容易为我自己创建开发环境,而不是在生产中部署docker!

  • 假设我们有一个使用kafka,redis,nodeJS和mysql的应用程序。如果 我想在我的机器上使用docker容器进行设置,是吗? 正确地假设最佳设置是a。)每个运行 从他们自己的独立码头图像和b。)他们每个人 使用各自码头工人的开放端口进行通信?
  • 我的webapp代码将成为托管nodeJS的docker的一部分?所以 每次我需要更新我的webapp代码,我需要更改和 提交到nodeJS容器。
  • 当我使用我的webapp保存数据时,我假设它被保存在内 mysql容器。因此,如果我想保存DB状态,我将需要 确保我保存并提交(mysql)容器内容,对吧?

此外,建议任何针对码头工人开发人员的阅读材料!

4 个答案:

答案 0 :(得分:0)

这个问题的答案将根据定义来解释,这完全取决于您的项目要求。

不应将Docker视为软件安装的节省时间(,但这实际上是人们现在所做的事情,导致新一代开发人员从未安装过mysql。)它是更多的方法来管理环境/团队成员之间的软件分发。它有助于确保所有组件的配置方式相同/在任何地方都有相同的数据。

例如,要在本地安装redis或nodeJs,您在终端中键入一个命令,因此除非您必须使用不同的配置/版本并分发它们,否则docker不会节省太多精力。 Docker实际上增加了一层复杂性,唉它试图尽可能地减少它。

通常,最好将部署组件分离到不同的映像中。 Docker创建自己的网络接口,除了您决定将容器端口映射到本地NIC之外,所有组件间通信都是对您的网络隐藏的。

关于代码,我不明白你为什么要在容器内开发代码。通常,您将代码保存在某些VCS(如GIT)中,并使用它来生成可分发的包,如docker图像。同样,安装/维护本地nodeJs / npm从来都不是问题。

保存数据时,它会保存在容器中。您可以从容器中生成图像,但这很糟糕。您希望生成用数据填充数据库的SQL脚本(您可以通过从容器导出来实现),然后使用这些脚本从头开始构建新映像(请参阅Dockerfile)。

答案 1 :(得分:0)

  

让我们说我们有一个使用kafka,redis,nodeJS和mysql的应用程序。如果我   想要使用docker容器在我的机器上设置它,是吗?   正确地假设最佳设置是a。)每个运行   从他们自己的独立码头图像和b。)他们每个人   使用各自码头工人的开放端口进行通信?

多数民众赞成正确,使用微服务架构,我们希望将应用程序划分为微服务,并将每个微服务托管在自己独立的容器中。这提供了各种优势:

  • 能够轻松切换技术
  • 故障遏制
  • 易于升级
  • 易于扩展
  • ...

使用用户定义的网络,您可以轻松地将容器连接在一起。

sudo docker network create mynet
  

我的webapp代码将成为托管nodeJS的docker的一部分?所以   每次我需要更新我的webapp代码,我需要更改和   提交到nodeJS容器。

多数民众赞成可能,但我不推荐它,你可以从docker主机bind mount代码,并在主机上提交它(容器中的代码也会改变(因为bind mount)。您可能需要重新启动服务,具体取决于容器中的应用程序以反映更改。

  

当我使用我的webapp保存数据时,我假设它已保存在其中   mysql容器。因此,如果我想保存DB状态,我将需要   我确定保存并提交(mysql)容器内容,对吗?

您不应该在容器中保留持久数据。您应该为持久数据使用bind mount或卷。在你的情况下,mysql需要将mount或volume mount绑定到/var/lib/mysql以保持持久数据不受容器限制。这提供了许多优点,例如易于服务版本升级。

绑定挂载示例:

sudo docker run -d --name mysql --network mynet -v /path/to/directory/on/host:/var/lib/mysql mysql

卷示例:

sudo docker run -d --name mysql --network mynet -v myvolumename:/var/lib/mysql mysql

答案 2 :(得分:0)

我只是简单地回答你的3个问题:

  

"假设我们有一个使用kafka,redis,nodeJS和mysql的应用程序。如果   我想在我的机器上使用docker容器进行设置,是吗?   正确地假设最佳设置是a。)每个运行   从他们自己的独立码头图像和b。)他们每个人   使用各自码头工人的开放端口进行通信?"

是的,完全。

  

"我的webapp代码将成为托管nodeJS的docker的一部分?所以   每次我需要更新我的webapp代码,我需要更改和   提交到nodeJS容器。"

这很麻烦。您可以使用" run -v hostdir:container-webapp-dir"

将webapp目录从nodeJS容器映射到主机上的目录。
  

"当我使用我的webapp保存数据时,我假设它被保存在其中   mysql容器。因此,如果我想保存DB状态,我将需要   我确定保存并提交(mysql)容器内容,对吗?"

没有什么能真正被视为"已保存"在容器中,只有卷存储数据。因此,如果您有一个mysql容器,您将在您的主机上保存/ var / lib / mysql容器目录(在官方映像Dockerfile中声明为" VOLUME / var / lib / mysql")。您还可以在每个容器中拥有卷,以便在容器drop(logs,conf,...)之间保存所需的任何内容。 "容器掉落" =完全删除容器以升级版本,例如,当您停止并启动容器时,它不会从容器内部擦除您的日志,即使它们没有存储在卷中。

答案 3 :(得分:0)

我建议您应该为每个DataStore使用单独的docker,即(Redis,Kafka,Zookeeper,Mysql),并在每次对代码进行一些修改时在主机上运行应用程序,而不需要构建docker图像,将节省您的时间。

  • 你可以使用alpine Linux docker图像,它非常轻巧,并且比ubuntu和centos图像都更好用作docker。

  • 您应该为每个数据存储(Mysql,Redis,Kafka,Zookeeper)使用单独的docker,因为您可以轻松管理数据存储,例如升级数据存储版本而不会打扰其他来源。易于创建集群。

  • 您应该使用主机安装docker目录,以便保留docker数据。

下面提到了您可以用于开发环境的泊坞窗图像:

  1. 用于mysql的Docker:
  2.   

    docker run --net = host -d -it -p 3306:3306 -v   / var / lib / mysql:/ var / lib / mysql yobasystems / alpine-mariadb

    1. redis的Docker:
    2.   

      docker run -d -it --net = host smebberson / alpine-redis

      同样,您可以找到要使用的Kafka和其他数据存储的docker镜像。 使用公开的docker镜像可以节省您的大量精力和时间。 要查看有关泊坞广告的更多详细信息:empty