Docker Compose のサイドカーモードの詳細な説明

Docker Compose のサイドカーモードの詳細な説明

Docker Composeとは

マイクロサービスが普及している今日の世界では、Compose は通常、コンテナの統合された起動とシャットダウンのためのオーケストレーション ツールとして定義されます。

しかし、まだ疑問が残っています。Compose を使用して単一のサーバーに複数のサービスをデプロイするのは誰でしょうか?たった一つのサービスだけをご利用ください!次の要件に遭遇するまで、サーバー上で複数のサービスを使用する必要がある場合、Compose はサイドカー モードを使用して、サービスが 127.0.0.1 を介して別のサービスを簡単に呼び出すことができることに気付きました。

要件に不適切な言語が使用されている

Golangで開発されたプロジェクトは、学生情報に基づいて学生のステータスを印刷することを望んでいます。学生ステータステーブルの一部は次のとおりです。

Go には単語を操作するためのライブラリがないわけではありませんが、それでもこのような複雑な単語を操作して情報を埋め込むのは非常に困難です。そこで私たちは解決策を思いつきました。

実装

1. Excelで同じテンプレートを定義する

2. GolangはExcelの指定されたセルに値を入力します。これはWordに値を入力するよりもはるかに簡単です。コードの一部

xlsx.SetCellValue("Sheet1", "C3", 学生.専攻.名前)
xlsx.SetCellValue("Sheet1", "F3", student.ClassInfo.Name)
xlsx.SetCellValue("Sheet1", "J3", student.SchoolSystem)
 
xlsx.SetCellValue("Sheet1", "B4", 学生.名前)
xlsx.SetCellValue("Sheet1", "D4", 学生.BeforName)
xlsx.SetCellValue("Sheet1", "F4", 学生.性別)
xlsx.SetCellValue("Sheet1", "H4", student.Nation)
 
xlsx.SetCellValue("Sheet1", "B5", 学生.IdCardNo)
xlsx.SetCellValue("Sheet1", "F5", student.HomePlace)
 
xlsx.SetCellValue("Sheet1", "B6", student.Birthday.Format("20060102"))
xlsx.SetCellValue("Sheet1", "D6", student.EntranceTime.Format("20060102"))
xlsx.SetCellValue("Sheet1", "F6", student.JoinTeamTime)
 
xlsx.SetCellValue("Sheet1", "B7", student.FamilyAddress)
xlsx.SetCellValue("Sheet1", "F7", student.HealthStatus)

3. 最も重要なステップは、ExcelをPDFに変換し、それをフロントエンドに返して表示または印刷することです。

githubでExcelをPDFに変換するためのGolangライブラリが見つからなかったので(何かおすすめがあればメッセージを残してください)、.netのFreeSpire.Xlsライブラリを考えました。これはExcelをPDFに変換する機能を簡単に実現できます。そこで、生成され記入されたExcelをPDFに変換するための.net APIが必要なので、.net WebAPIを作成し、プロジェクト名をpdfprocessorとして定義し、コントローラーを定義しました。

[ルート("[コントローラー]")]
    パブリッククラス PDFController:ControllerBase
    {
        プライベート読み取り専用 ILogger<PDFController> _logger;
        パブリック PDFController(ILogger<PDFController> ロガー)
        {
            _logger = ロガー;
        }

        [HttpPost]
        パブリック非同期タスク<IActionResult> HttpPostAsync()
        {
            試す
            {
                ストリーム stream = Request.Body;
                byte[] バッファ = 新しい byte[Request.ContentLength.Value];
                ストリームの位置 = 0L;
                stream.ReadAsync(バッファ、0、バッファの長さ);
                ワークブック wb = new Workbook();
                ストリームからロードします。
                ワークシート ws = wb.Worksheets[0];
                var streamReturn = 新しい MemoryStream();

                ws.SaveToPdfStream(ストリーム戻り値);
                File(streamReturn, "application/octet-stream") を返します。
            }
            catch (例外例)
            {
                _logger.LogError("", 例);
                BadRequest(ex.Message) を返します。
            }
        }
    }

4. Goプロジェクトと.NETプロジェクトをデプロイし、Go言語が.NET APIを呼び出してExcelをPDFに変換できるようにします。

小規模な単一プロジェクトなので、デプロイと呼び出しをいかにシンプルにするかを考える必要があります。このとき、Docker Compose を思いつきました。

docker-compose を通じて、Go API と .net API を同時に起動できます。最も重要なことは、Go プロジェクトと .net プロジェクトが同じネットワークを使用できるため、Go API は 127.0.0.1:port を介して .net API を呼び出すことができることです。トポロジーは次のとおりです。

5. Go APIは127.0.0.1を介して.NET APIを呼び出すため、.NET APIはGo APIのサイドカーとなり、それを提供する。

応答、エラー:= http.Post("http://127.0.0.1:6081/PDF", "multipart/form-data;boundary="+multipart.NewWriter(bytes.NewBufferString("")).Boundary(), bytes.NewReader(byteA))
err != nil の場合 {
    c.Bad(err.Error())
    戻る
}
応答を延期する。Body.Close()
レスポンスのステータスコードが200の場合{
    データ、_ := ioutil.ReadAll(response.Body)
    c.Bad(文字列(データ))
    戻る
}
 
pdfFilePth := fmt.Sprintf("./templates/tmp/%s.pdf", uuid.New())
f, エラー:= os.Create(pdfFilePth)
err != nil の場合 {
    c.Bad(err.Error())
    戻る
}
io.Copy(f, レスポンス本文)
c.Ctx.Output.Download(pdfFilePth, "data.xlsx")

