CodeZine(コードジン)

特集ページ一覧

実用的なDockerイメージを使って便利さを体験しよう

最短で使うDocker⼊⾨ 第3回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2021/01/19 11:00

目次

NextCloudを利用する

 セットアップが完了すると、NextCloudを使うことができます。既定では、図に示したように[推奨アプリをインストール]にチェックが付いているので、アプリのプラグインもいくつかインストールされます。

 NextCloudはアプリを追加することで、さまざまな機能を追加できますが、メインとなるのは、OneDriveやGoogleドライブのようなファイル共有です。左上の「フォルダの形のアイコン」をクリックすると、ファイル共有できる画面が表示され、ここにファイルをドラッグし、皆で共有して利用できます。

 ほかにも、「写真」「トーク」「メール」「連絡先」「カレンダー」などの便利機能がありますが、この連載はNextCloudの使い方を紹介するのが主目的ではないので、実際の使い方の解説は省きます。NextCloudの使い方については、公式ドキュメントなどを参照してください。

起動直後に表示されるダッシュボード
起動直後に表示されるダッシュボード
メニュー操作ボタン
メニュー操作ボタン
[ファイル]をクリックしたところ。この画面からファイル共有できる。
[ファイル]をクリックしたところ。この画面からファイル共有できる。

ストレージの永続化を検討する

 もしインストールしたサーバーが、VPSやクラウドの仮想マシンなどグローバルIPアドレスを持つ環境なら、「http://サーバーのIPアドレス:8080」でアクセスすれば、インターネット上でも利用可能です。

 「http://サーバーのIPアドレス/」のように「:8080」を付けずにアクセスできるようにするには、起動時に「-p 8080:80」ではなく、「-p 80:80」を指定します。

 ただし実用的に使うのは、少し待ってください。この状態では、すべてのファイルがコンテナのなかにあります。そのためNextCloud上にファイルをアップロードしたり、連絡先を登録したりしても、それらはコンテナを破棄すれば消えてしまいます。消えないようにするには、こうしたデータが入っているディレクトリを、Dockerホストにマウントする必要があります。

 では、このディレクトリは、どこでしょうか? どこをマウントすればよいのでしょうか。それを調べる手がかりは、2つあります。

1. ドキュメントを読む

 1つは、ドキュメントを読むことです。ドキュメントの「Persistent data」という項目には、「/var/www/html」が永続的なデータを保存する場所だと書かれています。

2. docker inspectコマンドで調べる

 もう1つは、Dockerイメージの情報を参照する方法です。「docker image inspect」というコマンドを使うと、イメージに設定された各種情報を参照できます。

   $ docker image inspect nextcloud

 たくさんの情報がJSON形式で出力されますが、このなかの「Config」という項目に、イメージの設定情報があります。

   …略…
           "Config": {
               "Hostname": "",
               "Domainname": "",
               "User": "",
               "AttachStdin": false,
               "AttachStdout": false,
               "AttachStderr": false,
               "ExposedPorts": {
                   "80/tcp": {}
               },
               "Tty": false,
               "OpenStdin": false,
               "StdinOnce": false,
               "Env": [
                   "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                   "PHPIZE_DEPS=autoconf \t\tdpkg-dev \t\tfile \t\tg++ \t\tgcc \t\tlibc-dev \t\tmake \t\tpkg-config \t\tre2c",
                   "PHP_INI_DIR=/usr/local/etc/php",
                   "APACHE_CONFDIR=/etc/apache2",
                   "APACHE_ENVVARS=/etc/apache2/envvars",
                   "PHP_EXTRA_BUILD_DEPS=apache2-dev",
                   "PHP_EXTRA_CONFIGURE_ARGS=--with-apxs2 --disable-cgi",
                   "PHP_CFLAGS=-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64",
                   "PHP_CPPFLAGS=-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64",
                   "PHP_LDFLAGS=-Wl,-O1 -pie",
                   "GPG_KEYS=42670A7FE4D0441C8E4632349E4FDC074A4EF02D 5A52880781F755608BF815FC910DEB46F53EA312",
                   "PHP_VERSION=7.4.13",
                   "PHP_URL=https://www.php.net/distributions/php-7.4.13.tar.xz",
                   "PHP_ASC_URL=https://www.php.net/distributions/php-7.4.13.tar.xz.asc",
                   "PHP_SHA256=aead303e3abac23106529560547baebbedba0bb2943b91d5aa08fff1f41680f4",
                   "NEXTCLOUD_VERSION=20.0.3"
               ],
               "Cmd": [
                   "apache2-foreground"
               ],
               "Image": "sha256:b911588f1d3321dc22ee87e5533b8884ddbb3b7d24de87c69150548249abbac8",
               "Volumes": {
                   "/var/www/html": {}
               },
               "WorkingDir": "/var/www/html",
               "Entrypoint": [
                   "/entrypoint.sh"
               ],
               "OnBuild": null,
               "Labels": null,
               "StopSignal": "SIGWINCH"
           },
   …略…

 ここで注目したいのは、「Volumes」のところです。ここには、イメージの作成者が「このディレクトリはマウントしたほうがよい」と推奨する場所が記載されています。次のように、ドキュメントに書かれているのと同じく「/var/www/html」が指定されていることがわかります。

               "Volumes": {
                   "/var/www/html": {}
               },

 蛇足ですが、-pで指定すべきポート番号についても、実はExposedPortsの項目で確認できます。

               "ExposedPorts": {
                   "80/tcp": {}
               },

 ただし、VolumesやExposedPortsなどの設定値は、イメージの制作者が提示する値に過ぎず、実際の動きを示しているわけではありません。(公式のイメージではほぼありえませんが)イメージの制作者が設定し忘れたり間違った記載をしていれば、VolumesやExposedPortsに適切ではない値が設定されていることもありえます。

 

 これらの値は、イメージ制作者が作成する「Dockerfile」というファイルに記載された値が、そのまま設定されています。

