docker compose を使用して fastDFS ファイル サーバーを構築する方法

docker compose を使用して fastDFS ファイル サーバーを構築する方法

前回の記事では、docker compose を使用して FastDfs ファイル サーバーをインストールする詳細な例を紹介しました。

今日は、docker compose を使って fastDFS ファイルサーバーを構築する方法を紹介します。詳細は以下の通りです。

プラットフォーム: Mac M1

注: IPアドレスについて

docker ネットワーク モードに関しては、上記の記事で docker Host 模式について言及されています。

コンテナを起動するときにホスト モードを使用すると、コンテナは独立したネットワーク名前空間を取得せず、ホストとネットワーク名前空間を共有します。コンテナは独自のネットワーク カードを仮想化したり、独自の IP を構成したりはせず、ホストの IP とポートを使用します。ただし、ファイル システムやプロセス リストなど、コンテナーの他の側面は、ホスト マシンから分離されたままです。

問題は、ホスト マシンの IP とポートを使用し、構成ファイルで IP としてlocalhost入力すると、コンテナーにアクセスできるはずですが、実際にはアクセスできないことです。 IP Addressの入力方法に関する私の個人的な理解は次のとおりです (誤解がある場合は訂正してください)。

tracker起動時のコンソール出力:

192.168.64.2のネットワークは次のとおりです。

192.168.65.4のネットワークは次のとおりです。

ファイルディレクトリ

├── docker-compose.yaml
├── nginx
│ └── nginx.conf
├── ストレージ
│ └── データ
└── トラッカー
│ └── 会議
│ └── クライアント.conf
└── ストアパス

./docker-compose.yaml

バージョン: "2"
サービス:
	fastdfsトラッカー:
		ホスト名: fastdfs-tracker
		コンテナ名: fastdfs-tracker
		画像: season/fastdfs:1.2
		ネットワークモード: "ホスト"
		コマンド: トラッカー
		ボリューム:
		  - ./トラッカー/データ:/fastdfs/トラッカー/データ
		  - ./tracker/conf:/etc/fdfs
	fastdfs ストレージ:
		ホスト名: fastdfs-storage
		コンテナ名: fastdfs-storage
		画像: season/fastdfs:1.2
		ネットワークモード: "ホスト"
		ボリューム:
		  - ./ストレージ/データ:/fastdfs/ストレージ/データ
		  - ./ストアパス:/fastdfs/ストアパス
		環境:
		  - トラッカーサーバー=192.168.64.2:22122
		コマンド: ストレージ
		依存:
		  - fastdfsトラッカー
	fastdfs-nginx:
		ホスト名: fastdfs-nginx
		コンテナ名: fastdfs-nginx
		画像: season/fastdfs:1.2
		ネットワークモード: "ホスト"
		ボリューム:
		  - ./nginx/nginx.conf:/etc/nginx/conf/nginx.conf
		  - ./ストアパス:/fastdfs/ストアパス
		環境:
		  - トラッカーサーバー=192.168.64.2:22122
		コマンド: nginx

./tracker/conf/クライアント.conf

# 接続タイムアウト(秒)
# デフォルト値は30秒​​です
接続タイムアウト=30
# ネットワークタイムアウト(秒)
# デフォルト値は30秒​​です
ネットワークタイムアウト=60

# ログファイルを保存する基本パス
ベースパス=/fastdfs/クライアント

# tracker_serverは複数回出現する可能性があり、tracker_serverの形式は
# "host:port"、host はホスト名または IP アドレスです
# ここで IP を変更する必要があります
トラッカーサーバー=192.168.64.2:22122

#syslog と同じ標準ログ レベル、大文字と小文字を区別しない、値のリスト:
### 緊急の場合は emerg
### 警告
### クリティカルの場合はcrit
### エラー
### 警告に対する警告
### 知らせ
### 情報
### デバッグ
ログレベル=情報

# 接続プールを使用する場合
# デフォルト値はfalseです
# V4.05以降
use_connection_pool = false

# アイドル時間がこの時間を超える接続は閉じられます
# 単位: 秒
# デフォルト値は3600です
# V4.05以降
接続プールの最大アイドル時間 = 3600

# トラッカーサーバーからFastDFSパラメータをロードする場合
# V4.05以降
# デフォルト値はfalseです
load_fdfs_parameters_from_tracker=false

# IPアドレスの代わりにストレージIDを使用する場合
# tracker.confと同じ
# load_fdfs_parameters_from_tracker が false の場合にのみ有効
# デフォルト値はfalseです
# V4.05以降
use_storage_id = 偽

# ストレージIDファイル名を指定します。相対パスまたは絶対パスを使用できます。
# tracker.confと同じ
# load_fdfs_parameters_from_tracker が false の場合にのみ有効
# V4.05以降
ストレージIDファイル名 = ストレージID.conf

