🐳

3年前に使っていたDocker ComposeとLinuxサービスファイルの備忘録

に公開

✅ はじめに

本記事では、3年前の開発環境で実際に使用していた Docker Compose 設定と、
Linux上でコンテナを自動起動する systemd のサービス定義を備忘録として残します。

使用目的は、SQL Server(MSSQL)コンテナを構成し、定期的に稼働させる開発用途です。

  • OS:Ubuntu 20.04 LTS
  • Docker:20.x 系(Docker Compose CLI)
  • コンテナ:SQL Server 2022 on Linux(Microsoft公式)

✅ ディレクトリ構成(例)

project-root/
├── docker-compose.yml
├── .env
└── container-sqlserver.service

✅ .envファイル(Docker Compose用)

Docker Composeに渡す環境変数群です。パスワードや構成パラメータを分離管理していました。
以下の内容は当時(3年前)の設定です。
必要に応じて、現在のバージョンや環境に合わせて読み替えてください。

# Dockerイメージとタグ
REPOSITORY_DB=mcr.microsoft.com/mssql/server
TAG_DB=2022-RTM-CU2-ubuntu-20.04

# コンテナ名とポート設定
NAME_DB=sqlserver2022
IN_PORT_DB=1433
EX_PORT_DB=1433

# データパスとDB構成
DATA_DIR_APP=/datadrive/data/mssql
ENV_DB_SA_PASSWORD=yourStrong(!)Password

# タイムゾーンの設定
ENV_DB_TZ=Asia/Tokyo

# SQL Serverエディションの指定(以下から選択)
# {Developer|Express|Standard|Enterprise|EnterpriseCore}
ENV_DB_MSSQL_PID=Developer

# 言語ID(LCID)の指定:1041=日本語
ENV_DB_MSSQL_LCID=1041

# 照合順序(COLLATION)
ENV_DB_MSSQL_COLLATION=Japanese_BIN

# メモリ制限(MB単位)
ENV_DB_MSSQL_MEMORY_LIMIT_MB=2048

# SQL Server Agent有効化設定:{true|false}
ENV_DB_MSSQL_AGENT_ENABLED=false

# ログ設定
LOG_DRIVER=json-file
LOG_MAX_SIZE=10
LOG_MAX_FILE=1

☑️ .envファイルには機微情報(例:パスワード)が含まれるため、
バージョン管理では除外すべきです。


✅ docker-compose.yml(SQL Server構成)

version: "3.9"
services:
  db:
    container_name: ${NAME_DB}
    image: "${REPOSITORY_DB}:${TAG_DB}"
    ports:
      - "${EX_PORT_DB}:${IN_PORT_DB}"
    environment:
      ACCEPT_EULA: "Y"
      MSSQL_SA_PASSWORD: ${ENV_DB_SA_PASSWORD}
      TZ: ${ENV_DB_TZ}
      MSSQL_PID: ${ENV_DB_MSSQL_PID}
      MSSQL_LCID: ${ENV_DB_MSSQL_LCID}
      MSSQL_COLLATION: ${ENV_DB_MSSQL_COLLATION}
      MSSQL_MEMORY_LIMIT_MB: ${ENV_DB_MSSQL_MEMORY_LIMIT_MB}
      MSSQL_AGENT_ENABLED: ${ENV_DB_MSSQL_AGENT_ENABLED}
    volumes:
      - ${DATA_DIR_APP}:/var/opt/mssql
    logging:
      driver: ${LOG_DRIVER}
      options:
        max-size: "${LOG_MAX_SIZE}m"
        max-file: "${LOG_MAX_FILE}"

✅ 補足

  • restart: は記述していません。
    systemdでコンテナを管理しているため、Compose側の再起動ポリシーは不要です。
  • logging.options ではログの肥大化を防ぐため、最大サイズと履歴数を制限しています。

✅ systemdサービスファイル(自動起動設定)

Linuxの systemctl により、docker-compose up をバックグラウンドで実行します。

[Unit]
Description=SQL Server container using Docker Compose
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/docker/sqlserver/
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down

[Install]
WantedBy=multi-user.target

🧩 初期登録・起動の手順(systemctl linkを使う場合)

# ① systemdリンクを貼る(.serviceファイルを/etcにコピーせず登録)
sudo systemctl link /opt/docker/sqlserver/container-sqlserver.service

# ② サービスを有効にする
sudo systemctl enable /opt/docker/sqlserver/container-sqlserver.service

# ③ サービスを起動する
sudo systemctl start container-sqlserver.service

📝 補足:Ubuntuバージョンに関する注意

  • systemctl link は、.service ファイルを /etc/systemd/system にコピーせずに systemd に認識させる方法です。
  • Ubuntu 16.04 以降(systemd 採用以降)であれば基本的に使用可能とされていますが、環境やカスタム設定によって動作に差異がある場合があります
  • 一部の環境では link が期待通り動作せず、明示的なコピー(下記)を選択する方が確実な場合もあります。

🧭 従来の登録方法

(ファイルを /etc/systemd/system/ にコピー)

sudo cp container-sqlserver.service /etc/systemd/system/
sudo systemctl daemon-reload  # ユニットファイル変更後に必要
sudo systemctl enable container-sqlserver.service
sudo systemctl start container-sqlserver.service

☑️ 確実性を重視する場合は、従来の「コピー方式」が推奨されます。


✅ まとめと教訓

  • .env による構成管理で再利用性と可搬性を向上
  • docker-compose.yml では logging.options を明示し、ログ肥大化を予防
  • restart: 記述は systemd 管理下では不要
  • systemd に登録することで、OS再起動後もコンテナ環境を復元

Discussion