inspectの結果を見やすく表示する

 inspectの結果は、JSONなので少し見づらいです。実は、「-f」(または「--format」)オプションを指定すると、特定のフォーマットに合致する箇所だけを参照できます。

 フォーマットの書式は、Go言語のtext/templateパッケージの書式でわかりにくいのですが、例えばConfigの下のVolumesだけを参照したいのであれば、次のようにします。

$ docker image inspect --format="{{.Config.Volumes}}" nextcloud
map[/var/www/html:{}]

 同様に、ExposedPortsも次のようにして取得できます。

$ docker image inspect --format="{{.Config.ExposedPorts}}" nextcloud
map[80/tcp:{}]

永続化すべき場所をマウントして起動し直す

 いずれの方法であれ、/var/www/htmlをマウントすべきだということがわかりました。そこで、このディレクトリをマウントして起動し直しましょう。マウントし直すため、一度コンテナを停止しましょう。docker psコマンドで実行中のコンテナを確認します。

$ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED       STATUS       PORTS                  NAMES
70aac52e0162   nextcloud   "/entrypoint.sh apac…"   3 hours ago   Up 3 hours   0.0.0.0:8080->80/tcp   gracious_ishizaka

 上記の例では、コンテナIDが「70aa…...」のようなので、このコンテナIDを指定して停止および破棄します(破棄するので、NextCloud上で設定した管理者ユーザー名や管理者パスワード、アップロードしたファイルや登録した連絡先など、すべての操作は失われます)。

$ docker stop 70aa
$ docker rm 70aa

 そして「-v」オプションを付けて、ボリュームを割り当てて起動します。連載第1回で説明したように、バインドマウントでもボリュームマウントでもよいですが、例えばバインドマウントを使って/home/dataに割り当てる場合は、次のようにして起動します。

$ docker run -d -p 8080:80 -v /home/data:/var/www/html nextcloud

 これでNextCloudのデータ(および設定ファイルなど)は、Dockerホストの/home/dataに保存されるので、NextCloudコンテナを破棄しても失われなくなります。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:最短で使うDocker入門

著者プロフィール

  • 大澤 文孝(オオサワ フミタカ)

    テクニカル・ライター、プログラマ/システムエンジニア。情報セキュリティスペシャリスト、ネットワークスペシャリスト。入門書からプログラミングの専門書まで幅広く執筆。   主な著作として、「Amazon Web Services 基礎からのネットワーク&am...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5