#HTTP設定
http.tracker_server_port=80

#HTTPのその他の設定を含めるには「#include」ディレクティブを使用します
##http.conf を含める

./nginx/nginx.conf

#ユーザーnobody;
ワーカープロセス 1;

#error_log ログ/error.log;
#error_log ログ/error.log 通知;
#error_log ログ/error.log 情報;

#pid ログ/nginx.pid;

イベント {
	ワーカー接続 1024;
}

http {
	mime.types を含めます。
	デフォルトタイプ アプリケーション/オクテットストリーム;

	#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
	# '$status $body_bytes_sent "$http_referer" '
	# '"$http_user_agent" "$http_x_forwarded_for"';

	#access_log ログ/access.log メイン;

	ファイル送信オン;
	#tcp_nopush オン;

	#キープアライブタイムアウト 0;
	キープアライブタイムアウト65;

	#gzip オン;

	サーバー{
		聞く 9800;
		server_name ローカルホスト;

		#文字セット koi8-r;

		#access_log ログ/host.access.log メイン;

		# パーツの位置を変更する / {
			ルート /fastdfs/store_path/data;
			ngx_fastdfs_モジュール;
		}

		#エラーページ 404 /404.html;

		# サーバーのエラーページを静的ページ /50x.html にリダイレクトします
		#
		エラーページ 500 502 503 504 /50x.html;
		場所 = /50x.html {
			ルートhtml;
		}
	}
}

SpringBootはfastDFSを統合する

依存関係の追加

<依存関係>
	<groupId>com.github.tobato</groupId>
	<artifactId>fastdfs クライアント</artifactId>
	<バージョン>1.27.2</バージョン>
</依存関係>

アプリケーション.yaml

# 分散ファイルシステム構成 fdfs:
  #自分の IP に合わせて IP を変更します: 192.168.64.2
  #ソケット接続タイムアウト soTimeout: 1500
  接続タイムアウト: 600
  #複数のトラッカーリストをサポート:
    - ${fdfs.ip}:22122
  # fastDFS の nginx の IP とポート
  # IDEAはhttpsを使用するよう促します。 
  # nginx の SSL 設定は次の場所に移動してください:
  ウェブサーバーのURL: http://${fdfs.ip}:9800/

FastDFSConfig.java

@構成
// FastDFS-Client コンポーネントをインポートします @Import(FdfsClientConfig.class)
// 繰り返しの JMX Bean 登録の問題を解決します @EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
パブリックアスペクトFastDFSConfig {
}

FastDFSUtil.java

@成分
パブリッククラスFastDFSUtil {
    @リソース
    プライベート FastFileStorageClient fastFileStorageClient;
    @リソース
    プライベート FdfsWebServer fdfsWebServer;

    パブリック String uploadFile(MultipartFile ファイル) は IOException をスローします {
        StorePath storePath = fastFileStorageClient.uploadFile(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null);
        文字列 fullPath = storePath.getFullPath();
        フルパスを取得します。
        fullPath を返します。
    }

    パブリック文字列 uploadFile(ファイル ファイル) {
        試す {
            FileInputStream 入力ストリーム = 新しい FileInputStream(ファイル);
            StorePath storePath = fastFileStorageClient.uploadFile(inputStream、file.length()、FilenameUtils.getExtension(file.getName())、null);
            storePath.getFullPath() を返します。
        } キャッチ (例外 e) {
            e.printStackTrace();
            null を返します。
        }
    }

    パブリック byte[] downloadFile(String filePath) {
        StorePath storePath = StorePath.parseFromUrl(filePath);
        fastFileStorageClient.downloadFile(storePath.getGroup(), storePath.getPath(), 新しい DownloadByteArray()) を返します。
    }

    パブリックブール値deleteFile(文字列filePath) {
        StringUtils.isEmpty(filePath) の場合 {
            false を返します。
        }
        試す {
            StorePath storePath = StorePath.parseFromUrl(filePath);
            fastFileStorageClient.deleteFile(storePath.getGroup(), storePath.getPath());
        } キャッチ (例外 e) {
            e.printStackTrace();
            false を返します。
        }
        true を返します。
    }

    /**
     * パッケージファイルの完全な URL アドレス*
     * @param パス
     * @戻る
     */
    パブリック文字列 getResAccessUrl(文字列パス) {
        fdfsWebServer.getWebServerUrl() + パスを返します。
    }
}

FastDFSController.java

