Docker デプロイメントサービスの落とし穴を登る過程の詳細

Docker デプロイメントサービスの落とし穴を登る過程の詳細

初めて書きます。自己紹介させてください...

みなさんこんにちは。私はジャスミンです。なぜジャスミンと呼ばれるのですか?えーっと、IDジャスミンがぐるぐる回ってるんですか? 冗談だよ、へへ。著者は2年目の新人です(あと3日で2年目になります)。なぜなら、会社には私とフロントエンド開発者の2人しかいないからです。そのため、オンライン サービスの展開という仕事が自然に私の肩にかかってきました。実稼働環境でサービスをデプロイするために Docker が使用されるのは今回が初めてです。一つの穴から這い出て、別の穴に落ちる。この起動中に発生したバグを記録するだけです。私の書いた内容に間違いがあれば訂正してください。私を許して! わかった。さっそく。アクション!

このプロジェクトでは、Spring Cloud、Spring Boot、Spring Gateway、MySQL を使用し、RatbitMQ も使用します。サーバーはcentos7です。 ここには大きな大釜が一つ欠けています。実は、私には3か月間一緒に働いているバックエンドの同僚がいます。この男性は、面接に行くための休暇申請を上司が承認しなかったため解雇されましたが、彼は結局面接に行きました。その枠組みを作ったのは彼です。えーっと、だから責任は私に押し付けられたんですね!

彼が使用したズールは私がゲートウェイに置き換えました。 Zuul はサーブレット 2.5 (3.x を使用) に基づいており、ブロッキング API を使用します。 Websocket などの永続的な接続はサポートされません。 Gateway は、Spring Framework 5、Project Reactor、Spring Boot 2 上に構築されており、非ブロッキング API を使用します。 Websocket がサポートされており、Spring と緊密に統合されているため、開発エクスペリエンスが大幅に向上します。

Docker イメージ サービスは、Alibaba Cloud のコンテナ イメージ サービスを使用します。同僚に聞いたところ、Google のコンテナ ツール jib を使用しているとのことでした。そこで、Cmd + Shift + F を押して、jib をグローバルに検索しました。 (すみません、これは中隊の規律なので騎兵の規律です⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄)

クリックしてご覧ください

Alibaba Cloud に入り、コンテナ イメージ サービスを探します (イメージ ウェアハウスがパーティション分割されていることを知らず、権限がないためウェアハウスを見つけられなかったため、ここでは手順を省略しました。その後、恥ずかしげもなく管理者アカウントを要求し、退職した同僚の従業員アカウントを変更しましたが、それでもウェアハウスを見つけることができませんでした)

次に、名前空間 xxx-prod を作成し、このスペースの下に各サービスのウェアハウスとプライベート ウェアハウスを構築しました。コード ソースについては、ローカル リポジトリをミラー リポジトリにプッシュすることを選択しました。他の人についてはあまり知りません。

(後でビルドする必要がなかったことが分かりました。jib 送信すると自動的にリポジトリが作成されます。手動で作成するときに選択しました。) jib を使用して送信した後、リポジトリのバージョン情報で更新を確認できます。

次にサーバーに接続します。ホームフォルダの下にdockerフォルダを作成する

//ルートディレクトリ内//~]# CentOS7でemmmと言う方法は、GitBashとOSシステムでは$、Windowsではcmdです>
//home の下に docker フォルダを作成します~]# mkdir /home/docker
//作成したドッカーに入る
~]# cd /home/docker

次に、Alibaba Cloud にアップロードしたイメージの取得を開始します。実はどのディレクトリでもプルできます(初めてAlibaba Image Serviceをプルしたときは省略しました。操作ガイドを読んでいませんでした。自分のアカウントに権限がないのではないかと疑いましたが、ログインしませんでした。その後dockerログインを維持しましたが、最後にAlibaba Cloudのイメージアドレスを追加する必要があることを知りませんでした:registry.cn-hangzhou.aliyuncs.com)Alibaba Cloudのイメージサービス管理コンソールで、任意のイメージリポジトリ->管理をクリックすると、イメージリポジトリの操作ガイドが表示されます。

イメージを取得したら、次のように入力します。

~]# Docker イメージ

先ほど取得した画像が表示されます。

同僚になぜここに鏡がたくさんあるのか尋ねたところ、彼はこう説明してくれた。

