DanLevy.net

Docker サーバー設定

単一コマンドでデータベースサーバーを起動

Hero image for Docker サーバー設定

Docker Server Setup

歴史的注記: これは 2015 年のローカル開発向けリファレンスです。古いワークフローを理解するには役立ちますが、これらのスニペットを現在の本番環境のアドバイスとして扱わないでください。現在は、Docker Compose ファイル、カスタムネットワーク、イメージバージョンの固定、認証、シークレット、そして更新自動化のレビューが安全なデフォルトとなっています。

Who’s this guide for?

そんな理由で足止めされることはもうありません!

この記事では、最も人気のあるデータベースを起動するための 1 行コマンドを紹介します。対象データベースは以下の通りです:

PostgreSQL icon Postgres

MongoDB icon MongoDB

MySQL icon MySQL

Elastic icon ElasticSearch

注記: これらのコマンドはローカル開発用のショートカットとして記述されています。実運用に流用する場合は、認証、シークレット管理、バックアップ、ネットワークポリシー、イメージの固定、アップグレード計画を必ず追加してください。

上級 Docker ユーザー: docker-compose に慣れている場合は、以下のシェルコマンドを docker-compose.yml 用に変換すると良いでしょう。

Postgres Server

コンテナを起動し、名前を pg-localhost にします

Terminal window
#Store db files on a local path, outside the container
mkdir -p $HOME/.postgres-data
docker run \
--name pg-localhost \
-p 127.0.0.1:5432:5432 \
-e POSTGRES_PASSWORD=password \
--restart unless-stopped \
-it \
--shm-size=256mb \
postgres:16-alpine \
postgres -c 'listen_addresses=*' \
-c 'password_encryption=scram-sha-256' \
-c 'shared_memory_type=sysv' \
-c 'shared_buffers=256MB' \
-c 'max_connections=200'

必要に応じてコマンドラインオプションを調整してください。(postgres:16-alpine イメージ名の後に続くのが postgres デーモンの引数です。postgres -c 'listen_addresses=*'... を参照)

postgres ユーザーで psql プロンプトにアクセスする

Terminal window
docker exec --user postgres -it pg-localhost psql

コンテナのシェルに root で入る

Terminal window
docker exec -it pg-localhost bash

注記: 上記コマンドは公式の Alpine Linux ベースイメージを使用しています。通常の Debian 環境とは異なります。

Debian/Ubuntu ベースイメージを使用したい場合は、postgres:12-alpinepostgres:12 に置き換えてください。

MongoDB Server

Terminal window
mkdir -p $HOME/.mongodb/data
docker run -d \
--name mongodb \
--restart on-failure:5 \
-p 127.0.0.1:27017:27017 \
-v $HOME/.mongodb:/data \
mongo:7 \
bash -c 'mongod --bind_ip 0.0.0.0'

サーバーが起動したら、データが $HOME/.mongodb にあることを確認します:

Terminal window
ls -lach $HOME/.mongodb

mongosh CLI ツールでサーバーに接続してみましょう。(インストールしていない場合は下記を参照してください。)

Terminal window
#> デフォルト引数で実行:
mongosh

以下のような出力が表示されるはずです:

mongoシェル出力のプレビュー

Mongo CLI ツールのセットアップ

brew と macOS の使用方法
Terminal window
brew tap mongodb/brew
brew install mongodb-community-shell

Mysql Server

WARNING: 以下の MYSQL_ROOT_PASSWORD のパスワードは必ず変更してください。

Terminal window
mkdir -p $HOME/.mysql
docker run -d \
-v $HOME/.mysql:/var/lib/mysql \
-p 127.0.0.1:3306:3306 \
--name mysql-$USER \
-e MYSQL_DATABASE=$USER \
-e MYSQL_ROOT_HOST='172.*.*.*' \
-e MYSQL_ROOT_PASSWORD='p@ssw0rd' \
mysql/mysql-server:8

ElasticSearch Server

Terminal window
mkdir -p $HOME/.elastic
docker run -d \
--name elastic \
-p 127.0.0.1:9200:9200 \
-p 127.0.0.1:9300:9300 \
-v $HOME/.elastic:/data \
docker.elastic.co/elasticsearch/elasticsearch:8.15.5 bash -c 'elasticsearch --cluster.name elastic_cluster --node.name elastic01 --path.data /data/elastic-data --path.logs /data/elastic-logs '
Security Notes

NOTE: -p 127.0.0.1:27017:27017 のようにローカル IP アドレスを指定したポートオプションは、Docker サーバーの localhost ネットワーク以外からのアクセスをブロックします。
公開ポートにしたい場合はローカル IP プレフィックスを外し、-p 27017:27017 のように指定してください。必要なセキュリティ対策を必ず実施してください。

Recommended: 常にポートスキャンツール(例: nmap、masscan)を使い、別ネットワーク上の別システムからネットワーク設定を検証することを推奨します。

データベースサーバーを起動するコマンドが揃ったので、次はアプリケーションを Docker イメージとしてパッケージ化します。パート 2は以下に続きます。

NodeJS Web アプリのパッケージング

  1. プロジェクトのルートに空ファイル Dockerfile を作成します。
  2. (任意・推奨) .dockerignore.gitignore と同様のルールで作成し、サイズの大きい不要なパスを除外します。デフォルトではすべてのプロジェクトファイルが含まれます。

アプリのルートに Dockerfile を作成

# Example for NodeJS
FROM node:22
EXPOSE 3000
COPY . /app/
WORKDIR /app
RUN apt-get update && apt-get dist-upgrade -yqq
RUN ["npm", "install"]
# Overridable Command
CMD ["npm", "start"]

Dockerfile の使い方を示し、コンソール上で結果を確認する方が分かりやすいです(以下のコマンド参照)。

ターミナルでプロジェクトフォルダへ cd し、変更をデプロイするたび、または OS や環境設定を変更・アップグレードしたいときは、次の build コマンドを 必ず 実行してください。

Terminal window
docker build -t app-name-here .

主要な Docker コマンドリファレンス

Docker イメージのビルド

Terminal window
docker build -t app-name-here .

DB サーバーへのリンク付き Web アプリの作成/実行

Terminal window
docker network create app-local
docker network connect app-local mongodb
docker network connect app-local elastic
docker run -d --name webapp01 --network app-local -p 3000:3000 app-name-here

インタラクティブに実行(デーモン化せず、ターミナル上)

Terminal window
docker run -it --name webapp01 --network app-local -p 3000:3000 app-name-here bash

コンテナインスタンスまたはイメージの削除

重要: マウントされたボリュームパスに保存されていないデータはすべて失われます!!

Terminal window
# イメージの削除
docker rmi -f app-name-here
docker rm -f webapp01
# ここから上の `docker run...` を再実行してください
# 例として、上記の DB インスタンスを停止するには、次のように実行します(`docker stop {mongo,elastic}` などで開始):
docker rm -f mongo elastic