2017-12-01 19 views
5

私は、生産にElixir/Erlangアプリケーションを使用してDockerと一緒に行かないといけない理由を知りたいと思います。これはDockerの生産開始時に初めて要求されたものです。私はErlang/Elixir開発者です。私はDockerなしで稼働している1秒間に何百万件ものトランザクションを処理する高トラフィックのプロダクションサーバーに取り組んでいました。私は、ネットワークに関する多くの問題を伴うElixir Applicationイメージの作成と実行私はDNS設定などのために多くの設定をしなければなりませんでした。私が思うようになった後に、さらに進める強い理由は何ですか?生産のElixir/Erlangアプリケーションを持つDockerに行かないといけない理由があります。Dockerを使ったElixir/Erlangアプリケーション

私はフォーラムでいくつかの理由を調べましたが、確信が持てません。ドッカーが提供しているすべての利点は、すでにErlang VMにあります。フォームのErlangエキスパートが私を助けてください。

答えて

0

おそらく、使用するサーバーによって異なります。たとえば、私が知っていることから、DockerはAWS Elastic BeanstalkでPhoenixアプリケーションのデプロイメントを容易にしますが、私は現時点で非常に具体的な理由を示すのに十分な能力がありません。

誰かがもっと詳しく説明できるかもしれません。

0

Dockerは、主に展開および配布ツールです。 Dockerドキュメントから:

Dockerは、開発者がアプリケーションとサービスを提供するローカルコンテナを使用して標準化された環境で作業できるようにすることで、開発ライフサイクルを合理化します。コンテナは、継続的な統合と継続的な開発(CI/CD)のワークフローに最適です。

アプリケーションに外部依存関係(暗号ライブラリなど)がある場合は、別の言語で書かれた別のアプリケーション(別のプロセスとして実行されているデータベースなど)とやりとりするか、特定のオペレーティングシステム/環境設定(いくつかのDNS設定が必要だと言われていました)、アプリケーションをドッカーコンテナにパッケージ化すると、依存関係をインストールしたり、環境を設定したりする作業を避けることができます。依存関係のテストや運用環境を同期させたり、アプリケーションが1つの環境内の1つのマシンで動作する理由を調べたり、別の環境では動作しない理由を調べたりする余分な作業を避けることができます。

上記はErlangアプリケーションに固有のものではありませんが、Erlangはクロスプラットフォームの問題のいくつかを排除し、依存関係のいくつかを抽象化するのに役立ちます。

あなたが開発者だと言われて以来、Dockerは管理者やインフラストラクチャを実行しているチームにとって、開発者にとってよりも多くの利点があります。

5

AWSのプロダクトでDockerにパッケージ化されたElixirをデプロイします。 これは私の好みのやり方でしたが、今はすべてのプレインストールされたPackerを使って自分のAMIを作成する傾向があります。

デプロイメントの中心的な問題は、Dockerを活用する際にある程度、私が感じるコントロールの問題です。

Dockerの主な欠点は、epmdを超えるノード間接続など、Erlang/Elixirの機能を制限することです。これはまた、remshが実質的に問題にならないことを意味し、涼しい:observer.startはノーではありません。何らかの理由でプロダクションノードとやりとりする必要がある場合は、Dockerなどに入って最初にサーバに入るという余分な障壁があります。何かをチェックしているときにうまくいくと、プロダクションが燃えているときにイライラします苦しんでいる。 Beamがすべてのコアを効率的に使用するので、1つのノードで複数のコンテナを起動するのは無用です。ホットアップグレードは実質的に問題にはなりませんが、それは本当に私たち自身が本質的なビジネスニーズを持っているというわけではありません。

のようにコンテナの設定内でepmdの作業をしようとしましたが、カスタムnet_kernel用にErlangを再構築する必要があります。

Amazonは最近AWS ECSに新しい機能をリリースしました。AWS VPC Networking Modeは、コンテナ間の通信を容易にし、ノードに直接接続する可能性があります。私はそれをまだ検証していない。

さらに、epmdの問題は、展開時間の問題です。 Dockerでイメージを作成すると、イメージが5MBしかないのに、すぐに300MBが必要になります。リリースの作成には、さまざまな依存関係の200MBが必要です。それを減らす方法があるかもしれませんが、それには専門的な知識と献身的な努力が必要です。私はこの余分なスペースをディール・ブレーカーではなく迷惑だと思っていますが、あなたの不変の配置が完了するまでに25分待たなければならないと考えています。

パフォーマンス上の理由から、ベアメタルの展開とドッキングの展開の間には大きな違いはありませんでした。 AWS EB Dockerは、コンテナリソースをEC2インスタンスのリソースにうまく展開します。

もちろん、移植性の利点があります。フロントエンドエンジニアがJSON APIをヒットする必要がある場合は、ローカル開発の点では、Erlang/Elixirについて知ることなく、ローカルで最新のAPIを起動できるように、/Rserve/Postgres。

また、ベンダーロックインが大幅AWSは、あなたが生産を取得する必要があり、開発者であり、非常に少ないDevOpsチームを持っている場合、これは、トレードオフの問題であるKubernetes

のための彼らのサポートを開始しました、特に以来、減少していますおそらくDockerの配備が保証されている可能性があります。インフラストラクチャ、デプロイメントなどに慣れている場合は、開発者として自分自身のAMIを作成することで、環境をより詳細に制御できると信じています。 私は少なくとも、Dockerで遊んでみて、それを試してみることをお勧めします。新しい可能性が開かれるかもしれません。

+2

実際。 Dockerを使用することはErlangランタイムでは冗長であり、何も得られずに複雑になり、配備されたランタイムと通信するプロセスを難読化し、微妙に物を壊すような厄介な方法があります。どの店舗でもこれを行う唯一の理由は、Docker以外の方法で*その他の方法を配備する方法を知らないためです。これは、実際にはあらゆる操作セクションの非常に悲しい告発です - しかし、多くのdevs/devopsグループが今日対処している状況です。 – zxq9

+0

TL/DRでは、生産のためにドッカーでerlangを使用しないでください。しかし、デモ(または開発キット)を配布するのが簡単なのであれば、是非ドッカーを使用してください。 – Jonke

関連する問題