うーん、いいよ!メモリを占有する画像がたくさんあるといつも感じます(詳しい方がいらっしゃいましたらアドバイスを頂ければ幸いです)

ユーレカを始める

~]# docker run -d --name eureka -p 8761:8761 -p 15672:15672 -p 9001:9001 -v /etc/localtime:/etc/localtime registry.cn-hangzhou.aliyuncs.com/xx_xxx_prod/eureka
// -d バックグラウンド実行 -p バインドポート ここで 3 つのポートをバインドします。1 つは登録センター自体のポート、1 つはゲートウェイのポート、もう 1 つは rabbitmq のポートです //-v バージョン情報を出力します

rabbitmq が使用されるため、別の rabbitmq コンテナを作成する必要があります。 または、まずイメージをプルします

// イメージを取得するときは、最後のバージョンではなく管理バージョンを取得する必要があることに注意してください。管理バージョンには管理インターフェイスがあります。
~]# docker pull rabbitmq:management
~]# docker run -d --name rabbit -e RABBITMQ_DEFAULT_USER=xxx -e RABBITMQ_DEFAULT_PASS=xxx --network=container:eureka rabbitmq:management
//Docker コンテナはネットワークによって分離されているため、ネットワークは eureka と同じネットワーク環境に追加され、eureka ガバナンス下のサービスからアクセスできるようになります。
//-e は、コマンド内の xxx であるデフォルトのアカウント パスワードを設定します。これを使用する友人は、自分で調整できます。

独自のサービスを開始しましょう

~]# docker run -d --name xxx -v /home/docker/web-prod/logs:/logs -v /etc/localtime:/etc/localtime --network=container:eureka registry.cn-hangzhou.aliyuncs.com/xx_xxx_prod/xxx 
//-v は、指定したディレクトリにログをマウントします。 同様に、--network は eureka ネットワークに参加しますが、ここでポートをバインドする必要はありません。
//起動後、登録センターのコンソールでサービスの状態を確認できます。 ip + eureka のポート。

このようにサービスが実行されています。その他のサービス手順も同様です。最後に、私がオンライン上で遭遇した小さなエピソードをいくつか付け加えておきたいと思います。 最初は、docker コンテナがネットワークで分離されていることを知らず、--network を使用して eureka ネットワークを設定したことがなかったため、rabbitmq に接続できませんでした。したがって、サービス内の localhost から rabbitmq にアクセスすることはできません。また、サービスでrabbitmq遅延キューを使用する場合は、遅延キュープラグインをインストールする必要があります。 プラグインのインストール手順

ダウンロードするには公式ウェブサイトを開いてください: http://www.rabbitmq.com/community-plugins.html
対応するバージョン「3.7.x」を選択し、「ダウンロード」をクリックします。
~]# docker cp /home/docker/rabbitmq_delayed_message_exchange-20171201-3.7.x.ez rabbit:/plugins
//docker に入る~]# docker exec -it rabbit /bin/bash
//プラグインを開き、rabbitmq-plugins enable rabbitmq_delayed_message_exchange
//インストールされているすべてのプラグインを表示する rabbitmq-plugins リスト

図に示すように、インストールは成功しました。

docker rm がコンテナを削除すると、突然削除できなくなります。 docker ps -a でコンテナのステータスが Dead であることがわかりました。強制削除、マウント状態の確認、フォルダーの手動削除、ポート占有状況の確認など、オンラインで多くの情報を調べました。ほとんどすべてを試しましたが、効果はありませんでした。

最後に、おそらく経験から、何らかの方法で nginx と httpd の両方をオフにしてから削除しました。 なぜ nginx と httpd を同じサーバーにインストールしたのかは聞かないでください。このプロジェクトはもともと彼らが展開した PHP プロジェクトでした。私が引き継いだ後、私は自分で nginx を使用しました。

