我正在尝试学习docker以帮助我进行开发。我可以想象使用已预装的软件(如Kafka,nodeJS,redis,mysql等)的docker图像似乎比手动安装所有内容要容易得多!
我对这个用例几乎没有问题。同样,这些更容易为我自己创建开发环境,而不是在生产中部署docker!
此外,建议任何针对码头工人开发人员的阅读材料!
答案 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数据。
下面提到了您可以用于开发环境的泊坞窗图像:
docker run --net = host -d -it -p 3306:3306 -v / var / lib / mysql:/ var / lib / mysql yobasystems / alpine-mariadb
docker run -d -it --net = host smebberson / alpine-redis
同样,您可以找到要使用的Kafka和其他数据存储的docker镜像。
使用公开的docker镜像可以节省您的大量精力和时间。
要查看有关泊坞广告的更多详细信息:empty