@レストコントローラ
@RequestMapping("/fast-dfs")
パブリッククラスFastDFSController{
    /**
     * @param ファイル
     * @戻る
     * @throwsIOException 例外をスローします
     */
    @PostMapping("")
    @トランザクション
    public void uploadFile(MultipartFile file, String cuisineId) は IOException をスローします {
        文字列 s = fastDfsUtil.uploadFile(ファイル);
        文字列 resAccessUrl = fastDfsUtil.getResAccessUrl(s);
    }

    /**
     * @param レスポンス
     * @throwsIOException 例外をスローします
     */
    @GetMapping("")
    パブリック void downloadFile(String filePath, HttpServletResponse response) は IOException をスローします {
        byte[] バイト = fastDfsUtil.downloadFile(filePath);

        文字列[] split = filePath.split("/");
        文字列 fileName = split[split.length - 1];
        // 強制ダウンロードを開かないように設定 response.setContentType("application/force-download");

        ファイル名 = URLEncoder.encode(ファイル名、StandardCharsets.UTF_8);
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        IOUtils.write(バイト、response.getOutputStream());
    }

    /**
     * ストリーミングモードでビデオを再生します。最初から最後までしか視聴できません。すでに視聴したコンテンツを手動でクリックして視聴することはできません。* @param filePath
     * @param レスポンス
     * @throwsIOException 例外をスローします
     */
    @GetMapping("/play")
    パブリック void streamMedia(String filePath, HttpServletResponse レスポンス) は IOException をスローします {
        byte[] バイト = fastDfsUtil.downloadFile(filePath);
        IOUtils.copy(新しい ByteArrayInputStream(bytes)、response.getOutputStream());
        レスポンスをフラッシュバッファ();
    }
}

docker compose を使用して fastDFS ファイル サーバーを構築する方法についての記事はこれで終わりです。docker compose を使用して fastDFS を構築する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • docker compose を使用して FastDfs ファイル サーバーをインストールする詳細な例
  • Docker に fastdfs イメージをインストールする際の注意事項
  • Docker で FastDFS ファイル システムを構築する (マルチイメージ チュートリアル)
  • DockerにFastDFSをインストールする方法
  • Docker で FastDFS をデプロイする方法

<<:  MySQL5.7 シングルインスタンス自動起動サービスの設定プロセス

>>:  フォームの「Enter」、「Submit」、「Enter != Submit」を削除する方法

推薦する

MySQL ページングの制限パラメータの簡単な例

Mysqlページングの2つのパラメータ ユーザー制限 1,2 から * を選択 1 は検索する最初の...

WeChatアプレットはユーザーログインモジュールサーバーの構築を実装します

サーバーの構築には node.js を選択しました。まだインストールしていない方は、私の他の nod...

MYSQL は、指定されたユーザーのランキングとクエリを実装します。ランキング関数 (並列ランキング関数) のサンプルコード

序文この記事は主に、MYSQL でランキングを実現し、指定ユーザーランキング関数 (並列ランキング関...

Vueのドラッグスクリーンショット機能を実装する簡単な方法

マウスをドラッグしてページのスクリーンショットを撮ります(指定した領域にスクリーンショットをドラッグ...

MySQL を解凍してインストールおよび完全に削除する方法の詳細なグラフィック説明

1. MySQLをインストールする(1)ダウンロードしたMySQLの圧縮ファイルをMySQLをインス...

MySQL無料インストール版を解凍した後にパスワードが見つからない問題を解決する方法

1. mysql-8.0.21-winx64を解凍する2. 環境変数を設定し、アドレスをbinフォル...

ウェブ上の模倣と盗作に関する議論

2005年に業界に入ってから数か月後、労働者の日休みの期間中、1か月以上毎日12時まで残業をしました...

Linux で yum と入力した後に -bash: /usr/bin/yum: No such file or directory という問題を解決する方法

Linuxでyumを入力すると、プロンプトが表示されます: -bash: /usr/bin/yum:...

MySQL のスロークエリの方法と例

1. はじめにスロークエリログを有効にすると、MySQL は指定された時間を超えるクエリステートメン...

非ルートユーザーを使用してDockerコンテナでスクリプト操作を実行する

アプリケーションをコンテナ化した後、Docker コンテナを起動すると、デフォルトで root ユー...

この記事ではJavaScriptの基本であるディープコピーとシャローコピーについて説明します。

目次浅いコピーディープコピー補充する要約するコピー(クローン、複製などとも呼ばれる)ですが、ディープ...

セマンティックウェブページ XHTML セマンティックマークアップ

構造とプレゼンテーションを分離するもう 1 つの重要な側面は、セマンティック マークアップを使用して...

CSSリンクと@importの違いの詳細な説明

HTML に CSS を追加するにはどうすればいいですか? HTML で CSS を設定する方法は ...

CSS はこのように使用できますか?気まぐれなグラデーションの芸術

前回の記事「1行のCSSコードの魅力」では、たった1行のCSSコードで生成できる美しい(奇妙な感じと...

MySQL MGR の利点は何ですか?

MGR (MySQL グループ レプリケーション) は、バージョン 5.7 で追加された新しい機能...