もう一つ非常に奇妙な問題があります。解決しましたが、なぜそれが起こったのかまだよくわかりません。ユーザーテーブルには last_password_reset_date があります。ユーザーがログインすると、この時間フィールドがチェックされ、トークンは常に無効として報告されます。各フィールドのログを入力すると、このフィールドはデータベース内の時間と 10 時間異なっていることがわかりました。当時は、タイムゾーンの問題だと思いました。ただし、同じテーブル内の別の register_date フィールドの時刻は正常であるため、タイムゾーンは処理されません。長い調査の後、Java が受け入れる時間型が間違っているか、同僚がこのフィールドを処理したのではないかと思いました。まだ修正されていません。その後、オンライン環境にテストライブラリを追加したところ、再び正常になったことがわかりました。最後に、テスト環境データベースのタイムゾーンを確認したところ、GMT+8 でした。オンライン ライブラリはデフォルトの GTM です。最後に、公式データベースの時間を東第 8 地区に変更します。

もう 1 つは Redis です。これは、以前に Redis を使用するパブリック アカウント サービスがあり、その時点では Redis サービスがホスト マシン上に存在していたためです。そこで、サーバーホストに接続しようと思ったのですが、最初は接続できませんでした。その後、redis 構成ファイルを変更し、bind パラメータをイントラネット IP にバインドしました。次に、イントラネット IP を使用してプログラム内の Redis に接続します。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • docker で php+nginx+swoole+mysql+redis 環境を構築する方法
  • Dockerfileの指示と基本構造の説明
  • Dockerコンテナのログ分析
  • Dockerを使用してElasticsearchクラスターを素早くデプロイする方法
  • Docker を使用して MySQL 5.7 および 8.0 マスター スレーブ クラスターをデプロイする方法
  • dockercompose を使用して springboot-mysql-nginx アプリケーションをビルドする
  • Docker を使用して Spring Boot をデプロイする方法の例
  • Docker を使用して Nginx+Flask+Mongo アプリケーションをデプロイする
  • Docker での環境変数の使用とよくある問題の解決策
  • Docker パッケージング ノード プロジェクトのプロセスの説明

<<:  Vue のスロットスコープの詳細な理解(初心者向け)

>>:  MySQL 5.0.96 for Windows x86 32 ビット グリーン簡易版インストール チュートリアル

推薦する

MySQLのロック機構に関する最も包括的な説明

目次序文グローバルロック完全なデータベース論理バックアップFTWRL と set global re...

Docker ビルド PHP 環境チュートリアル詳細説明

Dockerのインストール公式インストールスクリプトを使用して最新バージョンのDockerをインスト...

MySQL で主キーと ROWID を使用する際の落とし穴の概要

序文MySQL の rowid の概念については聞いたことがあるかもしれませんが、テストや実践が難し...

ウェブデザイナーが持つべき資質と能力

Web デザインは、インターネットの出現後に誕生した新興の周辺産業です。 Web ページは店頭のよう...

HTML ウェブページでのアンカー(名前付きアンカー)の使用の概要

以下の情報はインターネットから収集したものです1. アンカーは、Web ページ作成におけるハイパーリ...

MYSQLデータベーステーブル構造の最適化方法の詳細な説明

この記事では、例を使用して、MYSQL データベース テーブル構造を最適化する方法を説明します。ご参...

Docker+K8S+GitLab/SVN+Jenkins+Harbor をベースにした継続的インテグレーション配信環境の構築に関する詳細なチュートリアル

目次環境設定の概要1.K8Sとは何ですか? 2. K8S を使用する理由3. K8S を使用する利点...

MySQL Installer Community 5.7.16 インストール詳細チュートリアル

この記事では、MySQL インストールの詳細なチュートリアルを記録し、全員と共有します。 1. バー...

MySQL マスタースレーブレプリケーションの詳細な分析

序文: MySQL では、マスター/スレーブ アーキテクチャが最も基本的かつ最も一般的に使用されるア...

Dockerイメージのローカル移行の実装

最近 Docker を勉強しているのですが、よく問題に遭遇します。Docker イメージをダウンロー...

Vue エクスポート Excel 機能の全プロセス記録

目次1. フロントエンドのリーディングプロセス: 2. プラグインの使用と初期化2.1 vue-ad...

インデックススキャンを使用したMySQLソート

目次sakilaをインストールするインデックススキャンソートテーブル構造インデックススキャンをソート...

Vue がコンポーネント通信を実装する 8 つの例

目次1. Props 親コンポーネント ---> 子コンポーネント通信2. $emit 子コン...

Unix/Linux システムにおける nobody ユーザーと nologin の詳細な紹介

Unix/Linux システムの nobody ユーザーとは何ですか? 1. Windows システ...