「SE業務」カテゴリーアーカイブ

NextcloudをDockerで構築する方法

個人でDropboxなどのオンラインストレージを利用していますが、容量が限られていたり、容量を増やそうとすると月額料金が掛かってしまいます。自前でサーバを構築しようとしたときに、Dropboxとほぼ同じように使えてかつ無料なソフトがいくつかあります。今回は、名前的にイケてそうなNextcloudをDockerで構築してみました。

インストール手順

①Nextcloud公式サイト(https://nextcloud.com/)にアクセスする。
「Get Nextcloud」>「Server packages」を選択する。

②「Appliances」>「Get Docker image」を選択する。
ちなみにここにで、Docker以外のインストーラーを取得できる。

③Docker HubのNextcloudのページに飛ぶので、「Using the apache image」の欄に書かれたコマンドを控える

docker run -d -p 8080:80 nextcloud

④Dockerを起動して、③のコマンドを実行する。
最初の実行時にイメージがダウンロードされます。

⑤「dcoker ps -a」コマンドでNextcloudのコンテナが起動していることを確認する。

⑥「http://<docker仮想マシンのIPアドレス>:8080/」にアクセスする。
(IPアドレスですが、ちなみに以下の例だと、「192.168.99.100」)

⑦管理者アカウントを作成します。IP/パスワードを入力して、「セットアップを完了します」を押下する。データベースの構築などが始まります。

⑧完了すると、管理者アカウントでログインされた状態となる。

あとは、使い方はDropBoxと同じような感じです。

今回は、Dockerで構築しましたが、会社で運用しようと思ったら、WEBサーバやDBサーバを別のサーバやコンテナで構築しなきゃです。


Docker Toolboxのインストール方法(プロキシ対応あり)

WindowsのPCでDockerを使うには、2つのツールが用意されています。
・Docker for Windows
・Docker Toolbox

ただし、Docker for Windowsを利用するには、以下の3つの要件をクリアしている必要があります。
①Windows 10 Pro または Enterprise(64bit)のPC
②VirtualBoxなどの仮想化ソフトをインストールしていない
③Hyper-Vを有効にしている

つまり、本来Linuxカーネルの技術を利用している都合上、Hyper-Vを利用する必要があるみたい。現に、Docker ToolboxをインストールするとVirtualBoxも一緒にインストールされて、そのVIrtualBoxで稼働するLinux上でDockerを動かす仕組みみたい。

前置きが長くなりましたが、私のPCは要件を満たしていないので、Docker Toolboxをインストールしました。手順は↓

Docker Toolboxインストールの流れ

こちらにアクセスして、インストーラーをダウンロードします。https://docs.docker.com/toolbox/overview/

あとはインストーラーを起動して、以下の流れで完了。

【プロキシ環境で使う場合は・・・・】
「C:\Program Files\Docker Toolbox\start.sh」に以下を追記します。
これにより、Docker Toolboxがプロキシ経由で動作します。

HTTP_PROXY=http://proxy-host:port/
HTTPS_PROXY=http://proxy-host:port/
NO_PROXY=127.0.0.1

あとは、デスクトップ上に作成されたDocker Quickstart Terminal のショートカットからターミナルを起動するだけ。

あとは「docker version」と打って、結果が返ってくればOK。


Java スレッド処理でsynchronizedを利用する場合の注意(マルチスレッド)

Javaで同期処理を実装する場合、メソッドにsynchronized修飾子をつけて、複数スレッドからの呼び出しを抑止することができます。つまり、2つのスレッドが同時にメソッドを呼び出した場合、先に呼び出したスレッドの処理が優先され、後から呼び出したスレッドは先行するスレッドが終了するまで待たされることになります。

しかし、これには少し注意しなきゃいけないことがあります。それは、「synchronizedメソッドは、そのメソッドが属するインスタンスが複数ある(マルチスレッド)場合は機能しないということです。」

では、マルチスレッドで同期処理を実装するには、どうしたらいいのかというと、下記のようにグローバルに参照可能なロック用オブジェクトを作成して、排他制御をする実装方法があります。

このような実装であれば、Globalクラスのlockというクラス変数のロックがとれない限り、そのスレッドの処理は待たされることになり、複数スレッドによる同期処理を実装することができます。

単に、「なんでもsynchronizedを付ければいいんでしょ?」で実装していた自分が恥ずかしい。。。
(´;д;`)