私たちが子供の頃、私たちはあまり理解していませんでしたが、現時点ではそれは明らかです。 「お菓子を食べられないのはなぜですか。食べ物を挟まないのはなぜですか。ハムスターと一緒に寝ることができないのですか。毎日歯磨きをし、2回も歯磨きをするのはなぜですか?!」 本当に、なぜですか? しかし、大人、成熟した人々として、私たちはそのような質問をしません。
ITの世界でも同様の状況が発生します(おそらく、これはあらゆる専門的な活動に当てはまります)。 初期段階では多くのことを理解できません。 「WordPressを持っているなら、なぜ、そして本当に誰があらゆる種類のSymfonyを必要としますか?なぜ自動テストに時間を費やし、すべてがそのように動作するのですか?Git?Linux? 初心者にとって、なぜそんなに必要なのかを理解することは困難です。 意識は時間とともに現れ、すぐにそのようなことは理解できるだけでなく、明白になります。
Dockerに到達した経緯と、これに貢献した理由についてお話したいと思います。
免責事項
この記事は、客観的思考と主観的思考の両方が存在する物語にすぎません。 何か間違っている、または非常に間違っている場合は、教えてください。 健全で適切な批判が大好きで、建設的なコメントを受け入れる準備ができています。
Dockerはかなり単純なものです。 しかし、それが何であるかを単なる人間に説明しようとしたことはありますか? 試した。 うまくいきませんでした。 長い間、私自身はなぜこのことが必要なのか理解していませんでした。 私は彼について聞いて、掘り下げようとしましたが、毎回投げました。 どうやら、まだ早かった-熟していない。 しかし、ある時点で「ユーレカ」が起こりました! 十分長い旅でしたが、他の人に伝えたいと思います。 おそらく、この記事はあなたの道を短くし、この素晴らしいツールをできるだけ早く使い始めるのに役立つでしょう。
ステージ1. FTPまたは同様のもの
ウェブ開発者として働き始めたとき、私は非常に小さなオフィスに行き着きました。 私は経験がありませんでした。私たちはそれを「CMS」と呼んだように、私たち自身で簡単なサイトを開発しました。 OpenSourceという言葉は私には馴染みがなく、すべての機能は手書きで、アーキテクチャはありませんでした。 セキュリティホールはブラックホールのようなものでした。 「Blog」、「The Simplest Online Store」、「News Feed」などのサイトが依然として何らかの形で実現可能である場合、物事は野生の痛みや苦しみを引き起こすのが少し難しくなりました。 FTPを使用して作業を行ったため、2人が同じファイルを操作すると深刻な問題が発生しました。 誰かが何かを壊したか、誤ってそれを拭いた場合、それは永遠に消えました。
そして、ある時、私の良き友人である私たちに、他のすべての仕事を背景にした一つの傑出したプロジェクトで、顧客が来ました。 私たちは働き始めましたが、すぐに事務所が閉まり、私はこのプロジェクトだけで直接働き始めました。 それから私は人間的にすべてをする機会がありました...
ステージ2.ランプ
第二段階では、いくつかの決定が下されましたが、その順序はもう覚えていません。 ほとんどの場合、それらは同時に発生しました。
まず、BitbucketのプライベートGitリポジトリにすべてのコードを保存し始めました。 これはおそらく、開発者が最初に学ぶべきことです。 これにより、サードパーティの干渉によるコードのセキュリティが向上しました。 VPSが壊れる可能性があり、ハッキングされる可能性があり、支払いの時間がありませんでした。 その考えは明確だと思います。 さらに、FTPを閉じて、リリースまたはテストブランチからGit Push Webhookを介して展開しました。
第二に、1つのサイトの代わりに、ほぼ同じ2つのサイトが立ち上げられました。 1つ目は、実際の顧客にサービスを提供したリリースです。 2番目-パスワードで保護されたテストには、最新の不安定な機能がすべて含まれていました。 後者は、検証されておらず、正しく動作しない可能性があるものを本番環境で展開しないために必要です。 これら2つのサイトは同じホストで機能しましたが、独立しています。
第三に、そして最も重要なこととして、開発はローカルで行われ始めました。 LAMPスタックはラップトップにインストールされ、すべてがセットアップされ、プロジェクトは.dev
サブドメインでローカルに起動されました(UPDこのドメインはビジーであるため使用できません。alexkbs 、 コメントありがとうございます)。 これにより、開発が大幅に加速され、オフラインで作業できるようになり、何かを壊す恐れがなくなり、生活が少し楽になりました。
しかし、突然混乱して、Ubuntuを再インストールする必要がありました。 繰り返しになりますが、このスタック全体をインストールして構成する必要があります...このビジネスは、bashスクリプトを使用して自動化できますが、システムへの緊密な結合があります。 私は一人で仕事をさせてください、しかし当局は1秒を雇う計画を持っているので、私は彼と彼自身の生活を単純化したいです。 いくつかのそのような浅瀬の後、私はまだ解決策を見つけました。
ステージ3. Vagrant
Vagrant-簡単に言えば、これはスクリプトでVirtualBoxをカスタマイズできるようにするツールです。 つまり、正しい設定を書いたら、1つのvagrant up
コマンドで、完成したDebianイメージをダウンロードし、そこに必要なソフトウェアをインストールし、設定して、完成したテスト環境を取得できます。
それは奇跡ではありませんか? 実際には奇跡です! これにより、開発環境の展開プロセスが大幅に簡素化され、メインシステムから不要なパッケージが削除され、仮想化のおかげで、ホスト設定に可能な限り近いマシンを構成できました。
仮想化は開発に最適です。 しかし、生産では、それは良くありません。 これは、システムにとってはfi烈な問題です。 さらに、この方法ではいくつかの問題を解決できません。
- ホスティングと仮想マシンの環境は似ていますが、同じではありません。 そのため、「すべてが私のために働く」というジャンルのバグがまだ表面化しています
- ホストと仮想マシンの環境を最新に保つ必要がありました。 サーバーで何かが変更された場合、仮想マシンで変更する必要がありました
- VPSでホストを変更したり、システムを再インストールしたりするのはまだ苦痛です。 ホスティングは引き続き手動で構成する必要がありました。
- 一部のパッケージの更新はそれほど簡単ではありません。 PHPをバージョン5.6から7.xに更新してみてください。 可能です。 しかし、依存関係を台無しにしたり、apache2を壊したりする可能性はまだあります。 特に、システム管理者ではなく、少しのLinuxを愛し、知っているWeb開発者である場合。
- MySQLとPHPのバージョンが異なる2つのプロジェクトをホストしている同じホストで実行してみてください。 何らかの理由で、これが可能だとは思わない。 これは、新しいバージョンのPHPでサイトがどのように機能するかをテストする必要がある場合に役立ちますが、古いバージョンでは本番環境を残します。 この設定で何かを壊す可能性は非常に高いです。
また、数ギガバイトのRAMが不要になることはありません。
ステージ4. Docker!
さて、上記のすべてのステップからすべての問題を取り上げて、それらを簡単かつエレガントに解決するツールがあると想像してください。
Dockerとは何ですか? インターネットでは、商品の輸送に使用されるコンテナと多くの比較があります。 これは本当です。
しかし、大きなホールと何かに取り組んでいる多くの人々を想像してください。 彼らが同じことをする必要はありません。 会計士、弁護士、大工、画家、アナリスト、プログラマー。 はい、彼らは時々相互作用します。 しかし、彼らは個人的なワークスペースを持っていないという事実のために、そのような仕事は混乱のようです。 文書の問題、誰かが誰かからペンを引いた、誰かが見知らぬ人の椅子に座った、コンピューターに触れたなど。 しかし、パーティション、各個人または個人のグループを配置して個人の職場を割り当てると、生活が楽になります。 誰もが自分のことをし、リソースを使い、誰も気にしません。 相互作用は、専用チャネル(メール、アーカイブ、ドア)を介して行われます。
また、Docker。 大きなホールはシステムです(実際には、すべてが少し複雑ですが、概念を一般的に理解するために単純化できます)。 Dockerは、作業を行うプロセスまたはプロセスのグループ用に隔離されたスペースを作成できます。 相互作用は、開いているポート、共有ファイル、内部および外部ネットワークを介して発生します。 誰も気にしません。 したがって、1つのホスト上で少なくとも20のバージョンのPHPなどを使用できます。 画像のおかげで、比fig的に言えば、すべてのグッズを備えた既製のオフィスを注文できます。
新しいコンポーネントをプロジェクトに接続することは、docker-composeのおかげで数行の問題になりました。 以下に例を示します。
# PHPMyAdmin pma: image: phpmyadmin/phpmyadmin:4.7 restart: always environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} depends_on: - db ports: - "181:80"
# MySQL db: image: mysql:5.7.20 restart: always environment: MYSQL_DATABASE: ${DB_NAME} MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} volumes: - db-data:/var/lib/mysql
MySQLバージョンをアップグレードする必要がありますか? 通常のVPSホスティングでこれを行うには、どれくらいの時間と労力が必要ですか? ここでは、3〜4文字の質問です。
Dockerは動作中のシステム内で動作し、新しいシステムを作成しないため、開発マシンに大きな負荷をかけることはなく、販売に非常に適しています。 そして、これは大きなプラスです。Ubuntuを使用する開発者のマシンで実行されるコードは、Debianを使用するサーバーとまったく同じように機能するからです。
このソリューションの別の利点-自動テストがはるかに簡単になりました。 検証は、各起動の前に作成される隔離されたコンテナ内で行われます。 したがって、テストは安定しており、常に実行されるかどうかに関係ありません。
おわりに
Dockerは単純ですが、理解するのは簡単ではありません。 これを行うには、成長する必要があります。 信頼できるガイダンスがなかったので、自分ですべてを理解する必要がありました。 この記事のおかげで、私のような人が少し早く成長できるかもしれません。
一つの考えに注意したい。 Dockerの実装は、時には冗長になる場合があります。 個人のブログ、1ページのページ、またはその他の単純なプロジェクトがある場合、サーバーをセットアップすると時間とリソースが消費されますが、使い果たしてもマイナスにもなりません。 しかし、これが大規模で長期的なプロジェクトである場合、Dockerの前にそれが正しい決定である可能性が高いでしょう。 自動テストのようなものです。 小規模なプロジェクトでは必要ありませんが、大規模なプロジェクトでは必要です。
それでも、悪い人には教えたくありません。 間違った情報を提供した場合は、修正してください。 間違いを犯した場合は、修正してください。