6. docker-compose デプロイメント

Go 用の Dockerfile の作成

ライブラリ/golangから
 
ワークディレクトリ /app
go env -w GO111MODULE=onを実行します
go env -w GOPROXY=https://goproxy.cn,direct を実行します。
api/ /app を追加する
cd /app を実行
実行 go mod tidy
go build main.go を実行します。
エントリポイント ["/app/main"]
エクスポーズ6080

.net Dockerfile の作成

# Visual Studio がこの Dockerfile を使用してイメージを構築し、デバッグを高速化する方法を理解するには、https://aka.ms/containerfastmode を参照してください。

mcr.microsoft.com/dotnet/aspnet:6.0 AS ベースから
apt-get updateを実行する
apt-get install -y --no-install-recommends libgdiplus libc6-dev を実行します。 
apt-get install -y fontconfig xfonts-utilsを実行します。
/pdfprocessor/fonts/ /usr/share/fonts/ をコピーします
mkfontscaleを実行する
mkfontdirを実行する
fc-cache -fv を実行します。

ワークディレクトリ /app
エクスポーズ6081

mcr.microsoft.com/dotnet/sdk:6.0 ASビルドから
ワークディレクトリ /src
コピー ["pdfprocessor/pdfprocessor.csproj", "pdfprocessor/"]
dotnet restore "pdfprocessor/pdfprocessor.csproj" を実行します。
コピー 。 。
ワークディレクトリ "/src/pdfprocessor"
dotnet build "pdfprocessor.csproj" -c Release -o /app/build を実行します。

ビルドからパブリッシュへ
dotnet publish "pdfprocessor.csproj" -c Release -o /app/publish を実行します。

ベースから最終へ
ワークディレクトリ /app
--from=publish /app/publish にコピーします。
エントリポイント ["dotnet", "pdfprocessor.dll"]

docker-compose.yaml を記述して、goapi と .net api が同じネットワークを使用できるようにします。

バージョン: '3.4'

サービス:
  pdfプロセッサ:
    画像: pdfprocessor
    建てる:
      コンテクスト: 。
      dockerfile: pdfprocessor/Dockerfile
    依存:
      - 教育管理者
    ネットワークモード: "サービス:eduadmin"
  教育管理者:
    画像: eduadmin
    建てる:
      コンテクスト: 。
      dockerfile: api/Dockerfile
    ポート:
      - 「6080:6080」
      - 「6088:6088」

7. docker-compose up -dでサービスを開始し、PDFの表示効果を確認します。

最後に、docker-compose は本当に素晴らしいと言いたいです。

Docker Compose の Sidecar モードに関する記事はこれで終わりです。Docker Compose の Sidecar モードについてさらに詳しく知りたい方は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker-compose におけるdepends_on 順序問題を解決する方法についての簡単な説明
  • docker-compose で Jenkins をインストールする際の実践的なメモ
  • docker compose helloworld を使い始めるための詳細なプロセス
  • Docker Compose のインストールと使用手順

<<:  MySQLのlike演算子の詳細

>>:  CSS変換ページめくりアニメーションレコードの実装

推薦する

MySQL空間関数を使用してロケーションパンチインを実装するための完全な手順

序文プロジェクトの要件は、ユーザーの現在の位置が特定の地理的位置範囲内にあるかどうかを判断することで...

Nginx ドメイン名 SSL 証明書の構成 (Web サイトの http を https にアップグレード)

序文HTTP と HTTPS日常生活でよく使われる URL は、おおまかに次の 2 種類に分けられま...

OracleデータをMySQLデータベースに抽出する実装プロセス

Oracle データベースから MySQL データベースへの移行では、Oracle データベース モ...

Linux で同じ内容のファイルを識別する方法の詳細な説明

序文ファイルのコピーによってハードドライブのスペースが大量に浪費され、ファイルを更新するときに混乱が...

JavaScript ウェブページ入門開発詳細説明

パート3: ❤バックエンドデータ受信を見落とす3つの方法❤ (おすすめ集)パート 2: Web フォ...

CentOS 7へのJenkinsのインストール手順の詳細な説明

Yum経由でJenkinsをインストールする1. インストール # yum ソースをインポート wg...

HTML で水平ナビゲーション構造を設定する方法

この記事では、主にリスト構造を使用して水平ナビゲーション構造を設定する 2 つの方法を紹介します。こ...

JavaScript 状態コンテナ Redux の詳細な説明

目次1. Reduxを選ぶ理由2. Reduxデータフロー3つの原則4. Reduxソースコード分析...

ウェブページのフラッシュアニメーションが表示されない問題の解決策

<br />解決手順は次のとおりです。スタート -> 実行 -> reged...

Dockerコンテナ起動時に固定IPを設定する実装

Dockerインストール後のネットワークタイプ [root@insure updev]# docke...

Linux と Windows でスケジュールされたタスクを設定する方法

目次リナックス1. crontabの基本的な使い方2. ログを有効にする3. スケジュールされたタス...

Vueは、商品の数を制御するためのコンポーネントのパッケージ化と使用を実装します。

Vueのコントロール商品数量コンポーネントのカプセル化と使用は参考までに。具体的な内容は以下のとお...

HTML におけるベースタグの使用に関する詳細な説明

requireJS には、baseURL というプロパティがあります。baseURL を設定すること...

MySQLにおける区切り文字の定義と機能の詳細な説明

MySQL を初めて学ぶときは、区切り文字の本当の目的を理解していないかもしれません。区切り文字は、...

MySQL関数の包括的な概要

目次1. MySQLでよく使われる文字列関数2. 数値関数3. 日付と時刻の機能4. プロセス機能5...